kokkos-execution 0.0.1
Loading...
Searching...
No Matches
test_closure.cpp
Go to the documentation of this file.
1#include "gtest/gtest.h"
2
5
9
20
21namespace Tests {
22
26
28consteval bool test_closure_from_rvalue() {
29 ThrowsWhenCopied value;
30
31 [[maybe_unused]]
32 const auto res_from_xvalue = stdexec::__closure(std::move(value));
33
34 [[maybe_unused]]
35 const auto res_from_prvalue = stdexec::__closure(ThrowsWhenCopied{});
36
37 return true;
38}
39
40static_assert(test_closure_from_rvalue());
41
42
43#if defined(__cpp_constexpr_exceptions)
45consteval bool test_closure_from_lvalue() {
46 const ThrowsWhenCopied value;
47 try {
49 [[maybe_unused]]
50 const auto res = stdexec::__closure(value);
51 return false;
52 } catch (...) {
53 return true;
54 }
55}
56
57static_assert(test_closure_from_lvalue());
58#endif
59
65 static_assert(!std::is_nothrow_constructible_v<stdexec::__closure<ThrowsWhenCopied>, ThrowsWhenCopied&>);
66 static_assert(std::is_nothrow_constructible_v<stdexec::__closure<ThrowsWhenCopied>, ThrowsWhenCopied>);
67 return true;
68}
69
70static_assert(test_nothrow_constructibility());
71
73consteval bool test_decays() {
74 static_assert(std::same_as<decltype(stdexec::__closure(std::declval<Empty&>())), stdexec::__closure<Empty>>);
75 static_assert(std::same_as<decltype(stdexec::__closure(std::declval<Empty&&>())), stdexec::__closure<Empty>>);
76 static_assert(std::same_as<decltype(stdexec::__closure(std::declval<const Empty&>())), stdexec::__closure<Empty>>);
77 static_assert(std::same_as<
78 decltype(stdexec::__closure(std::declval<int&>(), std::declval<double&&>())),
79 stdexec::__closure<int, double>
80 >);
81
82 return true;
83}
84
85static_assert(test_decays());
86
100 auto clsr_a = stdexec::then(NoOp{});
101 auto clsr_b = stdexec::then(NoOp{});
102
103 using clsr_t = decltype(clsr_a);
104 static_assert(std::same_as<clsr_t, stdexec::__closure<stdexec::then_t, NoOp>>);
105
106 const auto clsr_composed = clsr_a | clsr_b;
107
108 static_assert(
109 std::same_as<std::remove_const_t<decltype(clsr_composed)>, stdexec::__clsur::__composed<clsr_t, clsr_t>>);
110 static_assert(std::derived_from<decltype(clsr_composed), stdexec::__composed<clsr_t, clsr_t>>);
111 static_assert(stdexec::__sender_adaptor_closure<decltype(clsr_composed)>);
112
113 return true;
114}
115
117
118class ClosureTest : public testing::Test {
119 protected:
121 public:
122 void SetUp() override {
124 }
125};
126
128TEST_F(ClosureTest, stored_by_value) {
129 counter_t counter{};
130
131 [[maybe_unused]]
132 const auto res1 = stdexec::__closure(counter);
133 [[maybe_unused]]
134 const auto res2 = stdexec::__closure(counter);
135
136 ASSERT_EQ(counter_t::copy_constructions, 2);
137 ASSERT_EQ(counter_t::copy_assignments, 0);
138 ASSERT_EQ(counter_t::move_constructions, 0);
139 ASSERT_EQ(counter_t::move_assignments, 0);
140
141 [[maybe_unused]]
142 const auto res3 = stdexec::__closure(std::move(counter));
143
144 ASSERT_EQ(counter_t::copy_constructions, 2);
145 ASSERT_EQ(counter_t::copy_assignments, 0);
146 ASSERT_EQ(counter_t::move_constructions, 1);
147 ASSERT_EQ(counter_t::move_assignments, 0);
148
149 [[maybe_unused]]
150 const auto res4 = stdexec::__closure(counter_t{});
151
152 ASSERT_EQ(counter_t::copy_constructions, 2);
153 ASSERT_EQ(counter_t::copy_assignments, 0);
154 ASSERT_EQ(counter_t::move_constructions, 2);
155 ASSERT_EQ(counter_t::move_assignments, 0);
156}
157
158} // namespace Tests
void SetUp() override
Tests::Utils::Functors::Counter counter_t
Tests::Utils::Functors::ThrowsWhenCopied ThrowsWhenCopied
Kokkos::Execution::Impl::Empty Empty
consteval bool test_decays()
consteval bool test_nothrow_constructibility()
consteval bool test_may_be_composed_with_closure_of_the_same_type()
consteval bool test_closure_from_rvalue()
Tests::Utils::Functors::NoOp< false, false, false > NoOp
Count construction, move/copy construction, move/copy assignment and destruction atomically on host.
Definition counter.hpp:14
static std::atomic< unsigned int > move_assignments
Definition counter.hpp:20
static std::atomic< unsigned int > copy_constructions
Definition counter.hpp:17
static std::atomic< unsigned int > move_constructions
Definition counter.hpp:19
static std::atomic< unsigned int > copy_assignments
Definition counter.hpp:18
This helper struct throws when copy constructed.