1 #ifndef MHO_NDArrayMath_HH__
2 #define MHO_NDArrayMath_HH__
32 static std::size_t
Modulus(std::size_t arg, std::size_t n) {
return arg % n; }
45 template< std::
size_t RANK >
48 std::size_t val = Index[0];
49 for(std::size_t i = 1; i < RANK; i++)
68 template< std::
size_t RANK >
72 for(std::size_t i = 0; i < RANK; i++)
74 val += Index[i] * Strides[i];
91 template< std::
size_t RANK >
95 for(std::size_t i = 0; i < RANK; i++)
116 template< std::
size_t RANK >
119 std::size_t div[RANK];
123 for(std::size_t d = 0; d < RANK; d++)
130 div[i] = (offset - Index[i]) / DimSize[i];
135 div[i] = (div[i + 1] - Index[i]) / DimSize[i];
149 template< std::
size_t RANK >
inline static bool CheckIndexValidity(
const std::size_t* DimSize,
const std::size_t* Index)
151 for(std::size_t i = 0; i < RANK; i++)
153 if(Index[i] >= DimSize[i])
169 template< std::
size_t RANK >
inline static std::size_t
TotalArraySize(
const std::size_t* DimSize)
172 for(std::size_t i = 0; i < RANK; i++)
193 template<
int numerator,
int denominator >
struct Divide
209 template< std::
size_t RANK >
212 std::size_t total_array_size = MHO_NDArrayMath::TotalArraySize< RANK >(DimSize);
213 std::size_t index[RANK];
214 for(std::size_t i = 0; i < total_array_size; i++)
216 MHO_NDArrayMath::RowMajorIndexFromOffset< RANK >(i, DimSize, index);
217 for(std::size_t j = 0; j < RANK; j++)
219 index[j] = (DimSize[j] - index[j]) % DimSize[j];
221 ReversedIndex[i] = MHO_NDArrayMath::OffsetFromRowMajorIndex< RANK >(DimSize, index);
233 template< std::
size_t RANK >
static bool IncrementIndices(
const std::size_t* DimSize, std::size_t* Index)
235 for(std::size_t i = 1; i <= RANK; i++)
237 if(++Index[RANK - i] < DimSize[RANK - i])
260 template< std::
size_t RANK >
261 static bool IncrementIndices(
const std::size_t* DimSize, std::size_t* Index, std::size_t diff)
263 std::size_t offset = OffsetFromRowMajorIndex< RANK >(DimSize, Index);
265 if(offset < TotalArraySize< RANK >(DimSize))
267 RowMajorIndexFromOffset< RANK >(offset, DimSize, Index);
282 template< std::
size_t RANK >
static bool DecrementIndices(
const std::size_t* DimSize, std::size_t* Index)
284 for(std::size_t i = 1; i <= RANK; i++)
286 if(Index[RANK - i] > 0)
293 Index[RANK - i] = DimSize[RANK - i] - 1;
310 template< std::
size_t RANK >
311 static bool DecrementIndices(
const std::size_t* DimSize, std::size_t* Index, std::size_t diff)
313 std::size_t offset = OffsetFromRowMajorIndex< RANK >(DimSize, Index);
317 RowMajorIndexFromOffset< RANK >(offset, DimSize, Index);
utility functions for multidimensional array access
Definition: MHO_NDArrayMath.hh:19
static bool DecrementIndices(const std::size_t *DimSize, std::size_t *Index)
Decrements indices in a multidimensional by one, array using row major indexing.
Definition: MHO_NDArrayMath.hh:282
static std::size_t Modulus(std::size_t arg, std::size_t n)
Calculates the modulus of two integers.
Definition: MHO_NDArrayMath.hh:32
static void RowMajorIndexFromOffset(std::size_t offset, const std::size_t *DimSize, std::size_t *Index)
Function RowMajorIndexFromOffset.
Definition: MHO_NDArrayMath.hh:117
static bool CheckIndexValidity(const std::size_t *DimSize, const std::size_t *Index)
Checks if all indices in Index are within valid range for a multidimensional array.
Definition: MHO_NDArrayMath.hh:149
MHO_NDArrayMath()
Definition: MHO_NDArrayMath.hh:21
static std::size_t StrideFromRowMajorIndex(std::size_t selected_dim, const std::size_t *DimSize)
Calculates stride for a given dimension in a row-major indexed multidimensional array.
Definition: MHO_NDArrayMath.hh:92
static bool IncrementIndices(const std::size_t *DimSize, std::size_t *Index)
Increment multi-dimensional indices by one in row-major order, accounting for roll-over.
Definition: MHO_NDArrayMath.hh:233
static std::size_t OffsetFromRowMajorIndex(const std::size_t *DimSize, const std::size_t *Index)
Calculates offset into a multidimensional array using row-major indexing.
Definition: MHO_NDArrayMath.hh:46
static void OffsetsForReversedIndices(const std::size_t *DimSize, std::size_t *ReversedIndex)
Calculates reversed indices offsets for the given dimensions.
Definition: MHO_NDArrayMath.hh:210
static std::size_t OffsetFromStrideIndex(const std::size_t *Strides, const std::size_t *Index)
Calculates offset for a given index into a multidimensional array using row-major indexing/strides.
Definition: MHO_NDArrayMath.hh:69
static bool DecrementIndices(const std::size_t *DimSize, std::size_t *Index, std::size_t diff)
Decrements indices in a multidimensional array by amount specified in diff, or until an underflow is ...
Definition: MHO_NDArrayMath.hh:311
virtual ~MHO_NDArrayMath()
Definition: MHO_NDArrayMath.hh:22
static bool IncrementIndices(const std::size_t *DimSize, std::size_t *Index, std::size_t diff)
Increment multi-dimensional indices by the amount in diff (accounting for roll-over) and return true ...
Definition: MHO_NDArrayMath.hh:261
static std::size_t TotalArraySize(const std::size_t *DimSize)
Calculates total size of an array given its dimensions.
Definition: MHO_NDArrayMath.hh:169
Definition: MHO_AdhocFlagging.hh:18
enum Divide - compute integer division at compile time
Definition: MHO_NDArrayMath.hh:194
enum PowerOfTwo - compute 2^N at compile time
Definition: MHO_NDArrayMath.hh:183