summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base/circular_queue.hh10
-rw-r--r--src/base/circular_queue.test.cc3
2 files changed, 8 insertions, 5 deletions
diff --git a/src/base/circular_queue.hh b/src/base/circular_queue.hh
index f368ed0d1..da3da8b28 100644
--- a/src/base/circular_queue.hh
+++ b/src/base/circular_queue.hh
@@ -323,12 +323,12 @@ class CircularQueue : private std::vector<T>
assert(_cq);
/* C does not do euclidean division, so we have to adjust */
- if (t >= 0)
+ if (t >= 0) {
_round += (-t + _idx) / _cq->capacity();
- else
- _round += (-t + _idx - _cq->capacity() + 1) / _cq->capacity();
-
- _idx = _cq->moduloSub(_idx, t);
+ _idx = _cq->moduloSub(_idx, t);
+ } else {
+ *this += -t;
+ }
return *this;
}
diff --git a/src/base/circular_queue.test.cc b/src/base/circular_queue.test.cc
index cce6cb0b6..fd63f7203 100644
--- a/src/base/circular_queue.test.cc
+++ b/src/base/circular_queue.test.cc
@@ -198,8 +198,10 @@ TEST(CircularQueueTest, IteratorsOp)
cq.push_back(first_value);
cq.push_back(second_value);
+ auto negative_offset = -(cq_size + 1);
auto it_1 = cq.begin();
auto it_2 = cq.begin() + 1;
+ auto it_3 = cq.begin() - negative_offset;
// Operators test
ASSERT_TRUE(it_1 != it_2);
@@ -213,6 +215,7 @@ TEST(CircularQueueTest, IteratorsOp)
ASSERT_EQ(it_1, it_2 - 1);
ASSERT_EQ(it_2 - it_1, 1);
ASSERT_EQ(it_1 - it_2, -1);
+ ASSERT_EQ(it_3._round, 1);
auto temp_it = it_1;
ASSERT_EQ(++temp_it, it_2);