From cb5967d8f46fbba7c7e30f436032fef0ed671fe9 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Mon, 4 Nov 2024 18:11:37 +0100 Subject: More work on span --- asl/span.hpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'asl/span.hpp') diff --git a/asl/span.hpp b/asl/span.hpp index f3d4036..efc9eec 100644 --- a/asl/span.hpp +++ b/asl/span.hpp @@ -3,6 +3,7 @@ #include "asl/meta.hpp" #include "asl/annotations.hpp" #include "asl/layout.hpp" +#include "asl/assert.hpp" namespace asl { @@ -22,6 +23,46 @@ class span public: constexpr span() = default; + constexpr span(T* data, int64_t size) + requires kIsDynamic + : m_data{data} + , m_size{size} + {} + + constexpr explicit span(T* data, int64_t size) + requires (!kIsDynamic) + : m_data{data} + { + ASL_ASSERT(size == kSize); + } + + template + constexpr span(T (&array)[N]) // NOLINT(*-explicit-conversions) + requires (kIsDynamic) + : m_data{array} + , m_size{N} + {} + + template + constexpr span(T (&array)[N]) // NOLINT(*-explicit-conversions) + requires (!kIsDynamic) && (N == kSize) + : m_data{array} + {} + + template + constexpr explicit(!kIsDynamic) + span(const span& other) // NOLINT(*-explicit-conversions) + requires ( + ( + kIsDynamic || + span::kIsDynamic || + kOtherSize == kSize + ) && convertible_from + ) + : span{static_cast(other.data()), other.size()} + { + } + constexpr span(const span&) = default; constexpr span(span&&) = default; @@ -39,6 +80,23 @@ public: constexpr int64_t size_bytes() const { return size() * size_of; } constexpr bool is_empty() const { return size() == 0; } + + constexpr T* data() const { return m_data; } + + constexpr T* begin() const { return m_data; } + constexpr T* end() const { return m_data + size(); } + + constexpr T& operator[](int64_t i) const + { + ASL_ASSERT(i >= 0 && i < size()); + return m_data[i]; // NOLINT(*-pointer-arithmetic) + } + + // @Todo subspan, first, last + // @Todo as_(mutable_)bytes + + template + friend class span; }; } // namespace asl -- cgit