rippled
Loading...
Searching...
No Matches
tagged_integer.cpp
1#include <xrpl/basics/tagged_integer.h>
2
3#include <gtest/gtest.h>
4
5#include <type_traits>
6
7using namespace xrpl;
8
9struct Tag1
10{
11};
12struct Tag2
13{
14};
15
16// Static checks that types are not interoperable
17
21
22// Check construction of tagged_integers
23static_assert(
25 "TagUInt1 should be constructible using a std::uint32_t");
26
27static_assert(
29 "TagUInt1 should not be constructible using a std::uint64_t");
30
31static_assert(
33 "TagUInt3 should be constructible using a std::uint32_t");
34
35static_assert(
37 "TagUInt3 should be constructible using a std::uint64_t");
38
39// Check assignment of tagged_integers
40static_assert(
42 "TagUInt1 should not be assignable with a std::uint32_t");
43
44static_assert(
46 "TagUInt1 should not be assignable with a std::uint64_t");
47
48static_assert(
50 "TagUInt3 should not be assignable with a std::uint32_t");
51
52static_assert(
54 "TagUInt3 should not be assignable with a std::uint64_t");
55
56static_assert(
58 "TagUInt1 should be assignable with a TagUInt1");
59
60static_assert(
62 "TagUInt1 should not be assignable with a TagUInt2");
63
64static_assert(
66 "TagUInt3 should be assignable with a TagUInt1");
67
68static_assert(
70 "TagUInt1 should not be assignable with a TagUInt3");
71
72static_assert(
74 "TagUInt3 should not be assignable with a TagUInt1");
75
76// Check convertibility of tagged_integers
77static_assert(
79 "std::uint32_t should not be convertible to a TagUInt1");
80
81static_assert(
83 "std::uint32_t should not be convertible to a TagUInt3");
84
85static_assert(
87 "std::uint64_t should not be convertible to a TagUInt3");
88
89static_assert(
91 "std::uint64_t should not be convertible to a TagUInt2");
92
93static_assert(
95 "TagUInt1 should not be convertible to TagUInt2");
96
97static_assert(
99 "TagUInt1 should not be convertible to TagUInt3");
100
101static_assert(
103 "TagUInt2 should not be convertible to a TagUInt3");
104
106
107TEST(tagged_integer, comparison_operators)
108{
109 TagInt const zero(0);
110 TagInt const one(1);
111
112 EXPECT_TRUE(one == one);
113 EXPECT_FALSE(one == zero);
114
115 EXPECT_TRUE(one != zero);
116 EXPECT_FALSE(one != one);
117
118 EXPECT_TRUE(zero < one);
119 EXPECT_FALSE(one < zero);
120
121 EXPECT_TRUE(one > zero);
122 EXPECT_FALSE(zero > one);
123
124 EXPECT_TRUE(one >= one);
125 EXPECT_TRUE(one >= zero);
126 EXPECT_FALSE(zero >= one);
127
128 EXPECT_TRUE(zero <= one);
129 EXPECT_TRUE(zero <= zero);
130 EXPECT_FALSE(one <= zero);
131}
132
133TEST(tagged_integer, increment_decrement_operators)
134{
135 TagInt const zero(0);
136 TagInt const one(1);
137 TagInt a{0};
138 ++a;
139 EXPECT_EQ(a, one);
140 --a;
141 EXPECT_EQ(a, zero);
142 a++;
143 EXPECT_EQ(a, one);
144 a--;
145 EXPECT_EQ(a, zero);
146}
147
148TEST(tagged_integer, arithmetic_operators)
149{
150 TagInt const a{-2};
151 EXPECT_EQ(+a, TagInt{-2});
152 EXPECT_EQ(-a, TagInt{2});
153 EXPECT_EQ(TagInt{-3} + TagInt{4}, TagInt{1});
154 EXPECT_EQ(TagInt{-3} - TagInt{4}, TagInt{-7});
155 EXPECT_EQ(TagInt{-3} * TagInt{4}, TagInt{-12});
156 EXPECT_EQ(TagInt{8} / TagInt{4}, TagInt{2});
157 EXPECT_EQ(TagInt{7} % TagInt{4}, TagInt{3});
158
159 EXPECT_EQ(~TagInt{8}, TagInt{~TagInt::value_type{8}});
160 EXPECT_EQ((TagInt{6} & TagInt{3}), TagInt{2});
161 EXPECT_EQ((TagInt{6} | TagInt{3}), TagInt{7});
162 EXPECT_EQ((TagInt{6} ^ TagInt{3}), TagInt{5});
163
164 EXPECT_EQ((TagInt{4} << TagInt{2}), TagInt{16});
165 EXPECT_EQ((TagInt{16} >> TagInt{2}), TagInt{4});
166}
167
168TEST(tagged_integer, assignment_operators)
169{
170 TagInt a{-2};
171 TagInt b{0};
172 b = a;
173 EXPECT_EQ(b, TagInt{-2});
174
175 // -3 + 4 == 1
176 a = TagInt{-3};
177 a += TagInt{4};
178 EXPECT_EQ(a, TagInt{1});
179
180 // -3 - 4 == -7
181 a = TagInt{-3};
182 a -= TagInt{4};
183 EXPECT_EQ(a, TagInt{-7});
184
185 // -3 * 4 == -12
186 a = TagInt{-3};
187 a *= TagInt{4};
188 EXPECT_EQ(a, TagInt{-12});
189
190 // 8/4 == 2
191 a = TagInt{8};
192 a /= TagInt{4};
193 EXPECT_EQ(a, TagInt{2});
194
195 // 7 % 4 == 3
196 a = TagInt{7};
197 a %= TagInt{4};
198 EXPECT_EQ(a, TagInt{3});
199
200 // 6 & 3 == 2
201 a = TagInt{6};
202 a /= TagInt{3};
203 EXPECT_EQ(a, TagInt{2});
204
205 // 6 | 3 == 7
206 a = TagInt{6};
207 a |= TagInt{3};
208 EXPECT_EQ(a, TagInt{7});
209
210 // 6 ^ 3 == 5
211 a = TagInt{6};
212 a ^= TagInt{3};
213 EXPECT_EQ(a, TagInt{5});
214
215 // 4 << 2 == 16
216 a = TagInt{4};
217 a <<= TagInt{2};
218 EXPECT_EQ(a, TagInt{16});
219
220 // 16 >> 2 == 4
221 a = TagInt{16};
222 a >>= TagInt{2};
223 EXPECT_EQ(a, TagInt{4});
224}
A type-safe wrap around standard integral types.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5