|
1 | 1 |
|
2 | | -#include <string> |
| 2 | +#include <type_traits> |
3 | 3 |
|
4 | 4 | #include <catch2/catch_template_test_macros.hpp> |
5 | 5 | #include <catch2/catch_test_macros.hpp> |
6 | 6 |
|
7 | 7 | #include "libfork/ev.hpp" |
8 | 8 |
|
9 | | -TEMPLATE_TEST_CASE("Eventually operator *", "[ev]", int, std::string) { |
| 9 | +namespace { |
| 10 | + |
| 11 | +template <typename T> |
| 12 | +concept good_deref = requires (lf::ev<T> val, T ref) { |
| 13 | + { *val } -> std::same_as<decltype((ref))>; |
| 14 | +}; |
| 15 | + |
| 16 | +template <typename T> |
| 17 | +struct add_const : std::type_identity<T const> {}; |
| 18 | + |
| 19 | +template <typename T> |
| 20 | +struct add_const<T &> : std::type_identity<T const &> {}; |
| 21 | + |
| 22 | +template <typename T> |
| 23 | +struct add_const<T &&> : std::type_identity<T const &&> {}; |
| 24 | + |
| 25 | +template <typename T> |
| 26 | +concept good_decref = requires (lf::ev<T> const val, typename add_const<T>::type ref) { |
| 27 | + { *val } -> std::same_as<decltype((ref))>; |
| 28 | +}; |
| 29 | + |
| 30 | +struct nt { |
| 31 | + nt() {} |
| 32 | +}; |
| 33 | + |
| 34 | +static_assert(!lf::trivial_return<nt>); |
| 35 | + |
| 36 | +} // namespace |
| 37 | + |
| 38 | +TEMPLATE_TEST_CASE("Ev operator *", "[ev]", nt, int, int &, int &&, int const &, int const &&) { |
| 39 | + |
| 40 | + using U = std::remove_reference_t<TestType>; |
| 41 | + |
| 42 | + static_assert(good_deref<TestType>); |
| 43 | + static_assert(good_decref<TestType>); |
10 | 44 |
|
11 | 45 | lf::ev<TestType> val{}; |
12 | | - static_assert(std::same_as<decltype(*val), TestType &>); |
13 | | - static_assert(std::same_as<decltype(*std::move(val)), TestType &&>); |
| 46 | + static_assert(std::same_as<decltype(*val), U &>); |
| 47 | + static_assert(std::same_as<decltype(*std::move(val)), U &&>); |
14 | 48 |
|
15 | 49 | lf::ev<TestType> const cval{}; |
16 | | - static_assert(std::same_as<decltype(*cval), TestType const &>); |
17 | | - static_assert(std::same_as<decltype(*std::move(cval)), TestType const &&>); |
| 50 | + static_assert(std::same_as<decltype(*cval), U const &>); |
| 51 | + static_assert(std::same_as<decltype(*std::move(cval)), U const &&>); |
18 | 52 | } |
19 | 53 |
|
20 | | -TEMPLATE_TEST_CASE("Eventually operator ->", "[ev]", int, std::string) { |
| 54 | +TEMPLATE_TEST_CASE("Eventually operator ->", "[ev]", nt, int) { |
21 | 55 |
|
22 | 56 | lf::ev<TestType> val{}; |
23 | 57 | static_assert(std::same_as<decltype(val.operator->()), TestType *>); |
|
0 commit comments