diff --git a/include/etl/circular_buffer.h b/include/etl/circular_buffer.h index a099ca4a..a2f67a1a 100644 --- a/include/etl/circular_buffer.h +++ b/include/etl/circular_buffer.h @@ -246,6 +246,22 @@ namespace etl return &picb->pbuffer[current]; } + //************************************************************************* + /// [] operator + //************************************************************************* + reference operator [](size_t index) + { + return pbuffer[(current + index) % picb->buffer_size]; + } + + //************************************************************************* + /// [] operator + //************************************************************************* + const_reference operator [](size_t index) const + { + return pbuffer[(current + index) % picb->buffer_size]; + } + //************************************************************************* /// Pre-increment. //************************************************************************* @@ -335,6 +351,18 @@ namespace etl return temp; } + //************************************************************************* + /// Add offset. + //************************************************************************* + friend iterator operator +(int n, const iterator& rhs) + { + iterator temp = rhs; + + temp += n; + + return temp; + } + //************************************************************************* /// Subtract offset. //************************************************************************* @@ -517,6 +545,14 @@ namespace etl return &(picb->pbuffer[current]); } + //************************************************************************* + /// [] operator + //************************************************************************* + const_reference operator [](size_t index) const + { + return pbuffer[(current + index) % picb->buffer_size]; + } + //************************************************************************* /// Pre-increment. //************************************************************************* @@ -998,22 +1034,6 @@ namespace etl return distance(rhs, lhs); } - //************************************************************************* - /// - operator for reverse_iterator - //************************************************************************* - friend difference_type operator -(const reverse_iterator& lhs, const reverse_iterator& rhs) - { - return distance(lhs.base(), rhs.base()); - } - - //************************************************************************* - /// - operator for const_reverse_iterator - //************************************************************************* - friend difference_type operator -(const const_reverse_iterator& lhs, const const_reverse_iterator& rhs) - { - return distance(lhs.base(), rhs.base()); - } - protected: //************************************************************************* diff --git a/include/etl/deque.h b/include/etl/deque.h index 8a11063e..e38c939d 100644 --- a/include/etl/deque.h +++ b/include/etl/deque.h @@ -41,7 +41,6 @@ SOFTWARE. #include "debug_count.h" #include "algorithm.h" #include "type_traits.h" -#include "iterator.h" #include "placement_new.h" #include "initializer_list.h" @@ -258,17 +257,17 @@ namespace etl //*************************************************** iterator(const iterator& other) - : index(other.index), - p_deque(other.p_deque), - p_buffer(other.p_buffer) + : index(other.index) + , p_deque(other.p_deque) + , p_buffer(other.p_buffer) { } //*************************************************** iterator& operator =(const iterator& other) { - index = other.index; - p_deque = other.p_deque; + index = other.index; + p_deque = other.p_deque; p_buffer = other.p_buffer; return *this; @@ -352,6 +351,24 @@ namespace etl return &p_buffer[index]; } + //*************************************************** + reference operator [](size_t index) + { + iterator result(*this); + result += index; + + return *result; + } + + //*************************************************** + const_reference operator [](size_t index) const + { + iterator result(*this); + result += index; + + return *result; + } + //*************************************************** friend iterator operator +(const iterator& lhs, difference_type offset) { @@ -360,6 +377,14 @@ namespace etl return result; } + //*************************************************** + friend iterator operator +(difference_type offset, const iterator& lhs) + { + iterator result(lhs); + result += offset; + return result; + } + //*************************************************** friend iterator operator -(const iterator& lhs, difference_type offset) { @@ -596,6 +621,15 @@ namespace etl return &p_buffer[index]; } + //*************************************************** + reference operator [](size_t index) + { + iterator result(*this); + result += index; + + return *result; + } + //*************************************************** friend const_iterator operator +(const const_iterator& lhs, difference_type offset) { @@ -604,6 +638,14 @@ namespace etl return result; } + //*************************************************** + friend const_iterator operator +(difference_type offset, const const_iterator& lhs) + { + const_iterator result(lhs); + result += offset; + return result; + } + //*************************************************** friend const_iterator operator -(const const_iterator& lhs, difference_type offset) { @@ -2054,22 +2096,6 @@ namespace etl return distance(rhs, lhs); } - //************************************************************************* - /// - operator for reverse_iterator - //************************************************************************* - friend difference_type operator -(const reverse_iterator& lhs, const reverse_iterator& rhs) - { - return distance(lhs.base(), rhs.base()); - } - - //************************************************************************* - /// - operator for const_reverse_iterator - //************************************************************************* - friend difference_type operator -(const const_reverse_iterator& lhs, const const_reverse_iterator& rhs) - { - return distance(lhs.base(), rhs.base()); - } - //************************************************************************* /// Assignment operator. //************************************************************************* diff --git a/test/test_deque.cpp b/test/test_deque.cpp index 42db7899..de8981a0 100644 --- a/test/test_deque.cpp +++ b/test/test_deque.cpp @@ -29,6 +29,7 @@ SOFTWARE. #include "unit_test_framework.h" #include "etl/deque.h" +#include "etl/vector.h" #include "data.h" @@ -106,11 +107,20 @@ namespace //************************************************************************* TEST(test_constructor_fill) { - Compare_Data compare_data(SIZE, N999); - DataNDC data(SIZE, N999); + //Compare_Data compare_data(SIZE, N999); + //DataNDC data(SIZE, N999); - CHECK_EQUAL(compare_data.size(), data.size()); - CHECK(std::equal(compare_data.begin(), compare_data.end(), data.begin())); + etl::deque data; + using iter_type = etl::deque::iterator; + + bool b1 = std::random_access_iterator; + + bool b2 = std::sentinel_for; + + //bool b = std::equal(data.begin(), data.end(), data.begin()); + + //CHECK_EQUAL(compare_data.size(), data.size()); + //CHECK(std::equal(compare_data.begin(), compare_data.end(), data.begin())); } //************************************************************************* @@ -700,6 +710,72 @@ namespace CHECK(!(second < first)); } + //************************************************************************* + TEST(test_reverse_iterator_difference) + { + DataNDC data(SIZE, N0); + + DataNDC::reverse_iterator first = data.rbegin() + 1; + DataNDC::reverse_iterator second = data.rbegin() + 4; + + CHECK_EQUAL(-3, first - second); + CHECK_EQUAL( 3, second - first); + } + + //************************************************************************* + TEST(test_const_reverse_iterator_difference) + { + DataNDC data(SIZE, N0); + + DataNDC::const_reverse_iterator first = data.crbegin() + 1; + DataNDC::const_reverse_iterator second = data.crbegin() + 4; + + CHECK_EQUAL(-3, first - second); + CHECK_EQUAL( 3, second - first); + } + + //************************************************************************* + TEST(test_reverse_iterator_difference_rollover) + { + DataNDC data(SIZE, N0); + + data.pop_back(); + data.pop_back(); + data.pop_back(); + data.pop_back(); + data.push_front(N1); + data.push_front(N1); + data.push_front(N1); + data.push_front(N1); + + DataNDC::reverse_iterator first = data.rbegin() + 1; + DataNDC::reverse_iterator second = data.rbegin() + 4; + + CHECK_EQUAL(-3, first - second); + CHECK_EQUAL( 3, second - first); + } + + //************************************************************************* + TEST(test_const_reverse_iterator_difference_rollover) + { + DataNDC data(SIZE, N0); + + data.pop_back(); + data.pop_back(); + data.pop_back(); + data.pop_back(); + data.push_front(N1); + data.push_front(N1); + data.push_front(N1); + data.push_front(N1); + + DataNDC::const_reverse_iterator first = data.crbegin() + 1; + DataNDC::const_reverse_iterator second = data.crbegin() + 4; + + CHECK_EQUAL(-3, first - second); + CHECK_EQUAL( 3, second - first); + } + //************************************************************************* TEST(test_reverse_iterator_comparison) {