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)