Skip to content

Commit d29d145

Browse files
committed
Update freestanding tests
1 parent b32bf5c commit d29d145

File tree

1 file changed

+112
-153
lines changed

1 file changed

+112
-153
lines changed

tests/beman/inplace_vector/freestanding.test.cpp

Lines changed: 112 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -3,178 +3,137 @@
33
#include <gtest/gtest.h>
44

55
// constexpr void assign(InputIterator first, InputIterator last);
6-
template <typename, typename = std::void_t<>>
7-
struct has_assign_iterator : std::false_type {};
86
template <typename T>
9-
struct has_assign_iterator<T, std::void_t<decltype(std::declval<T>().assign(
10-
std::declval<typename T::iterator>(),
11-
std::declval<typename T::iterator>()))>>
12-
: std::true_type {};
7+
concept has_assign_iterator = requires(T t, T::iterator it) {
8+
{ t.assign(it, it) } -> std::same_as<void>;
9+
};
1310

1411
// constexpr void assign_range(R&& rg);
15-
template <typename T, typename R, typename = void>
16-
struct has_assign_range : std::false_type {};
1712
template <typename T, typename R>
18-
struct has_assign_range<T, R,
19-
std::void_t<decltype(std::declval<T &>().assign_range(
20-
std::declval<R &&>()))>> : std::true_type {};
13+
concept has_assign_range = requires(T t, R rg) {
14+
{ t.assign_range(rg) } -> std::same_as<void>;
15+
};
2116

2217
// constexpr void assign(size_type n, const T& u);
23-
template <typename T, typename = void>
24-
struct has_assign_size : std::false_type {};
2518
template <typename T>
26-
struct has_assign_size<T, std::void_t<decltype(std::declval<T>().assign(
27-
std::declval<typename T::size_type>(),
28-
std::declval<typename T::const_reference>()))>>
29-
: std::true_type {};
19+
concept has_assign_size = requires(T t, T::size_type n, T::const_reference u) {
20+
{ t.assign(n, u) } -> std::same_as<void>;
21+
};
3022

3123
// constexpr void assign(initializer_list il);
32-
template <typename T, typename = void>
33-
struct has_assign_initializer : std::false_type {};
3424
template <typename T>
35-
struct has_assign_initializer<
36-
T, std::void_t<decltype(std::declval<T>().assign(
37-
std::declval<std::initializer_list<typename T::value_type>>()))>>
38-
: std::true_type {};
25+
concept has_assign_initializer =
26+
requires(T t, std::initializer_list<typename T::value_type> il) {
27+
{ t.assign(il) } -> std::same_as<void>;
28+
};
3929

4030
// constexpr void resize(size_type sz);
41-
template <typename T, typename = void> struct has_resize : std::false_type {};
4231
template <typename T>
43-
struct has_resize<T, std::void_t<decltype(std::declval<T>().resize(
44-
std::declval<typename T::size_type>()))>>
45-
: std::true_type {};
32+
concept has_resize = requires(T t, T::size_type sz) {
33+
{ t.resize(sz) } -> std::same_as<void>;
34+
};
4635

4736
// constexpr void resize(size_type sz, const T& c);
48-
template <typename T, typename = void>
49-
struct has_resize_ref : std::false_type {};
5037
template <typename T>
51-
struct has_resize_ref<T, std::void_t<decltype(std::declval<T>().resize(
52-
std::declval<typename T::size_type>(),
53-
std::declval<typename T::const_reference>()))>>
54-
: std::true_type {};
38+
concept has_resize_ref =
39+
requires(T t, typename T::size_type sz, T::const_reference c) {
40+
{ t.resize(sz, c) } -> std::same_as<void>;
41+
};
5542

5643
// void reserve(size_type n);
57-
template <typename T, typename = void> struct has_reserve : std::false_type {};
5844
template <typename T>
59-
struct has_reserve<T, std::void_t<decltype(std::declval<T>().reserve(
60-
std::declval<typename T::size_type>()))>>
61-
: std::true_type {};
45+
concept has_reserve = requires(T t, T::size_type n) {
46+
{ t.reserve(n) } -> std::same_as<void>;
47+
};
6248

6349
// constexpr reference at(size_type n);
64-
template <typename T, typename = void> struct has_at : std::false_type {};
6550
template <typename T>
66-
struct has_at<T, std::void_t<decltype(std::declval<T>().at(
67-
std::declval<typename T::size_type>()))>>
68-
: std::true_type {};
51+
concept has_at = requires(T t, T::size_type n) {
52+
{ t.at(n) } -> std::same_as<typename T::reference>;
53+
};
6954

