EnumIterator.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #ifndef SQUID_SRC_BASE_ENUMITERATOR_H
10 #define SQUID_SRC_BASE_ENUMITERATOR_H
11 
12 #include <iterator>
13 #include <type_traits>
14 
22 template <typename EnumType>
24 {
25 protected:
26  typedef typename std::underlying_type<EnumType>::type iterator_type;
27 
28 public:
29  using iterator_category = std::bidirectional_iterator_tag;
30  using value_type = EnumType;
31  using difference_type = std::ptrdiff_t;
32  using pointer = EnumType *;
33  using reference = EnumType &;
34 
35  explicit EnumIteratorBase(EnumType e) : current(static_cast<iterator_type>(e)) {}
36 
37  bool operator==(const EnumIteratorBase &i) const {
38  return current == i.current;
39  }
40 
41  bool operator!=(const EnumIteratorBase &i) const {
42  return current != i.current;
43  }
44 
45  EnumType operator*() const {
46  return static_cast<EnumType>(current);
47  }
48 protected:
50 };
51 
66 template <typename EnumType>
67 class EnumIterator : public EnumIteratorBase<EnumType>
68 {
69 public:
70  explicit EnumIterator(EnumType e) : EnumIteratorBase<EnumType>(e) {}
71 
74  return *this;
75  }
76 
78  EnumIterator rv(*this);
80  return rv;
81  }
82 
85  return *this;
86  }
87 
89  EnumIterator rv(*this);
91  return rv;
92  }
93 };
94 
110 template <typename EnumType>
111 class ReverseEnumIterator : public EnumIteratorBase<EnumType>
112 {
113 public:
114  explicit ReverseEnumIterator(EnumType e) : EnumIteratorBase<EnumType>(e) {}
115 
116  // prefix increment
119  return *this;
120  }
121 
122  // postfix increment
124  ReverseEnumIterator rv(*this);
126  return rv;
127  }
128 
129  // prefix decrement
132  return *this;
133  }
134 
135  // postfix decrement
137  ReverseEnumIterator rv(*this);
139  return rv;
140  }
141 };
142 
156 template <typename EnumType>
158 {
159 public:
162  EnumRangeT(EnumType first, EnumType one_past_last) : begin_(first), end_(one_past_last) { }
163  iterator begin() const { return iterator(begin_);}
164  iterator end() const { return iterator(end_);}
167 private:
168  EnumType begin_;
169  EnumType end_;
170 };
171 
187 template <typename EnumType>
188 EnumRangeT<EnumType> EnumRange(EnumType begin, EnumType one_past_end)
189 {
190  return EnumRangeT<EnumType>(begin,one_past_end);
191 }
192 
220 template <typename EnumType>
221 class WholeEnum : public EnumRangeT<EnumType>
222 {
223 public:
224  WholeEnum() : EnumRangeT<EnumType>(EnumType::enumBegin_, EnumType::enumEnd_) {}
225 };
226 
230 template <auto First, auto Last, class F>
231 constexpr void
233 {
234  using enumType = decltype(First);
235  using underlyingType = typename std::underlying_type<enumType>::type;
236  // std::integral_constant trick makes f(First) argument a constexpr
237  f(std::integral_constant<enumType, First>()); // including when First is Last
238  if constexpr (First < Last)
239  ConstexprForEnum<enumType(static_cast<underlyingType>(First) + 1), Last>(f);
240 }
241 
242 #endif /* SQUID_SRC_BASE_ENUMITERATOR_H */
243 
EnumIterator & operator++()
Definition: EnumIterator.h:72
EnumIterator & operator--(int)
Definition: EnumIterator.h:88
EnumIterator< EnumType > iterator
Definition: EnumIterator.h:160
EnumType end_
Definition: EnumIterator.h:169
bool operator!=(const EnumIteratorBase &i) const
Definition: EnumIterator.h:41
iterator_type current
Definition: EnumIterator.h:49
EnumType & reference
Definition: EnumIterator.h:33
EnumIteratorBase(EnumType e)
Definition: EnumIterator.h:35
static uint32 F(uint32 X, uint32 Y, uint32 Z)
Definition: md4.c:46
reverse_iterator rbegin() const
Definition: EnumIterator.h:165
EnumRangeT< EnumType > EnumRange(EnumType begin, EnumType one_past_end)
Definition: EnumIterator.h:188
std::bidirectional_iterator_tag iterator_category
Definition: EnumIterator.h:29
EnumType begin_
Definition: EnumIterator.h:168
std::underlying_type< EnumType >::type iterator_type
Definition: EnumIterator.h:26
ReverseEnumIterator & operator++(int)
Definition: EnumIterator.h:123
EnumRangeT(EnumType first, EnumType one_past_last)
Definition: EnumIterator.h:162
iterator begin() const
Definition: EnumIterator.h:163
ReverseEnumIterator(EnumType e)
Definition: EnumIterator.h:114
std::ptrdiff_t difference_type
Definition: EnumIterator.h:31
ReverseEnumIterator< EnumType > reverse_iterator
Definition: EnumIterator.h:161
constexpr void ConstexprForEnum(F &&f)
Definition: EnumIterator.h:232
EnumType operator*() const
Definition: EnumIterator.h:45
ReverseEnumIterator & operator--(int)
Definition: EnumIterator.h:136
EnumType value_type
Definition: EnumIterator.h:30
reverse_iterator rend() const
Definition: EnumIterator.h:166
iterator end() const
Definition: EnumIterator.h:164
EnumIterator & operator--()
Definition: EnumIterator.h:83
EnumIterator(EnumType e)
Definition: EnumIterator.h:70
EnumIterator & operator++(int)
Definition: EnumIterator.h:77
EnumType * pointer
Definition: EnumIterator.h:32
ReverseEnumIterator & operator--()
Definition: EnumIterator.h:130
ReverseEnumIterator & operator++()
Definition: EnumIterator.h:117
bool operator==(const EnumIteratorBase &i) const
Definition: EnumIterator.h:37

 

Introduction

Documentation

Support

Miscellaneous