OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_intrinsic_type.cpp
Go to the documentation of this file.
1
2#include "test_common.hpp"
3
5
6using namespace openvpn;
7
8template <typename BaseT>
10
11// clang-format off
12struct Thing1 : IntrinsicType<Thing1, unsigned int> { using IntrinsicType<Thing1, unsigned int>::IntrinsicType; };
14// clang-format on
15
16inline auto f(const Thing1 t)
17{
18 return Thing1(t.get() * 2);
19}
20
21inline auto f(const Thing2 t)
22{
23 return Thing2(t * 3);
24}
25
26template <typename ThingT>
27auto g(const ThingT &t)
28{
29 return ThingT(t * 4);
30}
31
33{
34 // EXPECT_EQ(f(2), 4); // fails, no match
35 // EXPECT_EQ(f(int(2)), int(4)); // fails, no match
36 EXPECT_EQ(f(Thing1(2)), Thing1(4));
37 EXPECT_EQ(f(Thing2(2)), Thing2(6));
38}
39
40TEST(IntrinsicType, template_inst)
41{
42 EXPECT_EQ(g(2), 8);
43 EXPECT_EQ(g(Thing1(2)), Thing1(8));
44 EXPECT_EQ(g(Thing2(2)), Thing2(8));
45}
46
47inline auto f(const int t)
48{
49 return t;
50}
51
53{
54 EXPECT_EQ(f(2), 2); // now it's fine
55 EXPECT_EQ(f(f(Thing1(1))), Thing1(4));
56 EXPECT_EQ(f(f(Thing2(1))), Thing2(9));
57}
58
60{
61 auto a = Thing1(1u);
62
63 a = ~a;
64
65 EXPECT_TRUE(a == Thing1(~1u));
66}
67
68TEST(IntrinsicType, logic_or_0)
69{
70 auto a = Thing1(1u);
71 Thing1 b(2u);
72
73 EXPECT_FALSE(a == b);
74
75 a |= b;
76
77 EXPECT_TRUE(a == Thing1(3));
78 EXPECT_TRUE(b == Thing1(2));
79}
80
81TEST(IntrinsicType, logic_or_1)
82{
83 auto a = Thing1(1u);
84 Thing1 b(2);
85 constexpr Thing1 c(3);
86 Thing1 d(4);
87
88 EXPECT_FALSE(a == b);
89
90 auto x = a | b;
91 EXPECT_TRUE((std::is_same_v<decltype(x), Thing1>));
92
93 EXPECT_TRUE((a | b) == Thing1(3));
94 EXPECT_TRUE((a | b | c) == Thing1(3));
95 EXPECT_TRUE((a | b | c | d) == Thing1(7));
96
97 EXPECT_EQ(f(a | b), Thing1(6));
98}
99
100TEST(IntrinsicType, logic_and_0)
101{
102 auto a = Thing1(1u);
103 Thing1 b(2u);
104
105 EXPECT_FALSE(a == b);
106
107 a &= b;
108
109 EXPECT_TRUE(a == Thing1(0));
110 EXPECT_TRUE(b == Thing1(2));
111}
112
113TEST(IntrinsicType, logic_and_1)
114{
115 Thing1 a(1);
116 Thing1 b(2);
117 constexpr Thing1 c(3);
118
119 EXPECT_FALSE(a == b);
120
121 auto x = a & b;
122 EXPECT_TRUE((std::is_same_v<decltype(x), Thing1>));
123
124 EXPECT_TRUE((a & b) == Thing1(0));
125 EXPECT_TRUE((a & c) == Thing1(1));
126 EXPECT_TRUE((b & c) == Thing1(2));
127
128 EXPECT_EQ(f(a & c), Thing1(2));
129}
CRTP type designed to allow creation of strong types based on intrinsics.
constexpr value_type get() const noexcept
Getter for the underlying value.
auto f(const Thing1 t)
TEST(IntrinsicType, overload1)
auto g(const ThingT &t)
IntrinsicType< BaseT, unsigned int > IntrinsicInt