1 #ifndef LXGUI_UTILS_RANGE_HPP
2 #define LXGUI_UTILS_RANGE_HPP
4 #include "lxgui/lxgui.hpp"
12 namespace range_impl {
15 struct reverse_range {
16 using base =
typename std::decay<T>::type;
17 using iterator =
typename std::conditional<
18 std::is_const<T>::value,
19 typename base::const_reverse_iterator,
20 typename base::reverse_iterator>::type;
24 explicit reverse_range(T& c) : container(c) {}
50 range_impl::reverse_range<T>
reverse(T& container) {
51 return range_impl::reverse_range<T>(container);
56 namespace range_impl {
59 struct iterator_adapter {
61 explicit iterator_adapter(I i) : iter(i) {}
65 iterator_adapter& operator++() {
69 iterator_adapter operator++(
int) {
72 bool operator!=(
const iterator_adapter& o) {
73 return iter != o.iter;
78 struct iterator_range {
79 using base =
typename std::decay<T>::type;
80 using base_iterator =
typename std::conditional<
81 std::is_const<T>::value,
82 typename base::const_iterator,
83 typename base::iterator>::type;
84 using iterator = iterator_adapter<base_iterator>;
88 explicit iterator_range(T& c) : container(c) {}
114 range_impl::iterator_range<T>
iterator(T& container) {
115 return range_impl::iterator_range<T>(container);
120 namespace range_impl {
123 struct reverse_iterator_range {
124 using base =
typename std::decay<T>::type;
125 using base_iterator =
typename std::conditional<
126 std::is_const<T>::value,
127 typename base::const_reverse_iterator,
128 typename base::reverse_iterator>::type;
129 using iterator = iterator_adapter<base_iterator>;
133 explicit reverse_iterator_range(T& c) : container(c) {}
136 return iterator(container.rbegin());
160 return range_impl::reverse_iterator_range<T>(container);
165 namespace range_impl {
167 template<
typename I,
typename V>
168 struct value_iterator_adapter {
170 explicit value_iterator_adapter(I i) : iter(i) {}
174 value_iterator_adapter& operator++() {
178 value_iterator_adapter operator++(
int) {
181 bool operator!=(
const value_iterator_adapter& o) {
182 return iter != o.iter;
188 using base =
typename std::decay<T>::type;
189 using base_iterator =
typename std::conditional<
190 std::is_const<T>::value,
191 typename base::const_iterator,
192 typename base::iterator>::type;
193 using value_type =
typename std::conditional<
194 std::is_const<T>::value,
195 const typename base::mapped_type,
196 typename base::mapped_type>::type;
197 using iterator = value_iterator_adapter<base_iterator, value_type>;
201 explicit value_range(T& c) : container(c) {}
227 range_impl::value_range<T>
value(T& container) {
228 return range_impl::value_range<T>(container);
233 namespace range_impl {
236 struct reverse_value_range {
237 using base =
typename std::decay<T>::type;
238 using base_iterator =
typename std::conditional<
239 std::is_const<T>::value,
240 typename base::const_reverse_iterator,
241 typename base::reverse_iterator>::type;
242 using value_type =
typename std::conditional<
243 std::is_const<T>::value,
244 const typename base::mapped_type,
245 typename base::mapped_type>::type;
246 using iterator = value_iterator_adapter<base_iterator, value_type>;
250 explicit reverse_value_range(T& c) : container(c) {}
253 return iterator(container.rbegin());
277 return range_impl::reverse_value_range<T>(container);
282 namespace range_impl {
284 template<
typename I,
typename K>
285 struct key_iterator_adapter {
287 explicit key_iterator_adapter(I i) : iter(i) {}
288 const K& operator*() {
291 key_iterator_adapter& operator++() {
295 key_iterator_adapter operator++(
int) {
298 bool operator!=(
const key_iterator_adapter& o) {
299 return iter != o.iter;
305 using base =
typename std::decay<T>::type;
306 using base_iterator =
typename std::conditional<
307 std::is_const<T>::value,
308 typename base::const_iterator,
309 typename base::iterator>::type;
310 using key_type =
typename base::key_type;
311 using iterator = key_iterator_adapter<base_iterator, key_type>;
315 explicit key_range(T& c) : container(c) {}
341 range_impl::key_range<T>
key(T& container) {
342 return range_impl::key_range<T>(container);
347 namespace range_impl {
350 struct reverse_key_range {
351 using base =
typename std::decay<T>::type;
352 using base_iterator =
typename std::conditional<
353 std::is_const<T>::value,
354 typename base::const_reverse_iterator,
355 typename base::reverse_iterator>::type;
356 using key_type =
typename base::key_type;
357 using iterator = key_iterator_adapter<base_iterator, key_type>;
361 explicit reverse_key_range(T& c) : container(c) {}
364 return iterator(container.rbegin());
388 return range_impl::reverse_key_range<T>(container);
range_impl::key_range< T > key(T &container)
Expose the key rather than the (key,value) pair.
range_impl::reverse_range< T > reverse(T &container)
Reverse traversal.
range_impl::reverse_iterator_range< T > reverse_iterator(T &container)
Expose the iterator rather than the element, with reverse traversal.
range_impl::iterator_range< T > iterator(T &container)
Expose the iterator rather than the element.
range_impl::reverse_key_range< T > reverse_key(T &container)
Expose the key rather than the (key,value) pair, with reverse traversal.
range_impl::value_range< T > value(T &container)
Expose the value rather than the (key,value) pair.
range_impl::reverse_value_range< T > reverse_value(T &container)
Expose the value rather than the (key,value) pair, with reverse traversal.