kokkos-execution
0.0.1
Toggle main menu visibility
Loading...
Searching...
No Matches
test_closure.cpp
Go to the documentation of this file.
1
#include "gtest/gtest.h"
2
3
#include "
kokkos-execution/impl/empty.hpp
"
4
#include "
kokkos-execution/stdexec.hpp
"
5
6
#include "
tests/utils/functors/counter.hpp
"
7
#include "
tests/utils/functors/no_op.hpp
"
8
#include "
tests/utils/functors/throws_when_copied.hpp
"
9
20
21
namespace
Tests
{
22
23
using
Empty
=
Kokkos::Execution::Impl::Empty
;
24
using
NoOp
=
Tests::Utils::Functors::NoOp<false, false, false>
;
25
using
ThrowsWhenCopied
=
Tests::Utils::Functors::ThrowsWhenCopied
;
26
28
consteval
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
40
static_assert
(
test_closure_from_rvalue
());
41
42
43
#if defined(__cpp_constexpr_exceptions)
45
consteval
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
57
static_assert
(test_closure_from_lvalue());
58
#endif
59
64
consteval
bool
test_nothrow_constructibility
() {
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
70
static_assert
(
test_nothrow_constructibility
());
71
73
consteval
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
85
static_assert
(
test_decays
());
86
99
consteval
bool
test_may_be_composed_with_closure_of_the_same_type
() {
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
116
static_assert
(
test_may_be_composed_with_closure_of_the_same_type
());
117
118
class
ClosureTest
:
public
testing::Test {
119
protected
:
120
using
counter_t
=
Tests::Utils::Functors::Counter
;
121
public
:
122
void
SetUp
()
override
{
123
counter_t::reset
();
124
}
125
};
126
128
TEST_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
Tests::ClosureTest
Definition
test_closure.cpp:118
Tests::ClosureTest::SetUp
void SetUp() override
Definition
test_closure.cpp:122
Tests::ClosureTest::counter_t
Tests::Utils::Functors::Counter counter_t
Definition
test_closure.cpp:120
counter.hpp
empty.hpp
stdexec.hpp
Tests
Definition
test_any_sender.cpp:39
Tests::ThrowsWhenCopied
Tests::Utils::Functors::ThrowsWhenCopied ThrowsWhenCopied
Definition
test_closure.cpp:25
Tests::Empty
Kokkos::Execution::Impl::Empty Empty
Definition
test_closure.cpp:23
Tests::test_decays
consteval bool test_decays()
Definition
test_closure.cpp:73
Tests::test_nothrow_constructibility
consteval bool test_nothrow_constructibility()
Definition
test_closure.cpp:64
Tests::test_may_be_composed_with_closure_of_the_same_type
consteval bool test_may_be_composed_with_closure_of_the_same_type()
Definition
test_closure.cpp:99
Tests::test_closure_from_rvalue
consteval bool test_closure_from_rvalue()
Definition
test_closure.cpp:28
Tests::NoOp
Tests::Utils::Functors::NoOp< false, false, false > NoOp
Definition
test_closure.cpp:24
no_op.hpp
Kokkos::Execution::Impl::Empty
Definition
empty.hpp:8
Tests::Utils::Functors::Counter
Count construction, move/copy construction, move/copy assignment and destruction atomically on host.
Definition
counter.hpp:14
Tests::Utils::Functors::Counter::move_assignments
static std::atomic< unsigned int > move_assignments
Definition
counter.hpp:20
Tests::Utils::Functors::Counter::copy_constructions
static std::atomic< unsigned int > copy_constructions
Definition
counter.hpp:17
Tests::Utils::Functors::Counter::reset
static void reset()
Definition
counter.hpp:59
Tests::Utils::Functors::Counter::move_constructions
static std::atomic< unsigned int > move_constructions
Definition
counter.hpp:19
Tests::Utils::Functors::Counter::copy_assignments
static std::atomic< unsigned int > copy_assignments
Definition
counter.hpp:18
Tests::Utils::Functors::NoOp
Does nothing.
Definition
no_op.hpp:15
Tests::Utils::Functors::ThrowsWhenCopied
This helper struct throws when copy constructed.
Definition
throws_when_copied.hpp:35
throws_when_copied.hpp
tests
stdexec
test_closure.cpp
Generated on
for kokkos-execution by
1.18.0