LTL  2.0.x
Public Types | Public Member Functions | Protected Attributes | List of all members
ltl::MArrayIter< T, N > Class Template Reference

Inherits ltl::MArrayIterConst< T, N >.

Public Types

enum  { dims =N }
 These define constants that are used by the expression template engine. More...
 
enum  { numIndexIter = 0 }
 
enum  { numConvolution = 0 }
 
enum  { isVectorizable = 1 }
 
typedef std::forward_iterator_tag iterator_category
 std::iterator typedefs More...
 
typedef int difference_type
 
typedef MArray< T, N >::value_type value_type
 
typedef MArray< T, N >
::const_reference 
const_reference
 
typedef MArray< T, N >
::const_pointer 
const_pointer
 
typedef MArray< T, N >::reference reference
 
typedef MArray< T, N >::pointer pointer
 

Public Member Functions

 MArrayIter (MArray< T, N > &array)
 
 MArrayIter (MArray< T, N > &array, const _iter_end_tag &E)
 
 MArrayIter (const MArrayIter< T, N > &other)
 
MArrayIter< T, N > & operator++ ()
 Move the iterator to the next object. More...
 
T & operator* ()
 Dereference the iterator object. Return the element pointed to. More...
 
void reset ()
 Reset the iterator back to the first element. More...
 
value_type operator* () const
 Dereference the iterator object. Return the element pointed to. More...
 
void operator++ (int)
 Postfix operator++(). More...
 
bool operator== (const MArrayIterConst< T, N > &other) const
 true if iterators share the same data pointer More...
 
bool operator!= (const MArrayIterConst< T, N > &other) const
 true if iterators do not share the same data pointer More...
 
bool done () const
 True if we point past the end, i.e. we are equal to the end iterator. More...
 
bool isConformable (const Shape< N > &other) const
 true if we have the same array geometry as that of other, More...
 
void printRanges () const
 Pretty print the geometry. More...
 
const Shape< N > * shape () const
 Return our shape. More...
 
bool isStorageContiguous () const
 true if the memory we are pointing to has contiguous memory layout. More...
 
bool isStride1 () const
 true if our innermost stride is 1 More...
 
value_typedata () const
 Return the current data pointer. More...
 
void advance ()
 Provide separate versions of advance() for incrementing the innermost. More...
 
void advance (int n)
 Unconditionally increase the data pointer by N innermost strides. More...
 
void advance (int n, int dim)
 Unconditionally increase the data pointer by N along dimension dim (used for partial reductions). More...
 
void advanceWithStride1 ()
 Unconditionally increase the data pointer by one. More...
 
bool needAdvanceDim () const
 Check if we have reached the end of the innermost dimension. More...
 
void advanceDim ()
 Advance the iterator past the end of one "line" (the end of the innermost dimension). More...
 
void advanceDim (const int cutDim)
 Advance the iterator past the end of one "line", ignoring the dimension cutDim (used in partial reductions). More...
 
value_type readWithoutStride (const int i) const
 Read the data value at the current location + i (optimized for stride 1). More...
 
value_type readWithStride (const int i) const
 Read the current data value at the current location + i*stride. More...
 
value_type readWithStride (const int i, const int dim) const
 Read the data value at position i along dimension dim (used in partial reductions) More...
 
value_type readAtOffsetDim (const int i, const int dim) const
 Read the data value at offset i along dim dim (used in convolutions) More...
 
value_type readAtOffset (const int i) const
 Read the data value at offset i along dim 1 (used in convolutions) More...
 
value_type readAtOffset (const int i, const int j) const
 Read the data value at offset i along dim 1 and j along dim 2 (used in convolutions) More...
 
value_type readAtOffset (const int i, const int j, const int k) const
 Read the data value at offset i along dim 1, j along dim 2, and k along dim 3 (used in convolutions) More...
 
int boundary_l (const int dim) const
 leave boundary around the lower edges of the array (for convolutions) More...
 
int boundary_u (const int dim) const
 leave boundary around the upper edges of the array (for convolutions) More...
 

Protected Attributes

value_type *restrict_ data_
 
const MArray< T, N > * array_
 
value_typestack_ [N]
 
value_typelast_ [N]
 
int strides_ [N]
 
int length_ [N]
 
const int stride_
 

Detailed Description

template<class T, int N>
class ltl::MArrayIter< T, N >

Non-const iterator object for ltl::MArrays. Conforms to std::forward_iterator. The non-const version is implemented below by inheriting from ltl::ConstIterator.

Constructor & Destructor Documentation

template<class T , int N>
ltl::MArrayIter< T, N >::MArrayIter ( MArray< T, N > &  array)
inline
template<class T , int N>
ltl::MArrayIter< T, N >::MArrayIter ( MArray< T, N > &  array,
const _iter_end_tag &  E 
)
inline
template<class T , int N>
ltl::MArrayIter< T, N >::MArrayIter ( const MArrayIter< T, N > &  other)
inline

Member Function Documentation

template<class T , int N>
MArrayIter<T,N>& ltl::MArrayIter< T, N >::operator++ ( )
inline

Move the iterator to the next object.

References ltl::MArrayIterConst< T, N >::operator++().

