SPH
Iterator.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "common/Assert.h"
9 #include "common/Traits.h"
10 #include <iterator>
11 
13 
17 template <typename T>
18 class Iterator {
19 protected:
21 
22  T* data;
23 #ifdef SPH_DEBUG
24  const T *begin = nullptr, *end = nullptr;
25 #endif
26 
27 #ifndef SPH_DEBUG
29  : data(data) {}
30 #endif
31 public:
32  using TCounter = ptrdiff_t;
33 
34  using iterator_category = std::random_access_iterator_tag;
35  using value_type = T;
36  using difference_type = ptrdiff_t;
37  using pointer = T*;
38  using reference = T&;
39 
40  Iterator() = default;
41 
42  Iterator(T* data, const T* begin, const T* end)
43  : data(data)
44 #ifdef SPH_DEBUG
45  , begin(begin)
46  , end(end)
47 #endif
48  {
49  SPH_ASSERT(end >= begin, begin, end);
50  }
51 
52  Iterator(std::nullptr_t)
53  : data(nullptr)
54 #ifdef SPH_DEBUG
55  , begin(nullptr)
56  , end(nullptr)
57 #endif
58  {
59  }
60 
61  INLINE const TValue& operator*() const {
62  SPH_ASSERT(data != nullptr);
63  SPH_ASSERT_UNEVAL(data >= begin && data < end);
64  return *data;
65  }
67  SPH_ASSERT(data != nullptr);
68  SPH_ASSERT_UNEVAL(data >= begin && data < end);
69  return *data;
70  }
72  SPH_ASSERT(data != nullptr);
73  SPH_ASSERT_UNEVAL(data >= begin && data < end);
74  return data;
75  }
76  INLINE const T* operator->() const {
77  SPH_ASSERT(data != nullptr);
78  SPH_ASSERT_UNEVAL(data >= begin && data < end);
79  return data;
80  }
81 
82  INLINE explicit operator bool() const {
83  return data != nullptr;
84  }
85 
86 #ifdef SPH_DEBUG
87  INLINE Iterator operator+(const TCounter n) const {
88  SPH_ASSERT(data != nullptr);
89  return Iterator(data + n, begin, end);
90  }
91  INLINE Iterator operator-(const TCounter n) const {
92  SPH_ASSERT(data != nullptr);
93  return Iterator(data - n, begin, end);
94  }
95 #else
96  INLINE Iterator operator+(const TCounter n) const {
97  return Iterator(data + n);
98  }
99  INLINE Iterator operator-(const TCounter n) const {
100  return Iterator(data - n);
101  }
102 #endif
103  INLINE void operator+=(const TCounter n) {
104  SPH_ASSERT(data != nullptr);
105  data += n;
106  }
107  INLINE void operator-=(const TCounter n) {
108  SPH_ASSERT(data != nullptr);
109  data -= n;
110  }
112  SPH_ASSERT(data != nullptr);
113  ++data;
114  return *this;
115  }
117  SPH_ASSERT(data != nullptr);
118  Iterator tmp(*this);
119  operator++();
120  return tmp;
121  }
123  SPH_ASSERT(data != nullptr);
124  --data;
125  return *this;
126  }
128  SPH_ASSERT(data != nullptr);
129  Iterator tmp(*this);
130  operator--();
131  return tmp;
132  }
134  // only valid if both iterators are non-nullptr or both are nullptr
135  SPH_ASSERT((data != nullptr) == (iter.data != nullptr));
136  return data - iter.data;
137  }
138  INLINE bool operator<(const Iterator& iter) const {
139  SPH_ASSERT(data != nullptr && iter.data != nullptr);
140  return data < iter.data;
141  }
142  INLINE bool operator>(const Iterator& iter) const {
143  SPH_ASSERT(data != nullptr && iter.data != nullptr);
144  return data > iter.data;
145  }
146  INLINE bool operator<=(const Iterator& iter) const {
147  SPH_ASSERT(data != nullptr && iter.data != nullptr);
148  return data <= iter.data;
149  }
150  INLINE bool operator>=(const Iterator& iter) const {
151  SPH_ASSERT(data != nullptr && iter.data != nullptr);
152  return data >= iter.data;
153  }
154  INLINE bool operator==(const Iterator& iter) const {
155  return data == iter.data;
156  }
157  INLINE bool operator!=(const Iterator& iter) const {
158  return data != iter.data;
159  }
160  INLINE operator Iterator<const T>() const {
161 #ifdef SPH_DEBUG
162  return Iterator<const T>(data, begin, end);
163 #else
164  return Iterator<const T>(data, nullptr, nullptr);
165 #endif
166  }
167 };
168 
Custom assertions.
#define SPH_ASSERT(x,...)
Definition: Assert.h:94
#define SPH_ASSERT_UNEVAL(x,...)
Definition: Assert.h:96
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
#define INLINE
Macros for conditional compilation based on selected compiler.
Definition: Object.h:31
#define NAMESPACE_SPH_END
Definition: Object.h:12
Few non-standard type traits.
Simple (forward) iterator over continuous array of objects of type T.
Definition: Iterator.h:18
INLINE Iterator operator+(const TCounter n) const
Definition: Iterator.h:96
std::random_access_iterator_tag iterator_category
Definition: Iterator.h:34
INLINE bool operator==(const Iterator &iter) const
Definition: Iterator.h:154
T & reference
Definition: Iterator.h:38
ptrdiff_t difference_type
Definition: Iterator.h:36
INLINE bool operator>(const Iterator &iter) const
Definition: Iterator.h:142
INLINE void operator-=(const TCounter n)
Definition: Iterator.h:107
INLINE bool operator!=(const Iterator &iter) const
Definition: Iterator.h:157
Iterator(std::nullptr_t)
Definition: Iterator.h:52
INLINE Iterator operator++(int)
Definition: Iterator.h:116
INLINE Iterator & operator--()
Definition: Iterator.h:122
Iterator(T *data)
Definition: Iterator.h:28
T * pointer
Definition: Iterator.h:37
INLINE T * operator->()
Definition: Iterator.h:71
INLINE bool operator>=(const Iterator &iter) const
Definition: Iterator.h:150
INLINE const TValue & operator*() const
Definition: Iterator.h:61
INLINE Iterator operator-(const TCounter n) const
Definition: Iterator.h:99
INLINE const T * operator->() const
Definition: Iterator.h:76
typename UnwrapReferenceType< T >::Type TValue
Definition: Iterator.h:20
ptrdiff_t TCounter
Definition: Iterator.h:32
INLINE void operator+=(const TCounter n)
Definition: Iterator.h:103
T value_type
Definition: Iterator.h:35
Iterator()=default
INLINE Iterator operator--(int)
Definition: Iterator.h:127
INLINE TValue & operator*()
Definition: Iterator.h:66
INLINE difference_type operator-(const Iterator &iter) const
Definition: Iterator.h:133
T * data
Definition: Iterator.h:22
INLINE Iterator & operator++()
Definition: Iterator.h:111
Iterator(T *data, const T *begin, const T *end)
Definition: Iterator.h:42
INLINE bool operator<(const Iterator &iter) const
Definition: Iterator.h:138
INLINE bool operator<=(const Iterator &iter) const
Definition: Iterator.h:146