7055
// constexpr const_reference at(size_type n) const;
71-
template <typename T, typename = void> struct has_const_at : std::false_type {};
7256
template <typename T>
73-
struct has_const_at<T, std::void_t<decltype(std::declval<const T>().at(
74-
std::declval<typename T::size_type>()))>>
75-
: std::true_type {};
57+
concept has_const_at = requires(const T t, T::size_type n) {
58+
{ t.at(n) } -> std::same_as<typename T::const_reference>;
59+
};
7660

77-
// emplace_back(Args&&... args);
78-
template <typename T, typename = void>
79-
struct has_emplace_back : std::false_type {};
61+
// constexpr reference emplace_back(Args&&... args);
8062
template <typename T>
81-
struct has_emplace_back<T, std::void_t<decltype(std::declval<T>().emplace_back(
82-
std::declval<typename T::value_type>()))>>
83-
: std::true_type {};
63+
concept has_emplace_back = requires(T t, T::value_type v) {
64+
{ t.emplace_back(v) } -> std::same_as<typename T::reference>;
65+
};
8466

8567
// constexpr reference push_back(const T& x);
86-
template <typename T, typename = void>
87-
struct has_push_back_const : std::false_type {};
8868
template <typename T>
89-
struct has_push_back_const<T,
90-
std::void_t<decltype(std::declval<T>().push_back(
91-
std::declval<typename T::const_reference>()))>>
92-
: std::true_type {};
69+
concept has_push_back_const = requires(T t, typename T::const_reference x) {
70+
{ t.push_back(x) } -> std::same_as<typename T::reference>;
71+
};
9372

9473
// constexpr reference push_back(T&& x);
95-
template <typename T, typename = void>
96-
struct has_push_back_rv : std::false_type {};
9774
template <typename T>
98-
struct has_push_back_rv<T, std::void_t<decltype(std::declval<T>().push_back(
99-
std::declval<typename T::value_type>()))>>
100-
: std::true_type {};
75+
concept has_push_back_rv = requires(T t, typename T::value_type x) {
76+
{
77+
t.push_back(static_cast<typename T::value_type &&>(x))
78+
} -> std::same_as<typename T::reference>;
79+
};
10180

10281
// constexpr void append_range(R&& rg);
103-
template <typename T, typename R, typename = void>
104-
struct has_append_range : std::false_type {};
10582
template <typename T, typename R>
106-
struct has_append_range<
107-
T, R,
108-
std::void_t<decltype(std::declval<T>().append_range(std::declval<R &&>()))>>
109-
: std::true_type {};
83+
concept has_append_range = requires(T t, R &&r) {
84+
{ t.append_range(r) } -> std::same_as<void>;
85+
};
11086

11187
// constexpr iterator emplace(const_iterator position, Args&&... args);
112-
template <typename T, typename = void> struct has_emplace : std::false_type {};
11388
template <typename T>
114-
struct has_emplace<T, std::void_t<decltype(std::declval<T>().emplace(
115-
std::declval<typename T::const_iterator>(),
116-
std::declval<typename T::value_type>()))>>
117-
: std::true_type {};
89+
concept has_emplace = requires(T t, T::const_iterator it, T::value_type v) {
90+
{ t.emplace(it, v) } -> std::same_as<typename T::iterator>;
91+
};
11892

11993
// constexpr iterator insert(const_iterator position, const T& x);
120-
template <typename T, typename = void>
121-
struct has_insert_const : std::false_type {};
12294
template <typename T>
123-
struct has_insert_const<T, std::void_t<decltype(std::declval<T>().insert(
124-
std::declval<typename T::const_iterator>(),
125-
std::declval<typename T::const_reference>()))>>
126-
: std::true_type {};
95+
concept has_insert_const =
96+
requires(T t, T::const_iterator it, T::const_reference x) {
97+
{ t.insert(it, x) } -> std::same_as<typename T::iterator>;
98+
};
12799

128100
// constexpr iterator insert(const_iterator position, T&& x);
129-
template <typename T, typename = void>
130-
struct has_insert_rv : std::false_type {};
131101
template <typename T>
132-
struct has_insert_rv<T, std::void_t<decltype(std::declval<T>().insert(
133-
std::declval<typename T::const_iterator>(),
134-
std::declval<typename T::value_type>()))>>
135-
: std::true_type {};
102+
concept has_insert_rv = requires(T t, T::const_iterator it, T::value_type &&x) {
103+
{
104+
t.insert(it, static_cast<typename T::value_type &&>(x))
105+
} -> std::same_as<typename T::iterator>;
106+
};
136107

