Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 82 additions & 2 deletions wpiutil/src/main/native/include/wpi/circular_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class circular_buffer {

class iterator {
public:
using iterator_category = std::forward_iterator_tag;
using iterator_category = std::bidirectional_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
Expand All @@ -51,6 +51,15 @@ class circular_buffer {
++(*this);
return retval;
}
constexpr iterator& operator--() {
--m_index;
return *this;
}
constexpr iterator operator--(int) {
iterator retval = *this;
--(*this);
return retval;
}
constexpr bool operator==(const iterator&) const = default;
constexpr reference operator*() { return (*m_buffer)[m_index]; }

Expand All @@ -61,7 +70,7 @@ class circular_buffer {

class const_iterator {
public:
using iterator_category = std::forward_iterator_tag;
using iterator_category = std::bidirectional_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
Expand All @@ -79,6 +88,15 @@ class circular_buffer {
++(*this);
return retval;
}
constexpr const_iterator& operator--() {
--m_index;
return *this;
}
constexpr const_iterator operator--(int) {
const_iterator retval = *this;
--(*this);
return retval;
}
constexpr bool operator==(const const_iterator&) const = default;
constexpr const_reference operator*() const { return (*m_buffer)[m_index]; }

Expand All @@ -87,21 +105,83 @@ class circular_buffer {
size_t m_index;
};

using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;

/**
* Returns begin iterator.
*/
constexpr iterator begin() { return iterator(this, 0); }

/**
* Returns end iterator.
*/
constexpr iterator end() {
return iterator(this, ::wpi::circular_buffer<T>::size());
}

/**
* Returns begin iterator.
*/
constexpr const_iterator begin() const { return const_iterator(this, 0); }

/**
* Returns end iterator.
*/
constexpr const_iterator end() const {
return const_iterator(this, ::wpi::circular_buffer<T>::size());
}

/**
* Returns begin iterator.
*/
constexpr const_iterator cbegin() const { return const_iterator(this, 0); }

/**
* Returns end iterator.
*/
constexpr const_iterator cend() const {
return const_iterator(this, ::wpi::circular_buffer<T>::size());
}

/**
* Returns reverse begin iterator.
*/
constexpr reverse_iterator rbegin() { return reverse_iterator(end()); }

/**
* Returns reverse end iterator.
*/
constexpr reverse_iterator rend() { return reverse_iterator(begin()); }

/**
* Returns reverse begin iterator.
*/
constexpr const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
}

/**
* Returns reverse end iterator.
*/
constexpr const_reverse_iterator rend() const {
return const_reverse_iterator(begin());
}

/**
* Returns const reverse begin iterator.
*/
constexpr const_reverse_iterator crbegin() const {
return const_reverse_iterator(cend());
}

/**
* Returns const reverse end iterator.
*/
constexpr const_reverse_iterator crend() const {
return const_reverse_iterator(cbegin());
}

/**
* Returns number of elements in buffer
*/
Expand Down
63 changes: 61 additions & 2 deletions wpiutil/src/main/native/include/wpi/static_circular_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class static_circular_buffer {

class iterator {
public:
using iterator_category = std::forward_iterator_tag;
using iterator_category = std::bidirectional_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
Expand All @@ -42,6 +42,15 @@ class static_circular_buffer {
++(*this);
return retval;
}
constexpr iterator& operator--() {
--m_index;
return *this;
}
constexpr iterator operator--(int) {
iterator retval = *this;
--(*this);
return retval;
}
constexpr bool operator==(const iterator&) const = default;
constexpr reference operator*() { return (*m_buffer)[m_index]; }

Expand All @@ -52,7 +61,7 @@ class static_circular_buffer {

class const_iterator {
public:
using iterator_category = std::forward_iterator_tag;
using iterator_category = std::bidirectional_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
Expand All @@ -70,6 +79,15 @@ class static_circular_buffer {
++(*this);
return retval;
}
constexpr const_iterator& operator--() {
--m_index;
return *this;
}
constexpr const_iterator operator--(int) {
const_iterator retval = *this;
--(*this);
return retval;
}
constexpr bool operator==(const const_iterator&) const = default;
constexpr const_reference operator*() const { return (*m_buffer)[m_index]; }

Expand All @@ -78,6 +96,9 @@ class static_circular_buffer {
size_t m_index;
};

using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;

/**
* Returns begin iterator.
*/
Expand Down Expand Up @@ -114,6 +135,44 @@ class static_circular_buffer {
return const_iterator(this, ::wpi::static_circular_buffer<T, N>::size());
}

/**
* Returns reverse begin iterator.
*/
constexpr reverse_iterator rbegin() { return reverse_iterator(end()); }

/**
* Returns reverse end iterator.
*/
constexpr reverse_iterator rend() { return reverse_iterator(begin()); }

/**
* Returns reverse begin iterator.
*/
constexpr const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
}

/**
* Returns reverse end iterator.
*/
constexpr const_reverse_iterator rend() const {
return const_reverse_iterator(begin());
}

/**
* Returns const reverse begin iterator.
*/
constexpr const_reverse_iterator crbegin() const {
return const_reverse_iterator(cend());
}

/**
* Returns const reverse end iterator.
*/
constexpr const_reverse_iterator crend() const {
return const_reverse_iterator(cbegin());
}

/**
* Returns number of elements in buffer
*/
Expand Down
14 changes: 14 additions & 0 deletions wpiutil/src/test/native/cpp/CircularBufferTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,4 +251,18 @@ TEST(CircularBufferTest, Iterator) {
EXPECT_EQ(values[i], elem);
++i;
}

// reverse_iterator
i = 2;
for (auto it = queue.rbegin(); it != queue.rend(); ++it) {
EXPECT_EQ(values[i], *it);
--i;
}

// const_reverse_iterator
i = 2;
for (auto it = queue.crbegin(); it != queue.crend(); ++it) {
EXPECT_EQ(values[i], *it);
--i;
}
}
14 changes: 14 additions & 0 deletions wpiutil/src/test/native/cpp/StaticCircularBufferTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,18 @@ TEST(StaticCircularBufferTest, Iterator) {
EXPECT_EQ(values[i], elem);
++i;
}

// reverse_iterator
i = 2;
for (auto it = queue.rbegin(); it != queue.rend(); ++it) {
EXPECT_EQ(values[i], *it);
--i;
}

// const_reverse_iterator
i = 2;
for (auto it = queue.crbegin(); it != queue.crend(); ++it) {
EXPECT_EQ(values[i], *it);
--i;
}
}
Loading