diff --git a/solanaceae/file/file2.hpp b/solanaceae/file/file2.hpp index 9024b18..1ede998 100644 --- a/solanaceae/file/file2.hpp +++ b/solanaceae/file/file2.hpp @@ -20,6 +20,6 @@ struct File2I { // pos -1 means stream, append to last written, or read position (independent, like FILE*s) virtual bool write(const ByteSpan data, int64_t pos = -1) = 0; - virtual std::variant> read(uint64_t size, int64_t pos = -1) = 0; + [[nodiscard]] virtual std::variant> read(uint64_t size, int64_t pos = -1) = 0; }; diff --git a/solanaceae/util/span.hpp b/solanaceae/util/span.hpp index 06a26da..faacd8c 100644 --- a/solanaceae/util/span.hpp +++ b/solanaceae/util/span.hpp @@ -3,6 +3,7 @@ #include #include #include +#include // non owning view template @@ -10,9 +11,21 @@ struct Span final { const T* ptr {nullptr}; uint64_t size {0}; + constexpr Span(const Span&) = default; + constexpr Span(Span&&) = default; constexpr Span(void) {} constexpr Span(const T* ptr_, uint64_t size_) : ptr(ptr_), size(size_) {} + constexpr Span(T* ptr_, uint64_t size_) : ptr(ptr_), size(size_) {} constexpr explicit Span(const std::vector& vec) : ptr(vec.data()), size(vec.size()) {} + constexpr explicit Span(std::vector& vec) : ptr(vec.data()), size(vec.size()) {} + template constexpr explicit Span(const std::array& arr) : ptr(arr.data()), size(arr.size()) {} + template constexpr explicit Span(std::array& arr) : ptr(arr.data()), size(arr.size()) {} + + Span& operator=(const Span& other) { + ptr = other.ptr; + size = other.size; + return *this; + } explicit operator std::vector() const { return std::vector{ptr, ptr+size}; @@ -26,6 +39,16 @@ struct Span final { return ptr[i]; } +#if 0 + constexpr T& operator[](uint64_t i) { + if (i > size) { + throw std::out_of_range("accessed span out of range"); + } + + return ptr[i]; + } +#endif + constexpr const T* cbegin(void) const { return ptr; } constexpr const T* cend(void) const { return ptr+size; } constexpr const T* begin(void) const { return ptr; } @@ -36,4 +59,5 @@ struct Span final { // useful alias using ByteSpan = Span; +using ConstByteSpan = Span; // TODO: make use of?