137108
// constexpr iterator insert(const_iterator position, size_type n, const T& x);
138-
template <typename T, typename = void>
139-
struct has_insert_size : std::false_type {};
140109
template <typename T>
141-
struct has_insert_size<T, std::void_t<decltype(std::declval<T>().insert(
142-
std::declval<typename T::const_iterator>(),
143-
std::declval<typename T::size_type>(),
144-
std::declval<typename T::const_reference>()))>>
145-
: std::true_type {};
110+
concept has_insert_size =
111+
requires(T t, T::const_iterator it, T::size_type n, T::const_reference x) {
112+
{ t.insert(it, n, x) } -> std::same_as<typename T::iterator>;
113+
};
146114

147115
// constexpr iterator insert(const_iterator position, InputIterator first,
148116
// InputIterator last);
149-
template <typename T, typename = void>
150-
struct has_insert_iterator : std::false_type {};
151117
template <typename T>
152-
struct has_insert_iterator<T, std::void_t<decltype(std::declval<T>().insert(
153-
std::declval<typename T::const_iterator>(),
154-
std::declval<typename T::iterator>(),
155-
std::declval<typename T::iterator>()))>>
156-
: std::true_type {};
118+
concept has_insert_iterator =
119+
requires(T t, T::const_iterator it, T::iterator first, T::iterator last) {
120+
{ t.insert(it, first, last) } -> std::same_as<typename T::iterator>;
121+
};
157122

158123
// InputIterator last); constexpr iterator insert_range(const_iterator position,
159124
// R&& rg);
160-
template <typename T, typename R, typename = void>
161-
struct has_insert_range : std::false_type {};
162125
template <typename T, typename R>
163-
struct has_insert_range<
164-
T, R,
165-
std::void_t<decltype(std::declval<T>().insert_range(
166-
std::declval<typename T::const_iterator>(), std::declval<R &&>()))>>
167-
: std::true_type {};
126+
concept has_insert_range = requires(T t, T::const_iterator it, R &&r) {
127+
{ t.insert_range(it, r) } -> std::same_as<typename T::iterator>;
128+
};
168129

169130
// constexpr iterator insert(const_iterator position, initializer_list il);
170-
template <typename T, typename = void>
171-
struct has_insert_initializer : std::false_type {};
172131
template <typename T>
173-
struct has_insert_initializer<
174-
T, std::void_t<decltype(std::declval<T>().insert(
175-
std::declval<typename T::const_iterator>(),
176-
std::declval<std::initializer_list<typename T::value_type>>()))>>
177-
: std::true_type {};
132+
concept has_insert_initializer =
133+
requires(T t, typename T::const_iterator it,
134+
std::initializer_list<typename T::value_type> il) {
135+
{ t.insert(it, il) } -> std::same_as<typename T::iterator>;
136+
};
178137

