diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-11-04 22:23:34 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-12-20 15:35:58 +0100 |
commit | d729d8dc9966fe4af04cf1661649e57888bb41b2 (patch) | |
tree | eb7c3fdace3bf541193645bac10b3647b1b668bd /asl/span.hpp | |
parent | 8b1110c61c9090e9535d106c9cdcee6e46db1dc8 (diff) |
Add span::first/last
Diffstat (limited to 'asl/span.hpp')
-rw-r--r-- | asl/span.hpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/asl/span.hpp b/asl/span.hpp index 5ffcf68..fe0e163 100644 --- a/asl/span.hpp +++ b/asl/span.hpp @@ -97,9 +97,6 @@ public: return m_data[i]; // NOLINT(*-pointer-arithmetic) } - // @Todo first, last - // @Todo as_(mutable_)bytes - template<int64_t kOffset, int64_t kSubSize = dynamic_size> constexpr auto subspan() const requires ( @@ -140,6 +137,42 @@ public: ASL_ASSERT(sub_size <= size() - offset); return span<T>{ data() + offset, sub_size }; } + + template<int64_t kSubSize> + constexpr auto first() const + requires ( + kSubSize >= 0 && + (kIsDynamic || kSubSize <= kSize) + ) + { + ASL_ASSERT(kSubSize <= size()); + return span<T, kSubSize>{ data(), kSubSize }; + } + + constexpr span<T> first(int64_t sub_size) const + { + ASL_ASSERT(sub_size >= 0 && sub_size <= size()); + return span<T>{ data(), sub_size }; + } + + template<int64_t kSubSize> + constexpr auto last() const + requires ( + kSubSize >= 0 && + (kIsDynamic || kSubSize <= kSize) + ) + { + ASL_ASSERT(kSubSize <= size()); + return span<T, kSubSize>{ data() + size() - kSubSize, kSubSize }; + } + + constexpr span<T> last(int64_t sub_size) const + { + ASL_ASSERT(sub_size >= 0 && sub_size <= size()); + return span<T>{ data() + size() - sub_size, sub_size }; + } + + // @Todo as_(mutable_)bytes }; } // namespace asl |