types: span::slice & helpers

This commit is contained in:
Maxim Prokhorov
2024-11-22 14:18:18 +03:00
parent 2a40e505fc
commit 9f76314dca

View File

@@ -443,13 +443,15 @@ inline String operator+(String&& lhs, const __FlashStringHelper* rhs) {
template <typename T>
struct Span {
Span() = delete;
constexpr explicit Span(std::nullptr_t) :
_data(nullptr),
_size(0)
{}
constexpr Span() noexcept :
Span(nullptr)
{}
constexpr Span(T* data, size_t size) :
_data(data),
_size(size)
@@ -464,6 +466,14 @@ struct Span {
return _data;
}
constexpr bool is_null() const {
return _data == nullptr;
}
constexpr bool empty() const {
return is_null() || _size == 0;
}
constexpr size_t size() const {
return _size;
}
@@ -488,6 +498,18 @@ struct Span {
return _data[_size - 1];
}
constexpr Span<T> slice(size_t index, size_t size) const {
return Span<T>(_data + std::min(index, _size), std::min(size, _size - index));
}
constexpr Span<T> slice(size_t index) const {
return slice(index, _size - index);
}
Span<T>& advance(size_t index) {
return *this = slice(index);
}
private:
T* _data;
size_t _size;