179138
TEST(Freestanding, deleted) {
180139

@@ -213,85 +172,85 @@ TEST(Freestanding, deleted) {
213172
static_assert(!std::is_assignable_v<FIV &, initializer_list>);
214173

215174
// constexpr void assign(InputIterator first, InputIterator last)
216-
static_assert(has_assign_iterator<IV>::value);
217-
static_assert(!has_assign_iterator<FIV>::value);
175+
static_assert(has_assign_iterator<IV>);
176+
static_assert(!has_assign_iterator<FIV>);
218177

219178
// constexpr void assign_range(R&& rg);
220-
static_assert(has_assign_range<IV, range>::value);
221-
static_assert(!has_assign_range<FIV, range>::value);
179+
static_assert(has_assign_range<IV, range>);
180+
static_assert(!has_assign_range<FIV, range>);
222181

223182
// constexpr void assign(size_type n, const T& u);
224-
static_assert(has_assign_size<IV>::value);
225-
static_assert(!has_assign_size<FIV>::value);
183+
static_assert(has_assign_size<IV>);
184+
static_assert(!has_assign_size<FIV>);
226185

227186
// constexpr void assign(initializer_list il);
228-
static_assert(has_assign_initializer<IV>::value);
229-
static_assert(!has_assign_initializer<FIV>::value);
187+
static_assert(has_assign_initializer<IV>);
188+
static_assert(!has_assign_initializer<FIV>);
230189

231190
// constexpr void resize(size_type sz);
232-
static_assert(has_resize<IV>::value);
233-
static_assert(!has_resize<FIV>::value);
191+
static_assert(has_resize<IV>);
192+
static_assert(!has_resize<FIV>);
234193

235194
// constexpr void resize(size_type sz, const T& c);
236-
static_assert(has_resize_ref<IV>::value);
237-
static_assert(!has_resize_ref<FIV>::value);
195+
static_assert(has_resize_ref<IV>);
196+
static_assert(!has_resize_ref<FIV>);
238197

239198
// void reserve(size_type n);
240-
static_assert(has_reserve<IV>::value);
241-
static_assert(!has_reserve<FIV>::value);
199+
static_assert(has_reserve<IV>);
200+
static_assert(!has_reserve<FIV>);
242201

243202
// constexpr reference at(size_type n);
244-
static_assert(has_at<IV>::value);
245-
static_assert(!has_at<FIV>::value);
203+
static_assert(has_at<IV>);
204+
static_assert(!has_at<FIV>);
246205

247206
// constexpr const_reference at(size_type n) const;
248-
static_assert(has_const_at<IV>::value);
249-
static_assert(!has_const_at<FIV>::value);
207+
static_assert(has_const_at<IV>);
208+
static_assert(!has_const_at<FIV>);
250209

251210
// emplace_back(Args&&... args);
252-
static_assert(has_emplace_back<IV>::value);
253-
static_assert(!has_emplace_back<FIV>::value);
211+
static_assert(has_emplace_back<IV>);
212+
static_assert(!has_emplace_back<FIV>);
254213

255214
// constexpr reference push_back(const T& x);
256-
static_assert(has_push_back_const<IV>::value);
257-
static_assert(!has_push_back_const<FIV>::value);
215+
static_assert(has_push_back_const<IV>);
216+
static_assert(!has_push_back_const<FIV>);
258217

259218
// constexpr reference push_back(T&& x);
260-
static_assert(has_push_back_rv<IV>::value);
261-
static_assert(!has_push_back_rv<FIV>::value);
219+
static_assert(has_push_back_rv<IV>);
220+
static_assert(!has_push_back_rv<FIV>);
262221

263222
// constexpr void append_range(R&& rg);
264-
static_assert(has_append_range<IV, range>::value);
265-
static_assert(!has_append_range<FIV, range>::value);
223+
static_assert(has_append_range<IV, range>);
224+
static_assert(!has_append_range<FIV, range>);
266225

267226
// constexpr iterator emplace(const_iterator position, Args&&... args);
268-
static_assert(has_emplace<IV>::value);
269-
static_assert(!has_emplace<FIV>::value);
227+
static_assert(has_emplace<IV>);
228+
static_assert(!has_emplace<FIV>);
270229

271230
// constexpr iterator insert(const_iterator position, const T& x);
272-
static_assert(has_insert_const<IV>::value);
273-
static_assert(!has_insert_const<FIV>::value);
231+
static_assert(has_insert_const<IV>);
232+
static_assert(!has_insert_const<FIV>);
274233

275234
// constexpr iterator insert(const_iterator position, T&& x);
276-
static_assert(has_insert_rv<IV>::value);
277-
static_assert(!has_insert_rv<FIV>::value);
235+
static_assert(has_insert_rv<IV>);
236+
static_assert(!has_insert_rv<FIV>);
278237

279238
// constexpr iterator insert(const_iterator position, size_type n, T& x);
280-
static_assert(has_insert_size<IV>::value);
281-
static_assert(!has_insert_size<FIV>::value);
239+
static_assert(has_insert_size<IV>);
240+
static_assert(!has_insert_size<FIV>);
282241

283242
// constexpr iterator insert(const_iterator position, InputIterator first,
284-
static_assert(has_insert_iterator<IV>::value);
285-
static_assert(!has_insert_iterator<FIV>::value);
243+
static_assert(has_insert_iterator<IV>);
244+
static_assert(!has_insert_iterator<FIV>);
286245

287246
// InputIterator last); constexpr iterator insert_range(const_iterator
288247
// position, R&& rg);
289-
static_assert(has_insert_range<IV, range>::value);
290-
static_assert(!has_insert_range<FIV, range>::value);
248+
static_assert(has_insert_range<IV, range>);
249+
static_assert(!has_insert_range<FIV, range>);
291250

292251
// constexpr iterator insert(const_iterator position, initializer_list il);
293-
static_assert(has_insert_initializer<IV>::value);
294-
static_assert(!has_insert_initializer<FIV>::value);
252+
static_assert(has_insert_initializer<IV>);
253+
static_assert(!has_insert_initializer<FIV>);
295254

296255
EXPECT_TRUE(true);
297256
}

0 commit comments

Comments
 (0)