template<class T , int N>
T& ltl::MArrayIter< T, N >::operator* ( )
inline

Dereference the iterator object. Return the element pointed to.

References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::done().

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::reset ( )
inherited

Reset the iterator back to the first element.

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::operator* ( ) const
inlineinherited

Dereference the iterator object. Return the element pointed to.

References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::done().

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::operator++ ( int  )
inlineinherited

Postfix operator++().

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::advance ( )
inlineinherited

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.

Referenced by ltl::MArrayIterConst< T, N >::operator++().

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::advance ( int  n)
inlineinherited

Unconditionally increase the data pointer by N innermost strides.

References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::stride_.

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::advance ( int  n,
int  dim 
)
inlineinherited

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_.

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::advanceWithStride1 ( )
inlineinherited

Unconditionally increase the data pointer by one.

References ltl::MArrayIterConst< T, N >::data_.

template<typename T, int N>
bool ltl::MArrayIterConst< T, N >::needAdvanceDim ( ) const
inlineinherited

Check if we have reached the end of the innermost dimension.

References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::last_.

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::advanceDim ( )
inherited

Advance the iterator past the end of one "line" (the end of the innermost dimension).

Referenced by ltl::MArrayIterConst< T, N >::operator++().

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::advanceDim ( const int  cutDim)
inherited

Advance the iterator past the end of one "line", ignoring the dimension cutDim (used in partial reductions).

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::readWithoutStride ( const int  i) const
inlineinherited

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.

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::readWithStride ( const int  i) const
inlineinherited

Read the current data value at the current location + i*stride.

References ltl::MArrayIterConst< T, N >::data_, and ltl::MArrayIterConst< T, N >::stride_.

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::readWithStride ( const int  i,
const int  dim 
) const
inlineinherited

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_.

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::readAtOffsetDim ( const int  i,
const int  dim 
) const
inlineinherited

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_.

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::readAtOffset ( const int  i) const
inlineinherited

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_.

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::readAtOffset ( const int  i,
const int  j 
) const
inlineinherited

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_.

template<typename T, int N>
value_type ltl::MArrayIterConst< T, N >::readAtOffset ( const int  i,
const int  j,
const int  k 
) const
inlineinherited

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_.

template<typename T, int N>
int ltl::MArrayIterConst< T, N >::boundary_l ( const int  dim) const
inlineinherited

leave boundary around the lower edges of the array (for convolutions)

template<typename T, int N>
int ltl::MArrayIterConst< T, N >::boundary_u ( const int  dim) const
inlineinherited

leave boundary around the upper edges of the array (for convolutions)

template<typename T, int N>
bool ltl::MArrayIterConst< T, N >::operator== ( const MArrayIterConst< T, N > &  other) const
inlineinherited

true if iterators share the same data pointer

References ltl::MArrayIterConst< T, N >::data_.

template<typename T, int N>
bool ltl::MArrayIterConst< T, N >::operator!= ( const MArrayIterConst< T, N > &  other) const
inlineinherited

true if iterators do not share the same data pointer

References ltl::MArrayIterConst< T, N >::data_.

template<typename T, int N>
bool ltl::MArrayIterConst< T, N >::done ( ) const
inlineinherited
template<typename T, int N>
bool ltl::MArrayIterConst< T, N >::isConformable ( const Shape< N > &  other) const
inlineinherited

true if we have the same array geometry as that of other,

References ltl::MArrayIterConst< T, N >::shape().

template<typename T, int N>
void ltl::MArrayIterConst< T, N >::printRanges ( ) const
inherited

Pretty print the geometry.

template<typename T, int N>
const Shape<N>* ltl::MArrayIterConst< T, N >::shape ( ) const
inlineinherited
template<typename T, int N>
bool ltl::MArrayIterConst< T, N >::isStorageContiguous ( ) const
inlineinherited

true if the memory we are pointing to has contiguous memory layout.

References ltl::MArrayIterConst< T, N >::shape().

template<typename T, int N>
bool ltl::MArrayIterConst< T, N >::isStride1 ( ) const
inlineinherited

true if our innermost stride is 1

References ltl::MArrayIterConst< T, N >::stride_.

template<typename T, int N>
value_type* ltl::MArrayIterConst< T, N >::data ( ) const
inlineinherited

Return the current data pointer.

References ltl::MArrayIterConst< T, N >::data_.

Member Data Documentation

template<typename T, int N>
value_type* restrict_ ltl::MArrayIterConst< T, N >::data_
protectedinherited
template<typename T, int N>
const MArray<T,N>* ltl::MArrayIterConst< T, N >::array_
protectedinherited
template<typename T, int N>
value_type* ltl::MArrayIterConst< T, N >::stack_[N]
protectedinherited
template<typename T, int N>
value_type * ltl::MArrayIterConst< T, N >::last_[N]
protectedinherited
template<typename T, int N>
int ltl::MArrayIterConst< T, N >::strides_[N]
protectedinherited
template<typename T, int N>
int ltl::MArrayIterConst< T, N >::length_[N]
protectedinherited
template<typename T, int N>
const int ltl::MArrayIterConst< T, N >::stride_
protectedinherited