YACLib
C++ library for concurrent tasks execution
Loading...
Searching...
No Matches
iterator.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <iterator>
4
5#if YACLIB_CXX_STANDARD < 20 || \
6 (defined(__clang__) && __clang_major__ <= 12) // std::counted_iterator not implemented in stl
7
8namespace yaclib::detail {
9
11
12template <typename It>
14 public:
15 using iterator_category = typename std::iterator_traits<It>::iterator_category;
16 using value_type = typename std::iterator_traits<It>::value_type;
17 using difference_type = typename std::iterator_traits<It>::difference_type;
18 using pointer = typename std::iterator_traits<It>::pointer;
19 using reference = typename std::iterator_traits<It>::reference;
20
21 counted_iterator() : _it{}, _n{0} {
22 }
23
25 }
26
28 return *_it;
29 }
30
32 return _it.operator->();
33 }
34
36 ++_it;
37 --_n;
38 return *this;
39 }
40
42 auto tmp = *this;
43 ++(*this);
44 return tmp;
45 }
46
47 bool operator==(const counted_iterator& rhs) const {
48 return _it == rhs._it;
49 }
50
51 bool operator!=(const counted_iterator& rhs) const {
52 return !(*this == rhs);
53 }
54
55 private:
56 It _it;
58
60 return lhs._n == 0;
61 }
62
64 return rhs == lhs;
65 }
66
68 return !(lhs == rhs);
69 }
70
72 return !(lhs == rhs);
73 }
74
78
82};
83
84} // namespace yaclib::detail
85
86namespace yaclib_std {
87
88using default_sentinel_t = yaclib::detail::DefaultSentinel;
89
90inline constexpr default_sentinel_t default_sentinel{};
91
93
94} // namespace yaclib_std
95
96#else
97
98namespace yaclib_std {
99
100using std::default_sentinel_t;
101
102inline constexpr default_sentinel_t default_sentinel{};
103
104using std::counted_iterator;
105
106} // namespace yaclib_std
107
108#endif
typename std::iterator_traits< It >::difference_type difference_type
Definition iterator.hpp:17
typename std::iterator_traits< It >::pointer pointer
Definition iterator.hpp:18
typename std::iterator_traits< It >::iterator_category iterator_category
Definition iterator.hpp:15
friend bool operator==(DefaultSentinel lhs, const counted_iterator< It > &rhs)
Definition iterator.hpp:63
counted_iterator(It it, difference_type n)
Definition iterator.hpp:24
friend bool operator!=(const counted_iterator< It > &lhs, DefaultSentinel rhs)
Definition iterator.hpp:67
friend difference_type operator-(DefaultSentinel lhs, const counted_iterator< It > rhs)
Definition iterator.hpp:79
bool operator==(const counted_iterator &rhs) const
Definition iterator.hpp:47
friend bool operator==(const counted_iterator< It > &lhs, DefaultSentinel rhs)
Definition iterator.hpp:59
typename std::iterator_traits< It >::reference reference
Definition iterator.hpp:19
bool operator!=(const counted_iterator &rhs) const
Definition iterator.hpp:51
friend bool operator!=(DefaultSentinel lhs, const counted_iterator< It > &rhs)
Definition iterator.hpp:71
counted_iterator operator++(int)
Definition iterator.hpp:41
counted_iterator & operator++()
Definition iterator.hpp:35
typename std::iterator_traits< It >::value_type value_type
Definition iterator.hpp:16
friend difference_type operator-(const counted_iterator< It > lhs, DefaultSentinel rhs)
Definition iterator.hpp:75
Contract< V, T > MakeContract()
Creates related future and promise.
Definition contract.hpp:25