Inherits ltl::LTLIterator.
Inherited by ltl::MArrayIter< T, N >.
These define constants that are used by the expression template engine.
More...iterator
for a given ltl::MArray. This will rarely be called by a user. end-iterator
for a given ltl::MArray. This will rarely be called by a user. operator++()
. Const iterator object for ltl::MArrays. Conforms to std::forward_iterator. The non-const version is implemented below by inheriting from this class.
ltl::MArrayIterConst< T, N >::MArrayIterConst | ( | const MArray< T, N > & | array | ) |
Construct an iterator
for a given ltl::MArray. This will rarely be called by a user.
ltl::MArrayIterConst< T, N >::MArrayIterConst | ( | const MArray< T, N > & | array, | |
const _iter_end_tag & | E | |||
) | [inline] |
Construct an end-iterator
for a given ltl::MArray. This will rarely be called by a user.
References ltl::MArray< T, N >::data(), ltl::MArrayIterConst< T, N >::data_, ltl::MArrayIterConst< T, N >::last_, ltl::MArray< T, N >::nelements(), and ltl::MArrayIterConst< T, N >::stride_.
ltl::MArrayIterConst< T, N >::MArrayIterConst | ( | const MArrayIterConst< T, N > & | other | ) | [inline] |
copy constructor
References ltl::MArrayIterConst< T, N >::last_, ltl::MArrayIterConst< T, N >::length_, ltl::MArrayIterConst< T, N >::stack_, and ltl::MArrayIterConst< T, N >::strides_.
void ltl::MArrayIterConst< T, N >::reset | ( | ) |
Reset the iterator back to the first element.
value_type ltl::MArrayIterConst< T, N >::operator* | ( | ) | const [inline] |
Dereference the iterator object. Return the element pointed to.
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::done().
MArrayIterConst<T,N>& ltl::MArrayIterConst< T, N >::operator++ | ( | ) | [inline] |
Move the iterator to the next object.
This method will almost never be used. Instead, more efficient versions will be used by the expression template engine to move iterators forward.
This implementation of operator++()
will check for the end condition every time it is called. When we evaluate an expression, all iterators involved in the expression point to MArrays or expressions of the same geometry, so checking for the end condition on ONE of the iterators is enough. We also know the length of the dimension(s), so we can optimize the increment past the end of one dimension (where we have to reset this dimension and use a different stride to increment the next-outer dimension). See below and implementation of evaluation methods in ltl/marray/eval.h.
Reimplemented in ltl::MArrayIter< T, N >.
References ltl::MArrayIterConst< T, N >::advance(), ltl::MArrayIterConst< T, N >::advanceDim(), ltl::MArrayIterConst< T, N >::data_, ltl::MArrayIterConst< T, N >::done(), and ltl::MArrayIterConst< T, N >::last_.
void ltl::MArrayIterConst< T, N >::operator++ | ( | int | ) | [inline] |
Postfix operator++()
.
void ltl::MArrayIterConst< T, N >::advance | ( | ) | [inline] |
Provide separate versions of advance() for incrementing the innermost.
When evaluating an expression involving more than one iterator all terms MUST have the same geometry, the loop structures are identical. It's therefore sufficient to check the end of loop condition and the end of one dimension on one of the iterators ... All others are then 'remote controlled' via these methods methods. See implementation of evaluation methods in ltl/marray/eval.h. Unconditionally increase the data pointer by one innermost stride.
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::stride_.
Referenced by ltl::MArrayIterConst< T, N >::operator++().
void ltl::MArrayIterConst< T, N >::advance | ( | int | n | ) | [inline] |
Unconditionally increase the data pointer by N innermost strides.
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::stride_.
void ltl::MArrayIterConst< T, N >::advance | ( | int | n, | |
int | dim | |||
) | [inline] |
Unconditionally increase the data pointer by N along dimension dim (used for partial reductions).
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::strides_.
void ltl::MArrayIterConst< T, N >::advanceWithStride1 | ( | ) | [inline] |
Unconditionally increase the data pointer by one.
References ltl::MArrayIterConst< T, N >::data_.
bool ltl::MArrayIterConst< T, N >::needAdvanceDim | ( | ) | const [inline] |
Check if we have reached the end of the innermost dimension.
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::last_.
void ltl::MArrayIterConst< T, N >::advanceDim | ( | ) |
Advance the iterator past the end of one "line" (the end of the innermost dimension).
Referenced by ltl::MArrayIterConst< T, N >::operator++().
void ltl::MArrayIterConst< T, N >::advanceDim | ( | const int | cutDim | ) |
Advance the iterator past the end of one "line", ignoring the dimension cutDim (used in partial reductions).
value_type ltl::MArrayIterConst< T, N >::readWithoutStride | ( | const int | i | ) | const [inline] |
Read the data value at the current location + i (optimized for stride 1).
These methods are for implementing loop unrolling and vectorization for the efficient evaluation of expression templates.
References ltl::MArrayIterConst< T, N >::data_.
value_type ltl::MArrayIterConst< T, N >::readWithStride | ( | const int | i | ) | const [inline] |
Read the current data value at the current location + i*stride.
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::stride_.
value_type ltl::MArrayIterConst< T, N >::readWithStride | ( | const int | i, | |
const int | dim | |||
) | const [inline] |
Read the data value at position i along dimension dim (used in partial reductions).
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::strides_.
value_type ltl::MArrayIterConst< T, N >::readAtOffsetDim | ( | const int | i, | |
const int | dim | |||
) | const [inline] |
Read the data value at offset i along dim dim (used in convolutions).
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::strides_.
value_type ltl::MArrayIterConst< T, N >::readAtOffset | ( | const int | i | ) | const [inline] |
Read the data value at offset i along dim 1 (used in convolutions).
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::stride_.
value_type ltl::MArrayIterConst< T, N >::readAtOffset | ( | const int | i, | |
const int | j | |||
) | const [inline] |
Read the data value at offset i along dim 1 and j along dim 2 (used in convolutions).
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::strides_.
value_type ltl::MArrayIterConst< T, N >::readAtOffset | ( | const int | i, | |
const int | j, | |||
const int | k | |||
) | const [inline] |
Read the data value at offset i along dim 1, j along dim 2, and k along dim 3 (used in convolutions).
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::strides_.
int ltl::MArrayIterConst< T, N >::boundary_l | ( | const int | dim | ) | const [inline] |
leave boundary around the lower edges of the array (for convolutions)
int ltl::MArrayIterConst< T, N >::boundary_u | ( | const int | dim | ) | const [inline] |
leave boundary around the upper edges of the array (for convolutions)
bool ltl::MArrayIterConst< T, N >::operator== | ( | const MArrayIterConst< T, N > & | other | ) | const [inline] |
true
if iterators share the same data pointer
References ltl::MArrayIterConst< T, N >::data_.
bool ltl::MArrayIterConst< T, N >::operator!= | ( | const MArrayIterConst< T, N > & | other | ) | const [inline] |
true
if iterators do not share the same data pointer
References ltl::MArrayIterConst< T, N >::data_.
bool ltl::MArrayIterConst< T, N >::done | ( | ) | const [inline] |
True if we point past the end, i.e. we are equal to the end iterator.
References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::last_.
Referenced by ltl::average_clip_median(), ltl::PolynomFit< TPAR, TDAT, ORDER, EXT, 1 >::eval(), ltl::PolynomFit< TPAR, TDAT, ORDER, EXT, 1 >::fill(), ltl::median_clip_average(), ltl::MArrayIter< T, N >::operator*(), ltl::MArrayIterConst< T, N >::operator*(), ltl::MArrayIterConst< T, N >::operator++(), and ltl::MArray< T, N >::operator>>().
bool ltl::MArrayIterConst< T, N >::isConformable | ( | const Shape< N > & | other | ) | const [inline] |
true
if we have the same array geometry as that of other
,
References ltl::MArrayIterConst< T, N >::shape().
void ltl::MArrayIterConst< T, N >::printRanges | ( | ) | const |
Pretty print the geometry.
const Shape<N>* ltl::MArrayIterConst< T, N >::shape | ( | ) | const [inline] |
Return our shape
.
References ltl::MArrayIterConst< T, N >::array_.
Referenced by ltl::MArrayIterConst< T, N >::isConformable(), and ltl::MArrayIterConst< T, N >::isStorageContiguous().
bool ltl::MArrayIterConst< T, N >::isStorageContiguous | ( | ) | const [inline] |
true
if the memory we are pointing to has contiguous memory layout.
References ltl::MArrayIterConst< T, N >::shape().
bool ltl::MArrayIterConst< T, N >::isStride1 | ( | ) | const [inline] |
true
if our innermost stride is 1
References ltl::MArrayIterConst< T, N >::stride_.
value_type* ltl::MArrayIterConst< T, N >::data | ( | ) | const [inline] |
Return the current data pointer.
References ltl::MArrayIterConst< T, N >::data_.
value_type* restrict_ ltl::MArrayIterConst< T, N >::data_ [protected] |
Referenced by ltl::MArrayIterConst< T, N >::advance(), ltl::MArrayIterConst< T, N >::advanceWithStride1(), ltl::MArrayIterConst< T, N >::data(), ltl::MArrayIterConst< T, N >::done(), ltl::MArrayIterConst< T, N >::MArrayIterConst(), ltl::MArrayIterConst< T, N >::needAdvanceDim(), ltl::MArrayIterConst< T, N >::operator!=(), ltl::MArrayIter< T, N >::operator*(), ltl::MArrayIterConst< T, N >::operator*(), ltl::MArrayIterConst< T, N >::operator++(), ltl::MArrayIterConst< T, N >::operator==(), ltl::MArrayIterConst< T, N >::readAtOffset(), ltl::MArrayIterConst< T, N >::readAtOffsetDim(), ltl::MArrayIterConst< T, N >::readWithoutStride(), and ltl::MArrayIterConst< T, N >::readWithStride().
const MArray<T,N>* ltl::MArrayIterConst< T, N >::array_ [protected] |
Referenced by ltl::MArrayIterConst< T, N >::shape().
value_type* ltl::MArrayIterConst< T, N >::stack_[N] [protected] |
Referenced by ltl::MArrayIterConst< T, N >::MArrayIterConst().
value_type * ltl::MArrayIterConst< T, N >::last_[N] [protected] |
int ltl::MArrayIterConst< T, N >::strides_[N] [protected] |
int ltl::MArrayIterConst< T, N >::length_[N] [protected] |
Referenced by ltl::MArrayIterConst< T, N >::MArrayIterConst().
const int ltl::MArrayIterConst< T, N >::stride_ [protected] |