1+ #include < atomic>
12#include < gtest/gtest.h>
23#include < type_traits>
34import mcpplibs.primitives;
@@ -43,8 +44,20 @@ TEST(PolicyTraitsTest, BuiltinPoliciesHaveCategories) {
4344 EXPECT_EQ (policy::traits<policy::concurrency::none>::kind,
4445 policy::category::concurrency);
4546
46- EXPECT_TRUE ((policy::traits<policy::concurrency::atomic>::enabled));
47- EXPECT_EQ (policy::traits<policy::concurrency::atomic>::kind,
47+ EXPECT_TRUE ((policy::traits<policy::concurrency::fenced>::enabled));
48+ EXPECT_EQ (policy::traits<policy::concurrency::fenced>::kind,
49+ policy::category::concurrency);
50+
51+ EXPECT_TRUE ((policy::traits<policy::concurrency::fenced_relaxed>::enabled));
52+ EXPECT_EQ (policy::traits<policy::concurrency::fenced_relaxed>::kind,
53+ policy::category::concurrency);
54+
55+ EXPECT_TRUE ((policy::traits<policy::concurrency::fenced_acq_rel>::enabled));
56+ EXPECT_EQ (policy::traits<policy::concurrency::fenced_acq_rel>::kind,
57+ policy::category::concurrency);
58+
59+ EXPECT_TRUE ((policy::traits<policy::concurrency::fenced_seq_cst>::enabled));
60+ EXPECT_EQ (policy::traits<policy::concurrency::fenced_seq_cst>::kind,
4861 policy::category::concurrency);
4962
5063 EXPECT_TRUE ((policy::traits<policy::value::saturating>::enabled));
@@ -60,24 +73,60 @@ TEST(PolicyTraitsTest, BuiltinPoliciesHaveCategories) {
6073 EXPECT_TRUE ((std::is_same_v<policy::defaults::type, policy::type::strict>));
6174}
6275
63- TEST (PolicyConcurrencyTest, AtomicInjectsFences ) {
64- using atomic_handler =
65- policy::concurrency::handler<policy::concurrency::atomic ,
76+ TEST (PolicyConcurrencyTest, FencedInjectsFences ) {
77+ using fenced_handler =
78+ policy::concurrency::handler<policy::concurrency::fenced ,
6679 operations::Addition, int ,
6780 policy::error::kind>;
6881 using single_handler = policy::concurrency::handler<policy::concurrency::none,
6982 operations::Addition, int ,
7083 policy::error::kind>;
7184
72- auto const atomic_injection = atomic_handler ::inject ();
85+ auto const fenced_injection = fenced_handler ::inject ();
7386 auto const single_injection = single_handler::inject ();
7487
75- EXPECT_TRUE (atomic_injection.fence_before );
76- EXPECT_TRUE (atomic_injection.fence_after );
88+ EXPECT_TRUE (fenced_injection.fence_before );
89+ EXPECT_TRUE (fenced_injection.fence_after );
90+ EXPECT_EQ (fenced_injection.order_before , std::memory_order_seq_cst);
91+ EXPECT_EQ (fenced_injection.order_after , std::memory_order_seq_cst);
7792 EXPECT_FALSE (single_injection.fence_before );
7893 EXPECT_FALSE (single_injection.fence_after );
7994}
8095
96+ TEST (PolicyConcurrencyTest, FencedVariantsUseExpectedMemoryOrders) {
97+ using relaxed_handler =
98+ policy::concurrency::handler<policy::concurrency::fenced_relaxed,
99+ operations::Addition, int ,
100+ policy::error::kind>;
101+ using acq_rel_handler =
102+ policy::concurrency::handler<policy::concurrency::fenced_acq_rel,
103+ operations::Addition, int ,
104+ policy::error::kind>;
105+
106+ auto const relaxed = relaxed_handler::inject ();
107+ auto const acq_rel = acq_rel_handler::inject ();
108+
109+ EXPECT_EQ (relaxed.order_before , std::memory_order_relaxed);
110+ EXPECT_EQ (relaxed.order_after , std::memory_order_relaxed);
111+ EXPECT_EQ (acq_rel.order_before , std::memory_order_acquire);
112+ EXPECT_EQ (acq_rel.order_after , std::memory_order_release);
113+ }
114+
115+ TEST (PolicyConcurrencyTest, PrimitiveAccessHandlerProtocolByPolicy) {
116+ EXPECT_TRUE ((
117+ policy::concurrency::handler_access_available<policy::concurrency::fenced,
118+ int >));
119+ EXPECT_TRUE ((policy::concurrency::handler_access_available<
120+ policy::concurrency::fenced_relaxed, int >));
121+ EXPECT_TRUE ((policy::concurrency::handler_access_available<
122+ policy::concurrency::fenced_acq_rel, int >));
123+ EXPECT_TRUE ((policy::concurrency::handler_access_available<
124+ policy::concurrency::fenced_seq_cst, int >));
125+ EXPECT_FALSE (
126+ (policy::concurrency::handler_access_available<policy::concurrency::none,
127+ int >));
128+ }
129+
81130TEST (PolicyProtocolTest, BuiltinHandlersSatisfyProtocolConcepts) {
82131 static_assert (policy::type::handler_protocol<policy::type::strict,
83132 operations::Addition, int , int >);
0 commit comments