36 #ifndef VIGRA_NAVIGATOR_HXX
37 #define VIGRA_NAVIGATOR_HXX
39 #include "multi_shape.hxx"
96 template <
class MULTI_ITERATOR,
unsigned int N>
105 enum { level = N-1 };
109 typedef typename MULTI_ITERATOR::multi_difference_type
shape_type;
113 typedef typename MULTI_ITERATOR::iterator
iterator;
123 unsigned int inner_dimension)
124 : base_type(i, start, stop, inner_dimension)
132 if(this->point_[level-1] == this->stop_[level-1])
135 ++this->point_[level];
136 ++this->i_.template dim<level>();
151 return this->point_[level] < this->stop_[level];
158 return this->point_[level] >= this->stop_[level];
164 this->point_[level] = this->start_[level];
165 this->i_.template dim<level>() -= (this->stop_[level] - this->start_[level]);
169 template <
class MULTI_ITERATOR>
170 class MultiArrayNavigator<MULTI_ITERATOR, 1>
174 typedef typename MULTI_ITERATOR::multi_difference_type
shape_type;
175 typedef typename MULTI_ITERATOR::iterator
iterator;
178 : start_(), stop_(shape), point_(start_),
179 inner_dimension_(inner_dimension),
180 inner_shape_(stop_[inner_dimension] - start_[inner_dimension]),
183 if(stop_[inner_dimension] > start_[inner_dimension])
184 stop_[inner_dimension] = start_[inner_dimension] + 1;
188 unsigned int inner_dimension)
189 : start_(start), stop_(stop), point_(start_),
190 inner_dimension_(inner_dimension),
191 inner_shape_(stop_[inner_dimension] - start_[inner_dimension]),
194 if(stop_[inner_dimension] > start_[inner_dimension])
195 stop_[inner_dimension] = start_[inner_dimension] + 1;
201 ++i_.template dim<level>();
211 return i_.iteratorForDimension(inner_dimension_);
216 return begin() + inner_shape_;
221 return point_[level] < stop_[level];
226 return point_[level] >= stop_[level];
237 point_[level] = start_[level];
238 i_.template dim<level>() -= (stop_[level] - start_[level]);
242 unsigned int inner_dimension_, inner_shape_;
295 template <
unsigned int Dimensions,
unsigned int N = Dimensions>
304 enum { level = N-1 };
317 this->end_[level] = (this->inner_dimension_ == level)
319 : this->shape_[level];
330 if(this->i_[level] < this->end_[level])
346 return this->inner_dimension_ == level
348 : this->i_[level] < this->end_[level];
365 this->end_[level] = (this->inner_dimension_ == level)
367 : this->shape_[level];
372 template <
unsigned int Dimensions>
373 class MultiCoordinateNavigator<Dimensions, 1>
381 inner_dimension_(inner_dimension)
383 end_[level] = (inner_dimension_ == level)
406 res[inner_dimension_] = shape_[inner_dimension_];
412 return i_[level] < end_[level];
424 end_[level] = (inner_dimension_ == level)
430 unsigned int inner_dimension_;
MULTI_ITERATOR::multi_difference_type shape_type
Definition: navigator.hxx:109
MULTI_ITERATOR::iterator iterator
Definition: navigator.hxx:113
bool hasMore() const
Definition: navigator.hxx:149
void operator++(int)
Definition: navigator.hxx:337
bool atEnd() const
Definition: navigator.hxx:353
std::ptrdiff_t MultiArrayIndex
Definition: multi_fwd.hxx:60
bool hasMore() const
Definition: navigator.hxx:344
MultiCoordinateNavigator(value_type const &shape, unsigned int inner_dimension)
Definition: navigator.hxx:314
void operator++()
Definition: navigator.hxx:129
Definition: multi_fwd.hxx:63
A navigator that provides access to the 1D subranges of an n-dimensional range given by a vigra::Mult...
Definition: navigator.hxx:97
void operator++(int)
Definition: navigator.hxx:142
TinyVector< MultiArrayIndex, N > type
Definition: multi_shape.hxx:272
MultiArrayNavigator(MULTI_ITERATOR const &i, shape_type const &shape, unsigned int inner_dimension)
Definition: navigator.hxx:118
void operator++()
Definition: navigator.hxx:324
A navigator that provides access to the 1D subranges of an n-dimensional range given by an nD shape...
Definition: navigator.hxx:296
MultiArrayShape< Dimensions >::type value_type
Definition: navigator.hxx:308
bool atEnd() const
Definition: navigator.hxx:156