From 9487f0e564bbb5163ad33860d82f2be16b7ab562 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sat, 18 Jan 2025 23:31:54 +0100 Subject: Add contiguous iterators --- asl/span.hpp | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'asl/span.hpp') diff --git a/asl/span.hpp b/asl/span.hpp index 8f6fb4a..730ef71 100644 --- a/asl/span.hpp +++ b/asl/span.hpp @@ -10,6 +10,38 @@ namespace asl static constexpr isize_t dynamic_size = -1; +template +class contiguous_iterator +{ + T* m_ptr; + +public: + constexpr explicit contiguous_iterator(T* ptr) : m_ptr{ptr} {} + + constexpr bool operator==(const contiguous_iterator& other) const + { + return other.m_ptr == m_ptr; + } + + constexpr contiguous_iterator& operator++() + { + m_ptr += 1; + return *this; + } + + constexpr contiguous_iterator operator++(int) + { + return contiguous_iterator{ exchange(m_ptr, m_ptr + 1) }; + } + + constexpr T& operator*() const { return *m_ptr; } + + constexpr T* operator->() const { return m_ptr; } +}; + +template +contiguous_iterator(T) -> contiguous_iterator; + template class span { @@ -88,8 +120,15 @@ public: constexpr T* data() const { return m_data; } - constexpr T* begin() const { return m_data; } - constexpr T* end() const { return m_data + size(); } + constexpr contiguous_iterator begin() const + { + return contiguous_iterator{m_data}; + } + + constexpr contiguous_iterator end() const + { + return contiguous_iterator{m_data + size()}; + } constexpr T& operator[](isize_t i) const { -- cgit