Skip to content

Instantly share code, notes, and snippets.

@rep-movsd
Created December 4, 2022 13:39
Show Gist options
  • Save rep-movsd/c513ab7c6f0729a4ac02b042c669ba84 to your computer and use it in GitHub Desktop.
Save rep-movsd/c513ab7c6f0729a4ac02b042c669ba84 to your computer and use it in GitHub Desktop.
A C++ iterator class that uses integer indices rather than pointers
template<typename T>
class buf_idx_iter
{
public:
using iterator_category = std::random_access_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;
buf_idx_iter(pointer ptr = nullptr, size_t idx = 0) : m_ptr(ptr), m_idx(idx) {}
friend auto operator<=>(const buf_idx_iter& lhs, const buf_idx_iter& rhs) {return lhs.m_idx <=> rhs.m_idx;};
friend bool operator==(const buf_idx_iter& lhs, const buf_idx_iter& rhs) {return lhs.m_idx == rhs.m_idx;};
friend difference_type operator-(const buf_idx_iter& lhs, const buf_idx_iter& rhs) { return lhs.m_idx - rhs.m_idx;}
pointer operator->() const { return m_ptr + m_idx; }
reference operator*() const { return *(m_ptr + m_idx); }
buf_idx_iter& operator++() { ++m_idx; return *this; }
buf_idx_iter& operator--() { --m_idx; return *this; }
buf_idx_iter operator+(difference_type n) const { return buf_idx_iter(m_ptr, m_idx + n); }
buf_idx_iter operator-(difference_type n) const { return buf_idx_iter(m_ptr, m_idx - n); }
private:
pointer m_ptr;
size_t m_idx;
};
template <typename V> buf_idx_iter<V> ibegin(std::vector<V>& vec){ return buf_idx_iter<V>(vec.data(), 0); }
template <typename V> buf_idx_iter<V> iend(std::vector<V>& vec) { return buf_idx_iter<V>(vec.data(), vec.size()); }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment