iterators.h
Go to the documentation of this file.
1 /*
2 * ECVL - European Computer Vision Library
3 * Version: 1.0.3
4 * copyright (c) 2021, Università degli Studi di Modena e Reggio Emilia (UNIMORE), AImageLab
5 * Authors:
6 * Costantino Grana (costantino.grana@unimore.it)
7 * Federico Bolelli (federico.bolelli@unimore.it)
8 * Michele Cancilla (michele.cancilla@unimore.it)
9 * Laura Canalini (laura.canalini@unimore.it)
10 * Stefano Allegretti (stefano.allegretti@unimore.it)
11 * All rights reserved.
12 */
13 
14 #ifndef ECVL_ITERATORS_H_
15 #define ECVL_ITERATORS_H_
16 
17 #include <vector>
18 #include <cstdint>
19 
20 namespace ecvl
21 {
22 class Image;
23 
24 template <typename T>
25 struct Iterator
26 {
27  using difference_type = std::ptrdiff_t;
28  using value_type = T;
29  using pointer = value_type*;
31  using iterator_category = std::forward_iterator_tag;
32 
33  std::vector<int> pos_;
34  uint8_t* ptr_;
36 
37  typedef Iterator& (Iterator::* IncrementMemFn)();
39 
40  Iterator() {}
41  Iterator(Image& img, std::vector<int> pos = {});
42  Iterator& operator++() /* prefix */ { return (this->*incrementor)(); }
43  T& operator* () const { return *reinterpret_cast<T*>(ptr_); }
44  T* operator-> () const { return reinterpret_cast<T*>(ptr_); }
45  bool operator==(const Iterator& rhs) const { return ptr_ == rhs.ptr_; }
46  bool operator!=(const Iterator& rhs) const { return ptr_ != rhs.ptr_; }
47 private:
48  Iterator& IncrementPos();
49  Iterator& ContiguousIncrementPos();
50 };
51 
52 template <typename T>
54 {
55  using difference_type = std::ptrdiff_t;
56  using value_type = T;
57  using pointer = const value_type*;
58  using reference = const value_type&;
59  using iterator_category = std::forward_iterator_tag;
60 
61  std::vector<int> pos_;
62  const uint8_t* ptr_;
63  const Image* img_;
64 
67 
69  ConstIterator(const Image& img, std::vector<int> pos = {});
70  ConstIterator& operator++() /* prefix */ { return (this->*incrementor)(); }
71  const T& operator* () const { return *reinterpret_cast<const T*>(ptr_); }
72  const T* operator-> () const { return reinterpret_cast<const T*>(ptr_); }
73  bool operator==(const ConstIterator& rhs) const { return ptr_ == rhs.ptr_; }
74  bool operator!=(const ConstIterator& rhs) const { return ptr_ != rhs.ptr_; }
75 private:
76  ConstIterator& IncrementPos();
77  ConstIterator& ContiguousIncrementPos();
78 };
79 
80 template <typename T>
82 {
83  using difference_type = std::ptrdiff_t;
84  using value_type = T;
85  using pointer = value_type*;
87  using iterator_category = std::forward_iterator_tag;
88 
89  uint8_t* ptr_;
91 
93  ContiguousIterator(Image& img, std::vector<int> pos = {});
94  ContiguousIterator& operator++() /* prefix */ { return ContiguousIncrementPos(); }
95  T& operator* () const { return *reinterpret_cast<T*>(ptr_); }
96  T* operator-> () const { return reinterpret_cast<T*>(ptr_); }
97  bool operator==(const ContiguousIterator& rhs) const { return ptr_ == rhs.ptr_; }
98  bool operator!=(const ContiguousIterator& rhs) const { return ptr_ != rhs.ptr_; }
99 private:
100  ContiguousIterator& ContiguousIncrementPos();
101 };
102 
103 template <typename T>
105 {
106  using difference_type = std::ptrdiff_t;
107  using value_type = T;
108  using pointer = const value_type*;
109  using reference = const value_type&;
110  using iterator_category = std::forward_iterator_tag;
111 
112  const uint8_t* ptr_;
113  const Image* img_;
114 
116  ConstContiguousIterator(const Image& img, std::vector<int> pos = {});
117  ConstContiguousIterator& operator++() /* prefix */ { return ContiguousIncrementPos(); }
118  const T& operator* () const { return *reinterpret_cast<const T*>(ptr_); }
119  const T* operator-> () const { return reinterpret_cast<const T*>(ptr_); }
120  bool operator==(const ConstContiguousIterator& rhs) const { return ptr_ == rhs.ptr_; }
121  bool operator!=(const ConstContiguousIterator& rhs) const { return ptr_ != rhs.ptr_; }
122 private:
123  ConstContiguousIterator& ContiguousIncrementPos();
124 };
125 
129 } // namespace ecvl
130 
131 #endif // !ECVL_ITERATORS_H_
ConstContiguousIterator & operator++()
Definition: iterators.h:117
IncrementMemFn incrementor
Definition: iterators.h:66
std::vector< int > pos_
Definition: iterators.h:33
Image class.
Definition: image.h:66
const T * operator->() const
Definition: iterators.h:72
std::forward_iterator_tag iterator_category
Definition: iterators.h:87
Iterator & operator++()
Definition: iterators.h:42
bool operator!=(const ConstContiguousIterator &rhs) const
Definition: iterators.h:121
T & operator *() const
Definition: iterators.h:95
std::ptrdiff_t difference_type
Definition: iterators.h:27
std::ptrdiff_t difference_type
Definition: iterators.h:55
std::ptrdiff_t difference_type
Definition: iterators.h:83
value_type & reference
Definition: iterators.h:86
T * operator->() const
Definition: iterators.h:96
bool operator==(const ConstContiguousIterator &rhs) const
Definition: iterators.h:120
uint8_t * ptr_
Definition: iterators.h:34
const value_type * pointer
Definition: iterators.h:108
ContiguousIterator & operator++()
Definition: iterators.h:94
Image * img_
Definition: iterators.h:35
const value_type * pointer
Definition: iterators.h:57
Definition: any.h:69
const value_type & reference
Definition: iterators.h:58
std::forward_iterator_tag iterator_category
Definition: iterators.h:59
const Image * img_
Definition: iterators.h:63
ConstIterator & operator++()
Definition: iterators.h:70
std::forward_iterator_tag iterator_category
Definition: iterators.h:31
value_type & reference
Definition: iterators.h:30
const uint8_t * ptr_
Definition: iterators.h:62
value_type * pointer
Definition: iterators.h:29
T & operator *() const
Definition: iterators.h:43
value_type * pointer
Definition: iterators.h:85
bool operator!=(const Iterator &rhs) const
Definition: iterators.h:46
bool operator==(const ContiguousIterator &rhs) const
Definition: iterators.h:97
bool operator!=(const ConstIterator &rhs) const
Definition: iterators.h:74
const T & operator *() const
Definition: iterators.h:71
bool operator==(const Iterator &rhs) const
Definition: iterators.h:45
const T & operator *() const
Definition: iterators.h:118
std::forward_iterator_tag iterator_category
Definition: iterators.h:110
Iterator &(Iterator::* IncrementMemFn)()
Definition: iterators.h:37
bool operator!=(const ContiguousIterator &rhs) const
Definition: iterators.h:98
ConstIterator &(ConstIterator::* IncrementMemFn)()
Definition: iterators.h:65
IncrementMemFn incrementor
Definition: iterators.h:38
const T * operator->() const
Definition: iterators.h:119
const value_type & reference
Definition: iterators.h:109
std::ptrdiff_t difference_type
Definition: iterators.h:106
std::vector< int > pos_
Definition: iterators.h:61
bool operator==(const ConstIterator &rhs) const
Definition: iterators.h:73
T * operator->() const
Definition: iterators.h:44