summaryrefslogtreecommitdiff
path: root/asl/span.hpp
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-11-04 22:23:34 +0100
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-12-20 15:35:58 +0100
commitd729d8dc9966fe4af04cf1661649e57888bb41b2 (patch)
treeeb7c3fdace3bf541193645bac10b3647b1b668bd /asl/span.hpp
parent8b1110c61c9090e9535d106c9cdcee6e46db1dc8 (diff)
Add span::first/last
Diffstat (limited to 'asl/span.hpp')
-rw-r--r--asl/span.hpp39
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