8 #ifndef WPIUTIL_WPI_UIDVECTOR_H_
9 #define WPIUTIL_WPI_UIDVECTOR_H_
18 template <
typename It>
21 using iterator_type = std::forward_iterator_tag;
22 using value_type =
typename It::value_type;
23 using difference_type =
typename It::difference_type;
24 using reference =
typename It::reference;
25 using pointer =
typename It::pointer;
30 while (m_it != m_end && !*m_it) ++m_it;
33 reference operator*()
const noexcept {
return *m_it; }
34 pointer operator->()
const noexcept {
return m_it.operator->(); }
40 }
while (m_it != m_end && !*m_it);
51 return m_it == oth.m_it;
55 return m_it != oth.m_it;
70 template <typename T, typename std::vector<T>::size_type reuse_threshold>
75 using const_pointer =
const T*;
77 using const_reference =
const T&;
78 using size_type =
typename std::vector<T>::size_type;
79 using difference_type =
typename std::vector<T>::difference_type;
84 bool empty()
const {
return m_active_count == 0; }
85 size_type size()
const {
return m_vector.size(); }
86 T& operator[](size_type i) {
return m_vector[i]; }
87 const T& operator[](size_type i)
const {
return m_vector[i]; }
92 template <
class... Args>
93 size_type emplace_back(Args&&... args) {
95 if (m_free.size() < reuse_threshold) {
96 uid = m_vector.size();
97 m_vector.emplace_back(std::forward<Args>(args)...);
100 m_free.erase(m_free.begin());
101 m_vector[uid] = T(std::forward<Args>(args)...);
109 void erase(size_type uid) {
110 if (uid >= m_vector.size() || !m_vector[uid])
return;
111 m_free.push_back(uid);
125 return iterator(m_vector.begin(), m_vector.end());
133 iterator end() noexcept {
return iterator(m_vector.end(), m_vector.end()); }
142 std::vector<T> m_vector;
143 std::vector<size_type> m_free;
144 size_type m_active_count{0};
149 #endif // WPIUTIL_WPI_UIDVECTOR_H_
WPILib C++ utilities (wpiutil) namespace.
Definition: SmallString.h:21
Definition: UidVector.h:71
Definition: UidVector.h:19