34 #ifndef CARTOBASE_CONTAINER_NDITERATOR_H 
   35 #define CARTOBASE_CONTAINER_NDITERATOR_H 
   55                      const std::vector<int> & strides );
 
   57                      const std::vector<size_t> & strides );
 
   59                      const std::vector<long> & strides );
 
   61     const std::vector<int> & 
position() 
const;
 
   71     static std::vector<size_t> 
to_int_v( 
const std::vector<T> & v );
 
   86                           const std::vector<int> & strides,
 
   87                           bool optimize_direction = 
false );
 
   89                           const std::vector<size_t> & strides,
 
   90                           bool optimize_direction = 
false );
 
   92                           const std::vector<long> & strides,
 
   93                           bool optimize_direction = 
false );
 
  136     NDIterator( T* buffer, 
const std::vector<int> & dims );
 
  137     NDIterator( T* buffer, 
const std::vector<int> & dims,
 
  138                 const std::vector<int> & strides );
 
  139     NDIterator( T*buffer, 
const std::vector<int> & dims,
 
  140                 const std::vector<size_t> & strides );
 
  141     NDIterator( T* buffer, 
const std::vector<int> & dims,
 
  142                 const std::vector<long> & strides );
 
  159                       const std::vector<int> & strides );
 
  161                       const std::vector<size_t> & strides );
 
  163                       const std::vector<long> & strides );
 
  210                      const std::vector<int> & strides,
 
  211                      bool optimize_direction = 
false );
 
  213                      const std::vector<size_t> & strides,
 
  214                      bool optimize_direction = 
false );
 
  216                      const std::vector<long> & strides,
 
  217                      bool optimize_direction = 
false );
 
  246                            const std::vector<int> & strides,
 
  247                            bool optimize_direction = 
false );
 
  249                            const std::vector<size_t> & strides,
 
  250                            bool optimize_direction = 
false );
 
  252                            const std::vector<long> & strides,
 
  253                            bool optimize_direction = 
false );
 
  271     : _dims( dims ), _position( dims.size(), 0 ), _offset( 0 ), _ended( false )
 
  279     const std::vector<int> & strides )
 
  281       _position( dims.size(), 0 ),
 
  282       _offset( 0 ), _ended( false )
 
  290     const std::vector<size_t> & strides )
 
  291     : _dims( dims ), _strides( strides ), _position( dims.size(), 0 ),
 
  292       _offset( 0 ), _ended( false )
 
  300     const std::vector<long> & strides )
 
  302       _position( dims.size(), 0 ),
 
  303       _offset( 0 ), _ended( false )
 
  335   template <
typename T> 
inline 
  338     std::vector<size_t> ov( v.size() );
 
  339     std::vector<size_t>::iterator io = ov.begin();
 
  340     typename std::vector<T>::const_iterator i, e = v.end();
 
  341     for( i=v.begin(); i!=e; ++i, ++io )
 
  349     size_t dim, ndim = 
_dims.size();
 
  350     bool nextrow = 
true, stride = !
_strides.empty();
 
  351     for( dim=0; nextrow && dim<ndim; ++dim )
 
  360           if( dim == ndim - 1 )
 
  376     const std::vector<int> & dims )
 
  380     if( dims.size() < 2 )
 
  386     const std::vector<int> & dims, 
const std::vector<int> & strides,
 
  387     bool optimize_direction )
 
  388     : 
NDIterator_base( dims, strides ), _line_directon( 0 ), _line_stride( 1 ),
 
  391     if( dims.size() < 2 )
 
  398     const std::vector<int> & dims, 
const std::vector<size_t> & strides,
 
  399     bool optimize_direction )
 
  400     : 
NDIterator_base( dims, strides ), _line_directon( 0 ), _line_stride( 1 ),
 
  403     if( dims.size() < 2 )
 
  410     const std::vector<int> & dims, 
const std::vector<long> & strides,
 
  411     bool optimize_direction )
 
  412     : 
NDIterator_base( dims, strides ), _line_directon( 0 ), _line_stride( 1 ),
 
  415     if( dims.size() < 2 )
 
  422     bool optimize_direction )
 
  427       if( optimize_direction )
 
  430         for( dim=0; dim<ndim; ++dim )
 
  466     size_t dim, ndim = 
_dims.size();
 
  467     bool nextrow = 
true, stride = !
_strides.empty();
 
  468     for( dim=0; nextrow && dim<ndim; ++dim )
 
  492   template <
