Skip to content

Commit 8668e89

Browse files
committed
fixed iterator category and added test to test sort and partial buffer search via stl algorithms
1 parent 931392d commit 8668e89

File tree

2 files changed

+44
-25
lines changed

2 files changed

+44
-25
lines changed

circular_buffer.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class CircularBuffer {
124124
struct BufferIterator{
125125
public:
126126
friend class CircularBuffer<T>;
127-
typedef std::forward_iterator_tag iterator_category;
127+
typedef std::random_access_iterator_tag iterator_category;
128128
typedef ptrdiff_t difference_type;
129129
typedef T value_type;
130130
typedef typename std::conditional<isConst, const value_type&, value_type&>::type reference;
@@ -160,8 +160,9 @@ class CircularBuffer {
160160
pointer operator->() { return &(operator*()); }
161161

162162
reference operator[](size_type index){
163-
this->_index += index;
164-
return this->operator*();
163+
BufferIterator iter = *this;
164+
iter._index += index;
165+
return *iter;
165166
}
166167

167168
BufferIterator& operator++(){
@@ -207,6 +208,11 @@ class CircularBuffer {
207208
return lhsiter;
208209
}
209210

211+
friend difference_type operator-(const BufferIterator& lhsiter, const BufferIterator& rhsiter){
212+
213+
return lhsiter._index - rhsiter._index;
214+
}
215+
210216
BufferIterator& operator-=(difference_type n){
211217
_index -= n;
212218
return *this;

tests/iterator_test.cpp

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,75 +12,88 @@ class CircularBufferTest : public ::testing::Test{
1212

1313
protected:
1414

15-
CircularBuffer<std::string> test_buff{TEST_BUFFER_SIZE};
16-
15+
CircularBuffer<std::string> test_str_buff{TEST_BUFFER_SIZE};
16+
CircularBuffer<int> test_int_buff{TEST_BUFFER_SIZE};
1717
};
1818

1919
TEST_F(CircularBufferTest, IteratorBasedLoopTest){
2020
//create full buffer
2121
for(int i=0; i<TEST_BUFFER_SIZE; i++)
22-
test_buff.push_back("string" + std::to_string(i));
22+
test_str_buff.push_back("string" + std::to_string(i));
2323
int i = 0;
24-
for(auto it = test_buff.begin(); it!=test_buff.end(); it++)
24+
for(auto it = test_str_buff.begin(); it!=test_str_buff.end(); it++)
2525
EXPECT_EQ(*it, "string" + std::to_string(i++));
2626
//partially fill buffers
27-
test_buff.clear();
27+
test_str_buff.clear();
2828
for(int i=0; i<TEST_BUFFER_SIZE/2; i++)
29-
test_buff.push_back("string" + std::to_string(i));
29+
test_str_buff.push_back("string" + std::to_string(i));
3030
//test begin and end on partially full buffer
3131
i = 0;
32-
for(auto it = test_buff.begin(); it!=test_buff.end(); it++)
32+
for(auto it = test_str_buff.begin(); it!=test_str_buff.end(); it++)
3333
EXPECT_EQ(*it, "string" + std::to_string(i++));
3434
//test size with increment variable
3535
EXPECT_EQ(i, TEST_BUFFER_SIZE/2);
36-
37-
3836
}
3937

4038
TEST_F(CircularBufferTest, RangeBasedLoopTest){
4139
//create full buffer
4240
for(int i=0; i<TEST_BUFFER_SIZE; i++)
43-
test_buff.push_back("string" + std::to_string(i));
41+
test_str_buff.push_back("string" + std::to_string(i));
4442
int i = 0;
4543
//copied elements
46-
for(auto buff_elem : test_buff)
44+
for(auto buff_elem : test_str_buff)
4745
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
4846
//auto reference
4947
i = 0;
50-
for(auto& buff_elem : test_buff)
48+
for(auto& buff_elem : test_str_buff)
5149
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
5250
//auto const reference
5351
i = 0;
54-
for(const auto& buff_elem : test_buff)
52+
for(const auto& buff_elem : test_str_buff)
5553
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
5654
//check iterators after modifications
5755
for(int i = 0; i<REDUCE_SIZE; i++)
58-
test_buff.pop_front();
56+
test_str_buff.pop_front();
5957
i = 0;
60-
for(const auto& buff_elem : test_buff)
58+
for(const auto& buff_elem : test_str_buff)
6159
EXPECT_EQ(buff_elem, "string" + std::to_string(i++));
6260
EXPECT_EQ(i, TEST_BUFFER_SIZE - REDUCE_SIZE);
6361
}
6462

6563
TEST_F(CircularBufferTest, FindTest){
6664
//create full buffer
6765
for(int i=0; i<TEST_BUFFER_SIZE; i++)
68-
test_buff.push_back("string" + std::to_string(i));
69-
auto result = std::find(test_buff.cbegin(), test_buff.cend(), "string50");
66+
test_str_buff.push_back("string" + std::to_string(i));
67+
auto result = std::find(test_str_buff.cbegin(), test_str_buff.cend(), "string50");
7068
EXPECT_EQ(*result, "string50");
71-
result = std::find(test_buff.cbegin(), test_buff.cend(), "string100");
72-
EXPECT_EQ(result, test_buff.cend());
69+
result = std::find(test_str_buff.cbegin(), test_str_buff.cend(), "string100");
70+
EXPECT_EQ(result, test_str_buff.cend());
71+
//partial buffer search
72+
result = std::find(test_str_buff.cbegin(), test_str_buff.cbegin() + 50, "string30");
73+
EXPECT_EQ(*result, "string30");
74+
result = std::find(test_str_buff.cbegin(), test_str_buff.cbegin() + 50, "string51");
75+
EXPECT_EQ(result, test_str_buff.cbegin() + 50);
7376
}
7477

7578
TEST_F(CircularBufferTest, ForEachTest){
7679
//create full buffer
7780
for(int i=0; i<TEST_BUFFER_SIZE; i++)
78-
test_buff.push_back("string" + std::to_string(i));
79-
std::for_each(test_buff.begin(), test_buff.end(), [](std::string& elem){ elem = elem + "modified";});
81+
test_str_buff.push_back("string" + std::to_string(i));
82+
std::for_each(test_str_buff.begin(), test_str_buff.end(), [](std::string& elem){ elem = elem + "modified";});
8083
int i=0;
81-
for(const auto& elem: test_buff)
84+
for(const auto& elem: test_str_buff)
8285
EXPECT_EQ(elem, "string" + std::to_string(i++) + "modified");
8386
}
8487

88+
TEST_F(CircularBufferTest, SortTest){
89+
//create full buffer
90+
for(int i=0; i<TEST_BUFFER_SIZE; i++)
91+
test_int_buff.push_back(i);
92+
std::sort(test_int_buff.begin(), test_int_buff.end(), std::greater<int>());
93+
int i = 99;
94+
for(const auto& elem: test_int_buff)
95+
EXPECT_EQ(elem, i--);
96+
}
97+
8598

8699

0 commit comments

Comments
 (0)