YSTest: range.hpp 源文件

YSTest PreAlpha_b900_20201012 The YSLib Test Project

range.hpp
浏览该文件的文档.
1 /*
2 © 2015-2016, 2018-2020 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #ifndef YB_INC_ystdex_range_hpp_
29 #define YB_INC_ystdex_range_hpp_ 1
30
31 #include "addressof.hpp" // for <initializer_list>, ystdex::addressof;
32 #include <iterator> // for <iteartor>, std::reverse_iterator, std::begin,
33 // std::end;
34 // XXX: For efficiency, <valarray> is not supported here. Use %std names
35 // instead.
36
47 #ifndef __cpp_lib_array_constexpr
48 # if (YB_IMPL_MSCPP >= 1911 && _MSVC_LANG >= 201603) || __cplusplus >= 201603L
49 # define __cpp_lib_array_constexpr 201603L
50 # endif
51 #endif
52
53
59 #ifndef __cpp_lib_make_reverse_iterator
60 # if YB_IMPL_MSCPP >= 1800 || __cplusplus >= 201402L
61 # define __cpp_lib_make_reverse_iterator 201210L
62 # endif
63 #endif
64
65
71 #ifndef __cpp_lib_nonmember_container_access
72 # if YB_IMPL_MSCPP >= 1800 || __cplusplus >= 201411L
73 # define __cpp_lib_nonmember_container_access 201411L
74 # endif
75 #endif
76
77
78
79 namespace ystdex
80 {
81
92 inline namespace cpp2017
94 {
95
96 // XXX: If resolution from LWG 1052 is adopted, Microsoft VC++ 15.7 would be
97 // conforming.
98 // NOTE: '__cpp_lib_array_constexpr >= 201603L' is not enough as LWG issues are
99 // not respected, including (at least) LWG 2188 and LWG 2438. Note LWG 2188 is
100 // adopted by WG21 N3936, it is effective since ISO C++14.
101 // NOTE: See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86734.
102 // XXX: Assume non-GCC would not use libstdc++ old branch earlier for GCC 6.
103 #if __cplusplus >= 201703L && !YB_IMPL_MSCPP \
104 && !(__GLIBCXX__ && (__GLIBCXX__ <= 20180808 || YB_IMPL_GNUCPP < 60800))
105 # define YB_Use_std_reverse_iterator true
106 #endif
107 #if YB_Use_std_reverse_iterator
108 using std::reverse_iterator;
109 #else
110
114 template<typename _tIter>
115 class reverse_iterator
116 {
117 private:
118 using traits_type = std::iterator_traits<_tIter>;
119
120 public:
121 using iterator_type = _tIter;
122 using iterator_category = typename traits_type::iterator_category;
123 using value_type = typename traits_type::value_type;
124 using difference_type = typename traits_type::difference_type;
125 using pointer = typename traits_type::pointer;
126 using reference = typename traits_type::reference;
127
128 protected:
129 _tIter current;
130
131 public:
136 yconstfn
137 reverse_iterator()
138 : current()
139 {}
140
141 explicit yconstfn
142 reverse_iterator(_tIter x)
143 : current(x)
144 {}
145 template<class _tOther>
146 yconstfn
147 reverse_iterator(const reverse_iterator<_tOther>& u)
148 : current(u.current)
149 {}
150
151 template<class _tOther>
152 yconstfn_relaxed reverse_iterator&
153 operator=(const reverse_iterator<_tOther>& u)
154 {
155 current = u.base();
156 return *this;
157 }
158
159 YB_ATTR_nodiscard yconstfn _tIter
160 base() const
161 {
162 return current;
163 }
164
165 YB_ATTR_nodiscard yconstfn_relaxed reference
166 operator*() const
167 {
168 _tIter tmp = current;
169
170 return *--tmp;
171 }
172
177 YB_ATTR_nodiscard yconstfn pointer
178 operator->() const
179 {
180 return ystdex::addressof(operator*());
181 }
182
183 yconstfn_relaxed reverse_iterator&
184 operator++()
185 {
186 --current;
187 return *this;
188 }
189 yconstfn_relaxed reverse_iterator
190 operator++(int)
191 {
192 reverse_iterator tmp = *this;
193
194 --current;
195 return tmp;
196 }
197
198 yconstfn_relaxed reverse_iterator&
199 operator--()
200 {
201 ++current;
202 return *this;
203 }
204 yconstfn_relaxed reverse_iterator
205 operator--(int)
206 {
207 reverse_iterator tmp = *this;
208
209 ++current;
210 return tmp;
211 }
212
213 yconstfn_relaxed reverse_iterator&
214 operator+=(difference_type n)
215 {
216 current -= n;
217 return *this;
218 }
219
220 YB_ATTR_nodiscard yconstfn reverse_iterator
221 operator+(difference_type n) const
222 {
223 return reverse_iterator(current - n);
224 }
225
226 yconstfn_relaxed reverse_iterator&
227 operator-=(difference_type n)
228 {
229 current += n;
230 return *this;
231 }
232
233 YB_ATTR_nodiscard yconstfn reverse_iterator
234 operator-(difference_type n) const
235 {
236 return reverse_iterator(current + n);
237 }
238
240 YB_ATTR_nodiscard yconstfn yimpl(reference)
241 operator[](difference_type n) const
242 {
243 return *(*this + n);
244 }
245
251 template<typename _tIter2>
252 YB_ATTR_nodiscard friend yconstfn bool
253 operator==(const reverse_iterator& x, const reverse_iterator<_tIter2>& y)
254 {
255 return x.current == y.current;
256 }
257
258 template<typename _tIter2>
259 YB_ATTR_nodiscard friend yconstfn bool
260 operator<(const reverse_iterator& x, const reverse_iterator<_tIter2>& y)
261 {
262 return x.current > y.current;
263 }
264
265 template<typename _tIter2>
266 YB_ATTR_nodiscard friend yconstfn bool
267 operator!=(const reverse_iterator& x, const reverse_iterator<_tIter2>& y)
268 {
269 return x.current != y.current;
270 }
271
272 template<typename _tIter2>
273 YB_ATTR_nodiscard friend yconstfn bool
274 operator>(const reverse_iterator& x, const reverse_iterator<_tIter2>& y)
275 {
276 return x.current < y.current;
277 }
278
279 template<typename _tIter2>
280 YB_ATTR_nodiscard friend yconstfn bool
281 operator>=(const reverse_iterator& x, const reverse_iterator<_tIter2>& y)
282 {
283 return x.current <= y.current;
284 }
285
286 template<typename _tIter2>
287 YB_ATTR_nodiscard friend yconstfn bool
288 operator<=(const reverse_iterator& x, const reverse_iterator<_tIter2>& y)
289 {
290 return x.current >= y.current;
291 }
293
294 YB_ATTR_nodiscard friend yconstfn reverse_iterator
295 operator+(difference_type n, const reverse_iterator& x)
296 {
297 return reverse_iterator(x.current - n);
298 }
299 };
300
305 template<typename _tIter, typename _tIter2>
306 YB_ATTR_nodiscard yconstfn auto
307 operator-(const reverse_iterator<_tIter>& x, const reverse_iterator<_tIter2>& y)
308 -> decltype(y.base() - x.base())
309 {
310 return y.base() - x.base();
311 }
312 #endif
313
314
315 #if __cpp_lib_array_constexpr >= 201603L
316 using std::begin;
319 using std::end;
320 #else
321 template<class _tRange>
322 yconstfn auto
323 begin(_tRange& c) -> decltype(c.begin())
324 {
325 return c.begin();
326 }
327 template<class _tRange>
328 yconstfn auto
329 begin(const _tRange& c) -> decltype(c.begin())
330 {
331 return c.begin();
332 }
333 // NOTE: To avoid ambiguity, overloads for arrays are reimplemented here even
334 // they do not change in P0031R0.
336 template<typename _type, size_t _vN>
337 yconstfn _type*
338 begin(_type(&array)[_vN]) ynothrow
339 {
340 return array;
341 }
342
343 template<class _tRange>
344 yconstfn auto
345 end(_tRange& c) -> decltype(c.end())
346 {
347 return c.end();
348 }
349 template<class _tRange>
350 yconstfn auto
351 end(const _tRange& c) -> decltype(c.end())
352 {
353 return c.end();
354 }
355 // NOTE: See above.
357 template<typename _type, size_t _vN>
358 yconstfn _type*
359 end(_type(&array)[_vN]) ynothrow
360 {
361 return array + _vN;
362 }
363 #endif
364
365 } // inline namespace cpp2017;
366
372 template<typename _type, size_t _vN>
374 yconstfn _type*
375 begin(_type(&&array)[_vN]) ynothrow
376 {
377 return array;
378 }
379
381 template<typename _type, size_t _vN>
382 yconstfn _type*
383 end(_type(&&array)[_vN]) ynothrow
384 {
385 return array + _vN;
386 }
387
388 template<typename _type, size_t _vN>
389 yconstfn reverse_iterator<_type*>
390 rbegin(_type(&&array)[_vN])
391 {
392 return reverse_iterator<_type*>(array + _vN);
393 }
394
395 template<typename _type, size_t _vN>
396 yconstfn reverse_iterator<_type*>
397 rend(_type(&&array)[_vN])
398 {
399 return reverse_iterator<_type*>(array);
400 }
402
404
405 inline namespace cpp2014
406 {
407
408 #if (__cpp_lib_nonmember_container_access >= 201411L \
409 || (__cplusplus >= 201402L && (!defined(__GLIBCXX__) \
410 || __GLIBCXX__ > 20150119))) || (_LIBCPP_VERSION >= 1101 \
411 && _LIBCPP_STD_VER > 11) || YB_IMPL_MSCPP >= 1800
412 using std::cbegin;
413 using std::cend;
414 #else
415 template<typename _tRange>
417 yconstfn auto
418 cbegin(const _tRange& c) ynoexcept_spec(ystdex::begin(c))
419 -> decltype(ystdex::begin(c))
420 {
421 return ystdex::begin(c);
422 }
423
425 template<typename _tRange>
426 yconstfn auto
427 cend(const _tRange& c) ynoexcept_spec(ystdex::end(c))
428 -> decltype(ystdex::end(c))
429 {
430 return ystdex::end(c);
431 }
432 #endif
433
434 } // inline namespace cpp2014;
436
438 inline namespace cpp2017
439 {
440
442
443 #if __cpp_lib_array_constexpr >= 201603L
444 using std::rbegin;
445 using std::rend;
446 using std::crbegin;
447 using std::crend;
448 #else
449 template<class _tRange>
450 yconstfn auto
451 rbegin(_tRange& c) -> decltype(c.rbegin())
452 {
453 return c.rbegin();
454 }
455 template<class _tRange>
456 yconstfn auto
457 rbegin(const _tRange& c) -> decltype(c.rbegin())
458 {
459 return c.rbegin();
460 }
462 template<typename _type, size_t _vN>
463 yconstfn reverse_iterator<_type*>
464 rbegin(_type(&array)[_vN])
465 {
466 return reverse_iterator<_type*>(array + _vN);
467 }
468
470 template<typename _tElem>
471 yconstfn reverse_iterator<const _tElem*>
472 rbegin(std::initializer_list<_tElem> il)
473 {
474 return reverse_iterator<const _tElem*>(il.end());
475 }
476
477 template<class _tRange>
478 yconstfn auto
479 rend(_tRange& c) -> decltype(c.rend())
480 {
481 return c.rend();
482 }
483 template<class _tRange>
484 yconstfn auto
485 rend(const _tRange& c) -> decltype(c.rend())
486 {
487 return c.rend();
488 }
490 template<typename _type, size_t _vN>
491 yconstfn reverse_iterator<_type*>
492 rend(_type(&array)[_vN])
493 {
494 return reverse_iterator<_type*>(array);
495 }
497 template<typename _tElem>
498 yconstfn reverse_iterator<const _tElem*>
499 rend(std::initializer_list<_tElem> il)
500 {
501 return reverse_iterator<const _tElem*>(il.begin());
502 }
503
504 template<typename _tRange>
505 yconstfn auto
506 crbegin(const _tRange& c) -> decltype(ystdex::rbegin(c))
507 {
508 return ystdex::rbegin(c);
509 }
510
511 template<typename _tRange>
512 yconstfn auto
513 crend(const _tRange& c) -> decltype(ystdex::rend(c))
514 {
515 return ystdex::rend(c);
516 }
517 #endif
518
519 } // inline namespace cpp2017;
520
528 inline namespace cpp2017
530 {
531
532 #if __cpp_lib_nonmember_container_access >= 201411L
533 using std::size;
534 using std::empty;
535 using std::data;
536 #else
537
538 template<class _tRange>
539 yconstfn auto
540 size(const _tRange& c) -> decltype(c.size())
541 {
542 return c.size();
543 }
544 template<typename _type, size_t _vN>
545 yconstfn size_t
546 size(const _type(&)[_vN]) ynothrow
547 {
548 return _vN;
549 }
550 #if __cplusplus <= 201402L
551 template<typename _tElem>
553 yconstfn size_t
554 size(std::initializer_list<_tElem> il) ynothrow
555 {
556 return il.size();
557 }
558 #endif
559
560 template<class _tRange>
561 YB_ATTR_nodiscard yconstfn auto
562 empty(const _tRange& c) -> decltype(c.empty())
563 {
564 return c.empty();
565 }
566 template<typename _type, size_t _vN>
567 YB_ATTR_nodiscard yconstfn bool
568 empty(const _type(&)[_vN]) ynothrow
569 {
570 return {};
571 }
572 template<typename _tElem>
573 YB_ATTR_nodiscard yconstfn bool
574 empty(std::initializer_list<_tElem> il) ynothrow
575 {
576 return il.size() == 0;
577 }
578
579 template<typename _tRange>
580 yconstfn auto
581 data(_tRange& c) -> decltype(c.data())
582 {
583 return c.data();
584 }
585 template<typename _tRange>
586 yconstfn auto
587 data(const _tRange& c) -> decltype(c.data())
588 {
589 return c.data();
590 }
591 template<typename _type, size_t _vN>
592 yconstfn _type*
593 data(_type(&array)[_vN]) ynothrow
594 {
595 return array;
596 }
597 template<typename _tElem>
598 yconstfn const _tElem*
599 data(std::initializer_list<_tElem> il) ynothrow
600 {
601 return il.begin();
602 }
603 #endif
604
605 } // inline namespace cpp2017;
606
608 template<typename _type, size_t _vN>
609 yconstfn _type*
610 data(_type(&&array)[_vN]) ynothrow
611 {
612 return array;
613 }
615
617 inline namespace cpp2014
618 {
619
621
622 #if __cplusplus <= 201402L
623
625 template<typename _tElem>
626 yconstfn const _tElem*
627 cbegin(std::initializer_list<_tElem> il) ynothrow
628 {
629 return il.begin();
630 }
631
633 template<typename _tElem>
634 yconstfn const _tElem*
635 cend(std::initializer_list<_tElem> il) ynothrow
636 {
637 return il.end();
638 }
639
641 template<typename _tElem>
642 yconstfn reverse_iterator<const _tElem*>
643 crbegin(std::initializer_list<_tElem> il) ynothrow
644 {
645 return ystdex::rbegin(il);
646 }
647
649 template<typename _tElem>
650 yconstfn reverse_iterator<const _tElem*>
651 crend(std::initializer_list<_tElem> il) ynothrow
652 {
653 return ystdex::rend(il);
654 }
656 #endif
657
658
659 } // inline namespace cpp2014;
660
666 template<typename _tRange>
667 using range_iterator_t = decltype(ystdex::begin(std::declval<_tRange&>()));
668
669 template<typename _tRange>
670 using range_const_iterator_t
671 = decltype(ystdex::cbegin(std::declval<const _tRange&>()));
673
674 } // namespace ystdex;
675
676 #endif
677
ystdex::cpp2017::reverse_iterator::operator*
reference operator*() const
Definition: range.hpp:166
ystdex::cpp2017::reverse_iterator::pointer
typename traits_type::pointer pointer
Definition: range.hpp:125
ystdex::cpp2017::reverse_iterator::iterator_category
typename traits_type::iterator_category iterator_category
Definition: range.hpp:122
ystdex::cpp2017::reverse_iterator::base
_tIter base() const
Definition: range.hpp:160
YB_ATTR_nodiscard
#define YB_ATTR_nodiscard
标记返回值不被忽略的属性。
Definition: ydef.h:715
x
const EncapsulationBase & x
Definition: NPLA1Forms.cpp:1536
size
size_t size
Definition: memory_resource.cpp:295
ystdex::cpp2017::reverse_iterator::reverse_iterator
reverse_iterator(_tIter x)
Definition: range.hpp:142
CHRLib::c
c
Definition: CharacterProcessing.h:84
ystdex::data
_type * data(_type(&&array)[_vN])
Definition: range.hpp:610
ystdex::cpp2017::reverse_iterator
Definition: range.hpp:116
ystdex::cpp2014::crbegin
reverse_iterator< const _tElem * > crbegin(std::initializer_list< _tElem > il)
Definition: range.hpp:643
ystdex::cpp2017::reverse_iterator::operator->
pointer operator->() const
Definition: range.hpp:178
ystdex::cpp2014::cbegin
const _tElem * cbegin(std::initializer_list< _tElem > il)
Definition: range.hpp:627
ystdex::cpp2017::reverse_iterator::difference_type
typename traits_type::difference_type difference_type
Definition: range.hpp:124
ynoexcept_spec
#define ynoexcept_spec(...)
表达式 noexcept 异常规范。
Definition: ydef.h:1181
ystdex::cpp2017::reverse_iterator::operator+=
reverse_iterator & operator+=(difference_type n)
Definition: range.hpp:214
ystdex::rend
reverse_iterator< _type * > rend(_type(&&array)[_vN])
Definition: range.hpp:397
ystdex::cpp2017::reverse_iterator::operator-
auto operator-(const reverse_iterator< _tIter > &x, const reverse_iterator< _tIter2 > &y) -> decltype(y.base() - x.base())
Definition: range.hpp:307
yconstfn_relaxed
#define yconstfn_relaxed
指定编译时没有 C++11 限制和隐式成员 const 的常量函数。
Definition: ydef.h:1097
ystdex::range_const_iterator_t
decltype(ystdex::cbegin(std::declval< const _tRange & >())) range_const_iterator_t
Definition: range.hpp:671
ystdex::cpp2017::reverse_iterator::operator+
reverse_iterator operator+(difference_type n) const
Definition: range.hpp:221
ystdex::cpp2017::rbegin
reverse_iterator< const _tElem * > rbegin(std::initializer_list< _tElem > il)
Definition: range.hpp:472
ystdex::cpp2014::cbegin
auto cbegin(const _tRange &c) -> decltype(ystdex::begin(c))
Definition: range.hpp:418
ystdex::cpp2014::crend
reverse_iterator< const _tElem * > crend(std::initializer_list< _tElem > il)
Definition: range.hpp:651
ystdex::cpp2014::cend
auto cend(const _tRange &c) -> decltype(ystdex::end(c))
Definition: range.hpp:427
ystdex::cpp2017::reverse_iterator::operator==
friend bool operator==(const reverse_iterator &x, const reverse_iterator< _tIter2 > &y)
Definition: range.hpp:253
ystdex::cpp2017::rend
reverse_iterator< const _tElem * > rend(std::initializer_list< _tElem > il)
Definition: range.hpp:499
ystdex::cpp2017::reverse_iterator::operator-=
reverse_iterator & operator-=(difference_type n)
Definition: range.hpp:227
ystdex::cpp2017::reverse_iterator::iterator_type
_tIter iterator_type
Definition: range.hpp:121
ystdex::cpp2017::size
auto size(const _tRange &c) -> decltype(c.size())
Definition: range.hpp:540
ystdex::cpp2017::data
auto data(_tRange &c) -> decltype(c.data())
Definition: range.hpp:581
ystdex::end
_type * end(_type(&&array)[_vN])
Definition: range.hpp:383
ystdex::begin
_type * begin(_type(&&array)[_vN])
Definition: range.hpp:375
ystdex::cpp2017::end
auto end(_tRange &c) -> decltype(c.end())
Definition: range.hpp:345
ystdex::cpp2017::reverse_iterator::operator!=
friend bool operator!=(const reverse_iterator &x, const reverse_iterator< _tIter2 > &y)
Definition: range.hpp:267
ystdex::cpp2017::reverse_iterator::operator-
reverse_iterator operator-(difference_type n) const
Definition: range.hpp:234
ystdex::cpp2017::reverse_iterator::traits_type
std::iterator_traits< _tIter > traits_type
Definition: range.hpp:118
ystdex::cpp2017::reverse_iterator::reverse_iterator
reverse_iterator()
Definition: range.hpp:137
ystdex::cpp2017::reverse_iterator::operator<
friend bool operator<(const reverse_iterator &x, const reverse_iterator< _tIter2 > &y)
Definition: range.hpp:260
YSLib::UI::y
SPos SPos y
Definition: YWidget.cpp:44
ystdex::cpp2014::cend
const _tElem * cend(std::initializer_list< _tElem > il)
Definition: range.hpp:635
ystdex::cpp2017::rend
auto rend(_tRange &c) -> decltype(c.rend())
Definition: range.hpp:479
ystdex::cpp2017::empty
auto empty(const _tRange &c) -> decltype(c.empty())
Definition: range.hpp:562
ystdex::cpp2017::reverse_iterator::reference
typename traits_type::reference reference
Definition: range.hpp:126
ystdex::cpp2017::reverse_iterator::reverse_iterator
reverse_iterator(const reverse_iterator< _tOther > &u)
Definition: range.hpp:147
ystdex::cpp2017::crbegin
auto crbegin(const _tRange &c) -> decltype(ystdex::rbegin(c))
Definition: range.hpp:506
ystdex::cpp2017::rbegin
auto rbegin(_tRange &c) -> decltype(c.rbegin())
Definition: range.hpp:451
ystdex::cpp2017::reverse_iterator::operator<=
friend bool operator<=(const reverse_iterator &x, const reverse_iterator< _tIter2 > &y)
Definition: range.hpp:288
ystdex
<memory> 特性测试宏。
Definition: ydef.h:1262
ystdex::cpp2017::crend
auto crend(const _tRange &c) -> decltype(ystdex::rend(c))
Definition: range.hpp:513
ystdex::cpp2017::reverse_iterator::operator=
reverse_iterator & operator=(const reverse_iterator< _tOther > &u)
Definition: range.hpp:153
ystdex::cpp2017::reverse_iterator::operator>
friend bool operator>(const reverse_iterator &x, const reverse_iterator< _tIter2 > &y)
Definition: range.hpp:274
ystdex::cpp2017::reverse_iterator::operator++
reverse_iterator operator++(int)
Definition: range.hpp:190
ystdex::cpp2017::reverse_iterator::operator>=
friend bool operator>=(const reverse_iterator &x, const reverse_iterator< _tIter2 > &y)
Definition: range.hpp:281
ystdex::addressof
enable_if_t< has_no_overloaded_addressof< _type >::value, _type * > addressof(_type &r)
尝试对非重载 operator& 提供 constexpr 的 std::addressof 替代。
Definition: addressof.hpp:131
ystdex::cpp2017::reverse_iterator::value_type
typename traits_type::value_type value_type
Definition: range.hpp:123
ystdex::range_iterator_t
decltype(ystdex::begin(std::declval< _tRange & >())) range_iterator_t
Definition: range.hpp:667
addressof.hpp
一元操作符 & 和取指针的相关接口。
yimpl
#define yimpl(...)
实现标签。
Definition: ydef.h:413
ystdex::rbegin
reverse_iterator< _type * > rbegin(_type(&&array)[_vN])
Definition: range.hpp:390
ystdex::cpp2017::reverse_iterator::operator++
reverse_iterator & operator++()
Definition: range.hpp:184
ynothrow
#define ynothrow
YSLib 无异常抛出保证：若支持 noexcept 关键字， 指定特定的 noexcept 异常规范。
Definition: ydef.h:1199
ystdex::cpp2017::reverse_iterator::operator+
friend reverse_iterator operator+(difference_type n, const reverse_iterator &x)
Definition: range.hpp:295
yconstfn
#define yconstfn
指定编译时常量函数。
Definition: ydef.h:1073
ystdex::cpp2017::begin
auto begin(_tRange &c) -> decltype(c.begin())
Definition: range.hpp:323
ystdex::cpp2017::reverse_iterator::operator--
reverse_iterator & operator--()
Definition: range.hpp:199
ystdex::cpp2017::reverse_iterator::current
_tIter current
Definition: range.hpp:129
ystdex::cpp2017::reverse_iterator::operator--
reverse_iterator operator--(int)
Definition: range.hpp:205