16 #ifndef ROOT7_RIndexIter
17 #define ROOT7_RIndexIter
22 namespace Experimental {
33 template <
class REFERENCE,
34 class POINTER =
typename std::add_pointer<typename std::remove_reference<REFERENCE>::type>::type>
35 class RIndexIter:
public std::iterator<std::random_access_iterator_tag, REFERENCE, POINTER> {
39 static constexpr
size_t fgEndIndex = (size_t)-1;
42 RIndexIter(
size_t idx): fIndex(idx) {}
45 size_t GetIndex() const noexcept {
return fIndex; }
50 RIndexIter &operator++() noexcept
57 RIndexIter &operator--() noexcept
59 if (fIndex != fgEndIndex)
65 RIndexIter operator++(
int)noexcept
67 RIndexIter old(*
this);
73 RIndexIter operator--(
int)noexcept
75 RIndexIter old(*
this);
80 RIndexIter &operator+=(
int d) noexcept
86 RIndexIter &operator-=(
int d) noexcept
96 RIndexIter operator+(
int d) noexcept
98 RIndexIter ret(*
this);
103 RIndexIter operator-(
int d) noexcept
105 RIndexIter ret(*
this);
114 template <
class REFERENCE,
class POINTER>
115 bool operator<(RIndexIter<REFERENCE, POINTER> lhs, RIndexIter<REFERENCE, POINTER> rhs) noexcept
117 return lhs.GetIndex() < rhs.GetIndex();
120 template <
class REFERENCE,
class POINTER>
121 bool operator>(RIndexIter<REFERENCE, POINTER> lhs, RIndexIter<REFERENCE, POINTER> rhs) noexcept
123 return lhs.GetIndex() > rhs.GetIndex();
126 template <
class REFERENCE,
class POINTER>
127 bool operator<=(RIndexIter<REFERENCE, POINTER> lhs, RIndexIter<REFERENCE, POINTER> rhs) noexcept
129 return lhs.GetIndex() <= rhs.GetIndex();
132 template <
class REFERENCE,
class POINTER>
133 inline bool operator>=(RIndexIter<REFERENCE, POINTER> lhs, RIndexIter<REFERENCE, POINTER> rhs) noexcept
135 return lhs.GetIndex() >= rhs.GetIndex();
138 template <
class REFERENCE,
class POINTER>
139 inline bool operator==(RIndexIter<REFERENCE, POINTER> lhs, RIndexIter<REFERENCE, POINTER> rhs) noexcept
141 return lhs.GetIndex() == rhs.GetIndex();
144 template <
class REFERENCE,
class POINTER>
145 inline bool operator!=(RIndexIter<REFERENCE, POINTER> lhs, RIndexIter<REFERENCE, POINTER> rhs) noexcept
147 return lhs.GetIndex() != rhs.GetIndex();
155 #endif // ROOT7_RIndexIter