14#ifndef GDALCOMPUTEDRASTERBAND_H_INCLUDED
15#define GDALCOMPUTEDRASTERBAND_H_INCLUDED
18#include "gdal_dataset.h"
19#include "gdal_rasterband.h"
72 Operation op,
const std::vector<const GDALRasterBand *> &bands,
73 double constant = std::numeric_limits<double>::quiet_NaN());
114 int nYSize,
void *pData,
int nBufXSize,
int nBufYSize,
120 friend class GDALComputedDataset;
121 std::unique_ptr<GDALDataset, GDALDatasetUniquePtrReleaser> m_poOwningDS{};
122 bool m_bHasNoData{
false};
123 double m_dfNoDataValue{0};
171 double thenValue,
double elseValue);
186template <
typename U,
typename Enable>
struct minDealFirstArg;
189struct minDealFirstArg<
190 U, typename std::enable_if<std::is_arithmetic<U>::value>::type>
192 inline static void process(std::vector<const GDALRasterBand *> &,
193 double &constant,
const U &first)
195 if (std::isnan(constant) ||
static_cast<double>(first) < constant)
196 constant =
static_cast<double>(first);
201struct minDealFirstArg<
202 U, typename std::enable_if<!std::is_arithmetic<U>::value>::type>
204 inline static void process(std::vector<const GDALRasterBand *> &bands,
205 double &,
const U &first)
208 GDALRasterBand::ThrowIfNotSameDimensions(first, *(bands.front()));
209 bands.push_back(&first);
214minInternal(std::vector<const GDALRasterBand *> &bands,
double constant)
220template <
typename U,
typename... V>
222 double constant,
const U &first, V &&...rest)
224 minDealFirstArg<U, void>::process(bands, constant, first);
225 return minInternal(bands, constant, std::forward<V>(rest)...);
230template <
typename U,
typename... V>
233 std::vector<const GDALRasterBand *> bands;
234 return detail::minInternal(bands, std::numeric_limits<double>::quiet_NaN(),
235 first, std::forward<V>(rest)...);
248template <
typename U,
typename Enable>
struct maxDealFirstArg;
251struct maxDealFirstArg<
252 U, typename std::enable_if<std::is_arithmetic<U>::value>::type>
254 inline static void process(std::vector<const GDALRasterBand *> &,
255 double &constant,
const U &first)
257 if (std::isnan(constant) ||
static_cast<double>(first) > constant)
258 constant =
static_cast<double>(first);
263struct maxDealFirstArg<
264 U, typename std::enable_if<!std::is_arithmetic<U>::value>::type>
266 inline static void process(std::vector<const GDALRasterBand *> &bands,
267 double &,
const U &first)
270 GDALRasterBand::ThrowIfNotSameDimensions(first, *(bands.front()));
271 bands.push_back(&first);
276maxInternal(std::vector<const GDALRasterBand *> &bands,
double constant)
282template <
typename U,
typename... V>
284 double constant,
const U &first, V &&...rest)
286 maxDealFirstArg<U, void>::process(bands, constant, first);
287 return maxInternal(bands, constant, std::forward<V>(rest)...);
292template <
typename U,
typename... V>
295 std::vector<const GDALRasterBand *> bands;
296 return detail::maxInternal(bands, std::numeric_limits<double>::quiet_NaN(),
297 first, std::forward<V>(rest)...);
307meanInternal(std::vector<const GDALRasterBand *> &bands)
313template <
typename U,
typename... V>
315meanInternal(std::vector<const GDALRasterBand *> &bands,
const U &first,
319 GDALRasterBand::ThrowIfNotSameDimensions(first, *(bands.front()));
320 bands.push_back(&first);
321 return meanInternal(bands, std::forward<V>(rest)...);
326 std::vector<const GDALRasterBand *> bands;
327 return meanInternal(bands, std::forward<Args>(args)...);
Class represented the result of an operation on one or two input bands.
Definition gdal_computedrasterband.h:39
static GDALComputedRasterBand * FromHandle(GDALComputedRasterBandH hBand)
Convert a GDALComputedRasterBandH to a GDALComputedRasterBand*.
Definition gdal_computedrasterband.h:103
static GDALComputedRasterBandH ToHandle(GDALComputedRasterBand *poBand)
Convert a GDALComputedRasterBand* to a GDALComputedRasterBandH.
Definition gdal_computedrasterband.h:95
GDALMajorObject & operator=(const GDALMajorObject &)=default
Copy assignment operator.
A single raster band (or channel).
Definition gdal_rasterband.h:105
virtual CPLErr IReadBlock(int nBlockXOff, int nBlockYOff, void *pData)=0
Default internal implementation ... to be overridden by subclasses that support reading.
virtual CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize, void *pData, int nBufXSize, int nBufYSize, GDALDataType eBufType, GSpacing nPixelSpace, GSpacing nLineSpace, GDALRasterIOExtraArg *psExtraArg)
Read/write a region of image data for this band.
Definition rasterio.cpp:223
virtual double GetNoDataValue(int *pbSuccess=nullptr)
Fetch the no data value for this band.
Definition gdalrasterband.cpp:2347
CPLErr
Error category.
Definition cpl_error.h:37
Core portability definitions for CPL.
GIntBig GSpacing
Type to express pixel, line or band spacing.
Definition gdal.h:386
GDALDataType
Definition gdal.h:48
GDALRWFlag
Definition gdal.h:125
void * GDALComputedRasterBandH
Opaque type used for the C bindings of the C++ GDALComputedRasterBand class.
Definition gdal_fwd.h:48