[wpiutil] Add reverse/bidirectional iterators to wpi::circular_buffer (#8275)

Use std::reverse_iterator<> to create reverse iterators, make other
iterators bidirectional to allow for this. Added unit tests.
This commit is contained in:
Peter Lilley
2025-10-04 02:13:55 -04:00
committed by GitHub
parent 3972b01c51
commit f1b9be551b
4 changed files with 175 additions and 8 deletions

View File

@@ -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*;
@@ -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]; }
@@ -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*;
@@ -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]; }
@@ -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 const begin iterator.
*/
constexpr const_iterator begin() const { return const_iterator(this, 0); }
/**
* Returns const end iterator.
*/
constexpr const_iterator end() const {
return const_iterator(this, ::wpi::circular_buffer<T>::size());
}
/**
* Returns const begin iterator.
*/
constexpr const_iterator cbegin() const { return const_iterator(this, 0); }
/**
* Returns const 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 const reverse begin iterator.
*/
constexpr const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
}
/**
* Returns const 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
*/

View File

@@ -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*;
@@ -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]; }
@@ -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*;
@@ -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]; }
@@ -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.
*/
@@ -91,29 +112,67 @@ class static_circular_buffer {
}
/**
* Returns begin iterator.
* Returns const begin iterator.
*/
constexpr const_iterator begin() const { return const_iterator(this, 0); }
/**
* Returns end iterator.
* Returns const end iterator.
*/
constexpr const_iterator end() const {
return const_iterator(this, ::wpi::static_circular_buffer<T, N>::size());
}
/**
* Returns begin iterator.
* Returns const begin iterator.
*/
constexpr const_iterator cbegin() const { return const_iterator(this, 0); }
/**
* Returns end iterator.
* Returns const end iterator.
*/
constexpr const_iterator cend() const {
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 const reverse begin iterator.
*/
constexpr const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
}
/**
* Returns const 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
*/