34#ifndef CARTOBASE_CONTAINER_NDITERATOR_H
35#define CARTOBASE_CONTAINER_NDITERATOR_H
56 const std::vector<int> & strides );
58 const std::vector<std::size_t> & strides );
60 const std::vector<std::ptrdiff_t> & strides );
62 const std::vector<int> &
position()
const;
63 std::ptrdiff_t
offset()
const;
72 static std::vector<std::ptrdiff_t>
to_ptrdiff_v(
const std::vector<T> & v );
87 const std::vector<int> & strides,
88 bool optimize_direction =
false );
90 const std::vector<std::size_t> & strides,
91 bool optimize_direction =
false );
93 const std::vector<std::ptrdiff_t> & strides,
94 bool optimize_direction =
false );
137 NDIterator( T* buffer,
const std::vector<int> & dims );
138 NDIterator( T* buffer,
const std::vector<int> & dims,
139 const std::vector<int> & strides );
140 NDIterator( T*buffer,
const std::vector<int> & dims,
141 const std::vector<std::size_t> & strides );
142 NDIterator( T* buffer,
const std::vector<int> & dims,
143 const std::vector<std::ptrdiff_t> & strides );
160 const std::vector<int> & strides );
162 const std::vector<std::size_t> & strides );
164 const std::vector<std::ptrdiff_t> & strides );
211 const std::vector<int> & strides,
212 bool optimize_direction =
false );
214 const std::vector<std::size_t> & strides,
215 bool optimize_direction =
false );
217 const std::vector<std::ptrdiff_t> & strides,
218 bool optimize_direction =
false );
247 const std::vector<int> & strides,
248 bool optimize_direction =
false );
250 const std::vector<std::size_t> & strides,
251 bool optimize_direction =
false );
253 const std::vector<std::ptrdiff_t> & strides,
254 bool optimize_direction =
false );
280 const std::vector<int> & strides )
291 const std::vector<std::size_t> & strides )
301 const std::vector<std::ptrdiff_t> & strides )
336 template <
typename T>
inline
339 std::vector<std::ptrdiff_t> ov( v.size() );
340 std::copy(begin(v), end(v), begin(ov));
347 std::size_t dim, ndim =
_dims.size();
348 bool nextrow =
true, stride = !
_strides.empty();
349 for( dim=0; nextrow && dim<ndim; ++dim )
358 if( dim == ndim - 1 )
374 const std::vector<int> & dims )
378 if( dims.size() < 2 )
384 const std::vector<int> & dims,
const std::vector<int> & strides,
385 bool optimize_direction )
389 if( dims.size() < 2 )
396 const std::vector<int> & dims,
const std::vector<std::size_t> & strides,
397 bool optimize_direction )
401 if( dims.size() < 2 )
408 const std::vector<int> & dims,
const std::vector<std::ptrdiff_t> & strides,
409 bool optimize_direction )
413 if( dims.size() < 2 )
420 bool optimize_direction )
425 if( optimize_direction )
427 std::size_t dim, ndim =
_strides.size();
428 for( dim=0; dim<ndim; ++dim )
464 std::size_t dim, ndim =
_dims.size();
465 bool nextrow =
true, stride = !
_strides.empty();
466 for( dim=0; nextrow && dim<ndim; ++dim )
490 template <
typename T>
inline
497 template <
typename T>
inline
499 const std::vector<int> & strides )
505 template <
typename T>
inline
507 const std::vector<std::size_t> & strides )
513 template <
typename T>
inline
515 const std::vector<std::ptrdiff_t> & strides )
533 template <
typename T>
inline
535 const T* buffer,
const std::vector<int> & dims )
541 template <
typename T>
inline
543 const T* buffer,
const std::vector<int> & dims,
544 const std::vector<int> & strides )
550 template <
typename T>
inline
552 const T* buffer,
const std::vector<int> & dims,
553 const std::vector<std::ptrdiff_t> & strides )
559 template <
typename T>
inline
561 const T* buffer,
const std::vector<int> & dims,
562 const std::vector<std::size_t> & strides )
568 template <
typename T>
const inline T &
574 template <
typename T>
const inline T *
582 template <
typename T>
inline
584 T* buffer,
const std::vector<int> & dims )
590 template <
typename T>
inline
592 const std::vector<int> & dims,
593 const std::vector<int> & strides,
594 bool optimize_direction )
601 template <
typename T>
inline
603 const std::vector<int> & dims,
604 const std::vector<std::size_t> & strides,
605 bool optimize_direction )
612 template <
typename T>
inline
614 const std::vector<int> & dims,
615 const std::vector<std::ptrdiff_t> & strides,
616 bool optimize_direction )
635 template <
typename T>
inline
645 template <
typename T>
inline
655 template <
typename T>
inline
666 template <
typename T>
inline
668 const T* buffer,
const std::vector<int> & dims )
674 template <
typename T>
inline
676 const T* buffer,
const std::vector<int> & dims,
677 const std::vector<int> & strides,
bool optimize_direction )
684 template <
typename T>
inline
686 const T* buffer,
const std::vector<int> & dims,
687 const std::vector<std::size_t> & strides,
bool optimize_direction )
694 template <
typename T>
inline
696 const T* buffer,
const std::vector<int> & dims,
697 const std::vector<std::ptrdiff_t> & strides,
bool optimize_direction )
704 template <
typename T>
inline const T &
711 template <
typename T>
inline const T *
718 template <
typename T>
inline
728 template <
typename T>
inline
NDIterator_base(const std::vector< int > &dims)
std::vector< std::ptrdiff_t > _strides
std::ptrdiff_t offset() const
static std::vector< std::ptrdiff_t > to_ptrdiff_v(const std::vector< T > &v)
const std::vector< int > & position() const
NDIterator_base & operator++()
std::vector< int > _position
NDIterator(T *buffer, const std::vector< int > &dims)
const_NDIterator(const T *buffer, const std::vector< int > &dims)
const T & operator*() const
const T * operator->() const
const T & operator*() const
const_line_NDIterator(const T *buffer, const std::vector< int > &dims)
std::ptrdiff_t line_length() const
line_size * line stride: end of line
void inc_line_ptr(const T *&p) const
increment a "line" pointer (advancing through the line)
const T * operator->() const
int line_direction() const
std::ptrdiff_t _line_stride
line_NDIterator_base(const std::vector< int > &dims)
void set_optimized_direction(bool optimize_direction=false)
NDIterator_base & operator++()
bool is_contiguous() const
std::ptrdiff_t 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)