summaryrefslogtreecommitdiff
path: root/asl/span.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'asl/span.hpp')
-rw-r--r--asl/span.hpp43
1 files changed, 41 insertions, 2 deletions
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<typename T>
+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<typename T>
+contiguous_iterator(T) -> contiguous_iterator<T>;
+
template<is_object T, isize_t kSize = dynamic_size>
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<T> begin() const
+ {
+ return contiguous_iterator{m_data};
+ }
+
+ constexpr contiguous_iterator<T> end() const
+ {
+ return contiguous_iterator{m_data + size()};
+ }
constexpr T& operator[](isize_t i) const
{