5
5
6
6
export module bounded.std_iterator;
7
7
8
- import bounded.character;
9
8
import bounded.bounded_integer;
9
+ import bounded.character;
10
+ import bounded.concepts;
10
11
import bounded.declval;
11
12
import bounded.integer;
12
13
@@ -33,9 +34,28 @@ concept std_random_access_iterator =
33
34
))
34
35
);
35
36
37
+ template <typename T>
38
+ concept hashable = default_constructible<std::hash<T>>;
39
+
40
+ template <typename T, typename Key, typename Mapped>
41
+ concept std_ordered_map_iterator =
42
+ std::same_as<T, typename std::map<Key, Mapped>::iterator> or
43
+ std::same_as<T, typename std::map<Key, Mapped>::const_iterator> or
44
+ std::same_as<T, typename std::multimap<Key, Mapped>::iterator> or
45
+ std::same_as<T, typename std::multimap<Key, Mapped>::const_iterator>;
46
+
47
+ template <typename T, typename Key, typename Mapped>
48
+ concept std_unordered_map_iterator =
49
+ hashable<Key> and (
50
+ std::same_as<T, typename std::unordered_map<Key, Mapped>::iterator> or
51
+ std::same_as<T, typename std::unordered_map<Key, Mapped>::const_iterator> or
52
+ std::same_as<T, typename std::unordered_multimap<Key, Mapped>::iterator> or
53
+ std::same_as<T, typename std::unordered_multimap<Key, Mapped>::const_iterator>
54
+ );
55
+
36
56
template <
37
57
typename T,
38
- typename value_type = std:: remove_cvref_t < decltype (*declval<T>())> ,
58
+ typename value_type,
39
59
typename key_type = typename value_type::first_type,
40
60
typename mapped_type = typename value_type::second_type
41
61
>
@@ -44,31 +64,31 @@ concept std_map_bidirectional_iterator =
44
64
!std::is_reference_v<key_type> and !std::is_const_v<key_type> and
45
65
!std::is_reference_v<mapped_type> and !std::is_const_v<mapped_type> and
46
66
(
47
- std::same_as<T, typename std::map<key_type, mapped_type>::iterator> or
48
- std::same_as<T, typename std::map<key_type, mapped_type>::const_iterator> or
49
- std::same_as<T, typename std::multimap<key_type, mapped_type>::iterator> or
50
- std::same_as<T, typename std::multimap<key_type, mapped_type>::const_iterator> or
51
- std::same_as<T, typename std::unordered_map<key_type, mapped_type>::iterator> or
52
- std::same_as<T, typename std::unordered_map<key_type, mapped_type>::const_iterator> or
53
- std::same_as<T, typename std::unordered_multimap<key_type, mapped_type>::iterator> or
54
- std::same_as<T, typename std::unordered_multimap<key_type, mapped_type>::const_iterator>
67
+ std_ordered_map_iterator<T, key_type, mapped_type> or
68
+ std_unordered_map_iterator<T, key_type, mapped_type>
69
+ );
70
+
71
+ template <typename T, typename value_type>
72
+ concept std_unordered_set_iterator =
73
+ hashable<value_type> and (
74
+ std::same_as<T, typename std::unordered_set<value_type>::iterator> or
75
+ std::same_as<T, typename std::unordered_set<value_type>::const_iterator> or
76
+ std::same_as<T, typename std::unordered_multiset<value_type>::iterator> or
77
+ std::same_as<T, typename std::unordered_multiset<value_type>::const_iterator>
55
78
);
56
79
57
80
template <typename T, typename value_type = std::remove_cvref_t <decltype (*declval<T>())>>
58
81
concept std_bidirectional_iterator =
59
82
!std::is_void_v<value_type> and !std::is_reference_v<value_type> and !std::is_const_v<value_type> and (
60
83
std_random_access_iterator<T> or
61
- std_map_bidirectional_iterator<T> or
84
+ std_map_bidirectional_iterator<T, value_type> or
85
+ std_unordered_set_iterator<T, value_type> or
62
86
std::same_as<T, typename std::list<value_type>::iterator> or
63
87
std::same_as<T, typename std::list<value_type>::const_iterator> or
64
88
std::same_as<T, typename std::set<value_type>::iterator> or
65
89
std::same_as<T, typename std::set<value_type>::const_iterator> or
66
90
std::same_as<T, typename std::multiset<value_type>::iterator> or
67
- std::same_as<T, typename std::multiset<value_type>::const_iterator> or
68
- std::same_as<T, typename std::unordered_set<value_type>::iterator> or
69
- std::same_as<T, typename std::unordered_set<value_type>::const_iterator> or
70
- std::same_as<T, typename std::unordered_multiset<value_type>::iterator> or
71
- std::same_as<T, typename std::unordered_multiset<value_type>::const_iterator>
91
+ std::same_as<T, typename std::multiset<value_type>::const_iterator>
72
92
);
73
93
74
94
template <typename T, typename value_type = std::remove_cvref_t <decltype (*declval<T>())>>
@@ -117,4 +137,16 @@ static_assert(bounded::std_iterator<std::vector<int>::iterator>);
117
137
118
138
static_assert (std::same_as<decltype (std::vector<int >::iterator() + bounded::constant<1 >), std::vector<int >::iterator>);
119
139
140
+ struct iterator {
141
+ struct value_type {
142
+ };
143
+ constexpr auto operator *() const -> value_type {
144
+ return value_type ();
145
+ }
146
+ constexpr auto operator ++() & -> iterator & {
147
+ return *this ;
148
+ }
149
+ };
150
+ static_assert (!bounded::std_iterator<iterator>);
151
+
120
152
} // namespace
0 commit comments