From 9f76314dca9bfdf4e653a05a2b988517b294ed9c Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 22 Nov 2024 14:18:18 +0300 Subject: [PATCH] types: span::slice & helpers --- code/espurna/types.h | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/code/espurna/types.h b/code/espurna/types.h index 0c5da0f7..018ff0b4 100644 --- a/code/espurna/types.h +++ b/code/espurna/types.h @@ -443,13 +443,15 @@ inline String operator+(String&& lhs, const __FlashStringHelper* rhs) { template 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 slice(size_t index, size_t size) const { + return Span(_data + std::min(index, _size), std::min(size, _size - index)); + } + + constexpr Span slice(size_t index) const { + return slice(index, _size - index); + } + + Span& advance(size_t index) { + return *this = slice(index); + } + private: T* _data; size_t _size;