typename T> 
inline 
  499   template <
typename T> 
inline 
  501                              const std::vector<int> & strides )
 
  507   template <
typename T> 
inline 
  509                              const std::vector<size_t> & strides )
 
  515   template <
typename T> 
inline 
  517                              const std::vector<long> & strides )
 
  525     return _buffer[ _offset ];
 
  530     return _buffer + _offset;
 
  535   template <
typename T>  
inline 
  537     const T* buffer, 
const std::vector<int> & dims )
 
  543   template <
typename T> 
inline 
  545     const T* buffer, 
const std::vector<int> & dims,
 
  546     const std::vector<int> & strides )
 
  552   template <
typename T> 
inline 
  554     const T* buffer, 
const std::vector<int> & dims,
 
  555     const std::vector<long> & strides )
 
  561   template <
typename T> 
inline 
  563     const T* buffer, 
const std::vector<int> & dims,
 
  564     const std::vector<size_t> & strides )
 
  570   template <
typename T> 
const inline T &
 
  573     return _buffer[ _offset ];
 
  576   template <
typename T> 
const inline T *
 
  579     return _buffer + _offset;
 
  584   template <
typename T> 
inline 
  586     T* buffer, 
const std::vector<int> & dims )
 
  592   template <
typename T> 
inline 
  594                                        const std::vector<int> & dims,
 
  595                                        const std::vector<int> & strides,
 
  596                                        bool optimize_direction )
 
  603   template <
typename T> 
inline 
  605                                        const std::vector<int> & dims,
 
  606                                        const std::vector<size_t> & strides,
 
  607                                        bool optimize_direction )
 
  614   template <
typename T> 
inline 
  616                                        const std::vector<int> & dims,
 
  617                                        const std::vector<long> & strides,
 
  618                                        bool optimize_direction )
 
  627     return _buffer[ _offset ];
 
  633     return _buffer + _offset;
 
  637   template <
typename T> 
inline 
  647   template <
typename T> 
inline 
  657   template <
typename T> 
inline 
  660     if( is_contiguous() )
 
  663       return line_size() * _strides[_line_directon];
 
  668   template <
typename T> 
inline 
  670     const T* buffer, 
const std::vector<int> & dims )
 
  676   template <
typename T> 
inline 
  678     const T* buffer, 
const std::vector<int> & dims,
 
  679     const std::vector<int> & strides, 
bool optimize_direction )
 
  686   template <
typename T> 
inline 
  688     const T* buffer, 
const std::vector<int> & dims,
 
  689     const std::vector<size_t> & strides, 
bool optimize_direction )
 
  696   template <
typename T> 
inline 
  698     const T* buffer, 
const std::vector<int> & dims,
 
  699     const std::vector<long> & strides, 
bool optimize_direction )
 
  706   template <
typename T> 
inline const T &
 
  709     return _buffer[ _offset ];
 
  713   template <
typename T> 
inline const T *
 
  716     return _buffer + _offset;
 
  720   template <
typename T> 
inline 
  730   template <
typename T> 
inline 
  733     if( is_contiguous() )
 
  736       return line_size() * _strides[_line_directon];
 
Base class for N-dimensional array iterators.
NDIterator_base(const std::vector< int > &dims)
const std::vector< int > & position() const
static std::vector< size_t > to_int_v(const std::vector< T > &v)
std::vector< size_t > _strides
NDIterator_base & operator++()
std::vector< int > _position
N-dimensional array iterator.
NDIterator(T *buffer, const std::vector< int > &dims)
const variant of the NDIterator
const_NDIterator(const T *buffer, const std::vector< int > &dims)
const T & operator*() const
const T * operator->() const
const variant of the line_NDIterator
const T & operator*() const
long line_length() const
line_size * line stride: end of line
const_line_NDIterator(const T *buffer, const std::vector< int > &dims)
void inc_line_ptr(const T *&p) const
increment a "line" pointer (advancing through the line)
const T * operator->() const
int line_direction() const
line_NDIterator_base(const std::vector< int > &dims)
void set_optimized_direction(bool optimize_direction=false)
NDIterator_base & operator++()
bool is_contiguous() const
N-dimensional array line iterator.
long line_length() const
line_size * line stride: end of line
line_NDIterator(T *buffer, const std::vector< int > &dims)
void inc_line_ptr(T *&p) const
increment a "line" pointer (advancing through the line)