16 Iterator<T>::Iterator(Image& img, std::vector<int> pos) : img_{ &img }, pos_{ move(pos) }
18 if (img_->contiguous_)
19 incrementor = &Iterator::ContiguousIncrementPos;
21 pos_.resize(img_->dims_.size(), 0);
25 if (pos_.size() != img_->dims_.size()) {
26 throw std::runtime_error(
"Iterator starting pos has a wrong size");
28 if (pos_ == img_->dims_) {
29 if (img_->contiguous_) {
30 ptr_ = img_->data_ + img_->datasize_;
37 ptr_ = img_->Ptr(pos_);
44 if (img_->contiguous_)
45 incrementor = &ConstIterator::ContiguousIncrementPos;
47 pos_.resize(img_->dims_.size(), 0);
51 if (pos_.size() != img_->dims_.size()) {
52 throw std::runtime_error(
"ConstIterator starting pos has a wrong size");
54 if (pos_ == img_->dims_) {
55 if (img_->contiguous_) {
56 ptr_ = img_->data_ + img_->datasize_;
63 ptr_ = img_->Ptr(pos_);
70 if (!img_->contiguous_) {
71 throw std::runtime_error(
"ContiguousIterator used on a non contiguous Image");
78 if (pos.size() != img_->dims_.size()) {
79 throw std::runtime_error(
"ContiguousIterator starting pos has a wrong size");
81 if (pos == img_->dims_) {
82 ptr_ = img_->data_ + img_->datasize_;
85 ptr_ = img_->Ptr(pos);
92 if (!img_->contiguous_) {
93 throw std::runtime_error(
"ConstContiguousIterator used on a non contiguous Image");
100 if (pos.size() != img_->dims_.size()) {
101 throw std::runtime_error(
"ConstContiguousIterator starting pos has a wrong size");
103 if (pos == img_->dims_) {
104 ptr_ = img_->data_ + img_->datasize_;
107 ptr_ = img_->Ptr(pos);
112 template <
typename T>
113 Iterator<T>& Iterator<T>::IncrementPos()
115 int spos =
vsize(pos_);
117 for (dim = 0; dim < spos; ++dim) {
119 ptr_ += img_->strides_[dim];
120 if (pos_[dim] != img_->dims_[dim])
124 ptr_ -= img_->dims_[dim] * img_->strides_[dim];
130 template <
typename T>
131 ConstIterator<T>& ConstIterator<T>::IncrementPos()
133 int spos =
vsize(pos_);
135 for (dim = 0; dim < spos; ++dim) {
137 ptr_ += img_->strides_[dim];
138 if (pos_[dim] != img_->dims_[dim])
142 ptr_ -= img_->dims_[dim] * img_->strides_[dim];
150 template <
typename T>
151 Iterator<T>& Iterator<T>::ContiguousIncrementPos()
153 ptr_ += img_->elemsize_;
156 template <
typename T>
157 ConstIterator<T>& ConstIterator<T>::ContiguousIncrementPos()
159 ptr_ += img_->elemsize_;
162 template <
typename T>
163 ContiguousIterator<T>& ContiguousIterator<T>::ContiguousIncrementPos()
165 ptr_ += img_->elemsize_;
168 template <
typename T>
169 ConstContiguousIterator<T>& ConstContiguousIterator<T>::ContiguousIncrementPos()
171 ptr_ += img_->elemsize_;
ConstContiguousIterator(const Image &img, std::vector< int > pos={})
ContiguousIterator(Image &img, std::vector< int > pos={})
int vsize(const std::vector< T > &v)
ConstIterator(const Image &img, std::vector< int > pos={})