29 #include <gtest/gtest-spi.h> 30 #include <gtest/gtest.h> 39 TEST(SatCounterTest, MaximumValue)
41 const unsigned bits = 3;
42 const unsigned max_value = (1 <<
bits) - 1;
45 for (
int i = 0;
i < 2*max_value;
i++) {
49 ASSERT_EQ(counter, max_value);
55 TEST(SatCounterTest, MinimumValue)
57 const unsigned bits = 3;
60 for (
int i = 0;
i < 2;
i++) {
64 ASSERT_EQ(counter, 0);
70 TEST(SatCounterTest, InitialValue)
72 const unsigned bits = 3;
73 const unsigned initial_value = 4;
75 ASSERT_EQ(counter, initial_value);
78 ASSERT_EQ(counter, initial_value);
84 TEST(SatCounterTest, SaturationPercentile)
86 const unsigned bits = 3;
87 const unsigned max_value = (1 <<
bits) - 1;
91 for (
double value = 0.0; value <= max_value; value++, counter++) {
92 const double saturation = value / max_value;
103 const unsigned bits = 3;
104 const unsigned max_value = (1 <<
bits) - 1;
110 const unsigned diff = counter.
saturate();
111 ASSERT_EQ(diff, max_value - 1);
118 TEST(SatCounterTest, IntComparison)
120 const unsigned bits = 3;
124 ASSERT_EQ(counter++, value++);
125 ASSERT_EQ(counter++, value++);
126 ASSERT_EQ(counter--, value--);
127 ASSERT_EQ(counter++, value++);
128 ASSERT_EQ(counter++, value++);
129 ASSERT_EQ(counter--, value--);
130 ASSERT_EQ(counter++, value++);
131 ASSERT_EQ(counter--, value--);
132 ASSERT_EQ(counter--, value--);
133 ASSERT_EQ(counter++, value++);
134 ASSERT_EQ(counter--, value--);
135 ASSERT_EQ(counter--, value--);
136 ASSERT_EQ(counter, 0);
144 const unsigned bits = 3;
145 const unsigned max_value = (1 <<
bits) - 1;
146 const unsigned initial_value = 1;
152 int value = initial_value;
157 ASSERT_EQ(counter, value);
160 ASSERT_EQ(counter, value);
164 ASSERT_EQ(counter, max_value);
168 ASSERT_EQ(counter, 0);
172 value = initial_value;
175 ASSERT_EQ(counter, value);
176 counter <<= saturated_counter;
178 ASSERT_EQ(counter, max_value);
183 ASSERT_EQ(counter, value);
184 counter >>= saturated_counter;
185 ASSERT_EQ(counter, 0);
189 ASSERT_DEATH(counter >>= -1,
"");
190 ASSERT_DEATH(counter <<= -1,
"");
196 TEST(SatCounterTest, PrePostOperators)
198 const unsigned bits = 3;
199 const unsigned max_value = (1 <<
bits) - 1;
203 for (
int i = 0;
i < 2*max_value;
i++) {
206 ASSERT_EQ(counter_post, value_pre);
209 ASSERT_EQ(counter_pre, max_value);
210 ASSERT_EQ(counter_post, max_value);
212 for (
int i = 0;
i < 2*max_value;
i++) {
215 ASSERT_EQ(counter_post, value_pre);
218 ASSERT_EQ(counter_pre, 0);
219 ASSERT_EQ(counter_post, 0);
227 const unsigned bits = 3;
228 const unsigned max_value = (1 <<
bits) - 1;
229 const unsigned initial_value = 1;
240 deep_copy = counter_copy = counter;
241 ASSERT_EQ(counter_copy_constructor, initial_value + 1);
242 ASSERT_EQ(counter_copy, initial_value + 1);
243 ASSERT_EQ(deep_copy, initial_value + 1);
247 for (
int i = 0;
i < 2*max_value;
i++) {
248 counter_copy_constructor++;
252 ASSERT_EQ(counter, initial_value + 1);
253 ASSERT_EQ(counter_copy_constructor, max_value);
254 ASSERT_EQ(counter_copy, max_value);
255 ASSERT_EQ(deep_copy, max_value);
258 counter_copy_constructor.
reset();
259 counter_copy.
reset();
261 ASSERT_EQ(counter_copy_constructor, initial_value);
262 ASSERT_EQ(counter_copy, initial_value);
263 ASSERT_EQ(deep_copy, initial_value);
266 SatCounter counter_move_constructor(std::move(counter));
267 ASSERT_EQ(counter, 0);
268 ASSERT_EQ(counter_move_constructor, initial_value + 1);
271 counter_move = std::move(counter_move_constructor);
272 ASSERT_EQ(counter_move_constructor, 0);
273 ASSERT_EQ(counter_move, initial_value + 1);
279 TEST(SatCounterTest, AddSubAssignment)
281 const unsigned bits = 3;
282 const unsigned max_value = (1 <<
bits) - 1;
285 SatCounter saturated_counter(bits, max_value);
291 ASSERT_EQ(counter, value);
294 ASSERT_EQ(counter, value);
295 counter += max_value;
297 ASSERT_EQ(counter, value);
302 ASSERT_EQ(counter, value);
305 ASSERT_EQ(counter, value);
306 counter -= max_value;
308 ASSERT_EQ(counter, value);
313 ASSERT_EQ(counter, value);
314 counter += saturated_counter;
316 ASSERT_EQ(counter, saturated_counter);
321 ASSERT_EQ(counter, value);
322 counter -= saturated_counter;
323 ASSERT_EQ(counter, 0);
329 TEST(SatCounterTest, NegativeAddSubAssignment)
331 const unsigned bits = 3;
332 const unsigned max_value = (1 <<
bits) - 1;
334 int value = max_value;
339 ASSERT_EQ(counter, value);
342 ASSERT_EQ(counter, value);
343 counter += (int)-max_value;
345 ASSERT_EQ(counter, value);
350 ASSERT_EQ(counter, value);
353 ASSERT_EQ(counter, value);
354 counter -= (int)-max_value;
356 ASSERT_EQ(counter, value);
TEST(SatCounterTest, MaximumValue)
Test if the maximum value is indeed the maximum value reachable.
double calcSaturation() const
Calculate saturation percentile of the current counter's value with regard to its maximum possible va...
Implements an n bit saturating counter and provides methods to increment, decrement, and read it.
void reset()
Reset the counter to its initial value.
uint8_t saturate()
Saturate the counter.
bool isSaturated() const
Whether the counter has achieved its maximum value or not.
T bits(T val, int first, int last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it...