19
19
#include " types.h"
20
20
21
21
template <typename R>
22
- concept HasFreeEmpty = requires (R r) { std::ranges::empty (r); };
23
-
24
- template <typename R>
25
- concept HasMemberEmpty = requires (R r) {
22
+ concept HasEmpty = requires (R r) {
23
+ std::ranges::empty (r);
26
24
{ r.empty () } -> std::same_as<bool >;
27
25
};
28
26
29
- constexpr void test_empty_iota () {
27
+ constexpr void test_empty_iota_sfinae () {
30
28
std::vector<int > ev;
31
29
32
30
// Both parameters are non-const
33
31
{
34
32
auto iv = std::views::iota (std::ranges::begin (ev), std::ranges::end (ev));
35
33
36
- static_assert (HasFreeEmpty<decltype (iv)>);
37
- static_assert (HasMemberEmpty<decltype (iv)>);
38
-
39
- assert (iv.empty ());
34
+ static_assert (HasEmpty<decltype (iv)>);
40
35
}
41
36
// Left parameter is const
42
37
{
43
38
auto iv = std::views::iota (std::ranges::begin (std::as_const (ev)), std::ranges::end (ev));
44
39
45
- static_assert (HasFreeEmpty<decltype (iv)>);
46
- static_assert (HasMemberEmpty<decltype (iv)>);
47
-
48
- assert (iv.empty ());
40
+ static_assert (HasEmpty<decltype (iv)>);
49
41
}
50
42
// Right parameter is const
51
43
{
52
44
auto iv = std::views::iota (std::ranges::begin (ev), std::ranges::end (std::as_const (ev)));
53
45
54
- static_assert (HasFreeEmpty<decltype (iv)>);
55
- static_assert (HasMemberEmpty<decltype (iv)>);
56
-
57
- assert (iv.empty ());
46
+ static_assert (HasEmpty<decltype (iv)>);
58
47
}
59
48
// Both parameters are const
60
49
{
61
50
auto iv = std::views::iota (std::ranges::begin (std::as_const (ev)), std::ranges::end (std::as_const (ev)));
62
51
63
- static_assert (HasFreeEmpty<decltype (iv)>);
64
- static_assert (HasMemberEmpty<decltype (iv)>);
52
+ static_assert (HasEmpty<decltype (iv)>);
53
+ }
54
+ }
65
55
66
- assert (iv.empty ());
56
+ constexpr void test_nonempty_iota_sfinae () {
57
+ // Default ctr
58
+ {
59
+ std::ranges::iota_view<Int42<DefaultTo42>> iv;
60
+
61
+ static_assert (HasEmpty<decltype (iv)>);
62
+ }
63
+ // Value pass
64
+ {
65
+ std::ranges::iota_view<SomeInt> iv (SomeInt (94 ));
66
+
67
+ static_assert (HasEmpty<decltype (iv)>);
68
+ }
69
+
70
+ {
71
+ std::vector<char > v;
72
+ auto it = std::back_inserter (v);
73
+ auto iv = std::views::iota (it);
74
+
75
+ static_assert (HasEmpty<decltype (iv)>);
76
+ }
77
+ {
78
+ std::vector<char > v{' b' , ' a' , ' b' , ' a' , ' z' , ' m' , ' t' };
79
+ auto it = std::back_inserter (v);
80
+ auto iv = std::views::iota (it);
81
+
82
+ static_assert (HasEmpty<decltype (iv)>);
67
83
}
84
+ }
85
+
86
+ constexpr void test_empty_iota () {
87
+ std::vector<int > ev;
68
88
69
- std::vector<char > v{' b' , ' a' , ' b' , ' a' , ' z' , ' m' , ' t' };
70
- auto fv = v | std::views::filter ([](auto val) { return val == ' 0' ; });
89
+ // Both parameters are non-const
90
+ {
91
+ auto iv = std::views::iota (std::ranges::begin (ev), std::ranges::end (ev));
92
+
93
+ assert (iv.empty ());
94
+ }
95
+ // Left parameter is const
96
+ {
97
+ auto iv = std::views::iota (std::ranges::begin (std::as_const (ev)), std::ranges::end (ev));
71
98
99
+ assert (iv.empty ());
100
+ }
101
+ // Right parameter is const
72
102
{
73
- auto iv = std::views::iota (std::ranges::begin (fv ), std::ranges::end (fv ));
103
+ auto iv = std::views::iota (std::ranges::begin (ev ), std::ranges::end (std::as_const (ev) ));
74
104
75
- static_assert (HasFreeEmpty<decltype (iv)>);
76
- static_assert (HasMemberEmpty<decltype (iv)>);
105
+ assert (iv.empty ());
106
+ }
107
+ // Both parameters are const
108
+ {
109
+ auto iv = std::views::iota (std::ranges::begin (std::as_const (ev)), std::ranges::end (std::as_const (ev)));
77
110
78
111
assert (iv.empty ());
79
112
}
@@ -84,18 +117,12 @@ constexpr void test_nonempty_iota() {
84
117
{
85
118
std::ranges::iota_view<Int42<DefaultTo42>> iv;
86
119
87
- static_assert (HasFreeEmpty<decltype (iv)>);
88
- static_assert (HasMemberEmpty<decltype (iv)>);
89
-
90
120
assert (!iv.empty ());
91
121
}
92
122
// Value pass
93
123
{
94
124
std::ranges::iota_view<SomeInt> iv (SomeInt (94 ));
95
125
96
- static_assert (HasFreeEmpty<decltype (iv)>);
97
- static_assert (HasMemberEmpty<decltype (iv)>);
98
-
99
126
assert (!iv.empty ());
100
127
}
101
128
@@ -104,19 +131,13 @@ constexpr void test_nonempty_iota() {
104
131
auto it = std::back_inserter (v);
105
132
auto iv = std::views::iota (it);
106
133
107
- static_assert (HasFreeEmpty<decltype (iv)>);
108
- static_assert (HasMemberEmpty<decltype (iv)>);
109
-
110
134
assert (!iv.empty ());
111
135
}
112
136
{
113
137
std::vector<char > v{' b' , ' a' , ' b' , ' a' , ' z' , ' m' , ' t' };
114
138
auto it = std::back_inserter (v);
115
139
auto iv = std::views::iota (it);
116
140
117
- static_assert (HasFreeEmpty<decltype (iv)>);
118
- static_assert (HasMemberEmpty<decltype (iv)>);
119
-
120
141
assert (!iv.empty ());
121
142
}
122
143
}
0 commit comments