// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_CRDTP_SPAN_H_ #define V8_CRDTP_SPAN_H_ #include #include #include #include "export.h" namespace v8_crdtp { // ============================================================================= // span - sequence of bytes // ============================================================================= // This template is similar to std::span, which will be included in C++20. template class span { public: using index_type = size_t; constexpr span() : data_(nullptr), size_(0) {} constexpr span(const T* data, index_type size) : data_(data), size_(size) {} constexpr const T* data() const { return data_; } constexpr const T* begin() const { return data_; } constexpr const T* end() const { return data_ + size_; } constexpr const T& operator[](index_type idx) const { return data_[idx]; } constexpr span subspan(index_type offset, index_type count) const { return span(data_ + offset, count); } constexpr span subspan(index_type offset) const { return span(data_ + offset, size_ - offset); } constexpr bool empty() const { return size_ == 0; } constexpr index_type size() const { return size_; } constexpr index_type size_bytes() const { return size_ * sizeof(T); } private: const T* data_; index_type size_; }; template constexpr span MakeSpan(const char (&str)[N]) { return span(str, N - 1); } template constexpr span SpanFrom(const char (&str)[N]) { return span(reinterpret_cast(str), N - 1); } constexpr inline span SpanFrom(const char* str) { return str ? span(reinterpret_cast(str), strlen(str)) : span(); } inline span SpanFrom(const std::string& v) { return span(reinterpret_cast(v.data()), v.size()); } // This SpanFrom routine works for std::vector and // std::vector, but also for base::span in Chromium. template {} && std::is_member_function_pointer{}>> inline span SpanFrom(const C& v) { return span(v.data(), v.size()); } // Less than / equality comparison functions for sorting / searching for byte // spans. bool SpanLessThan(span x, span y) noexcept; bool SpanEquals(span x, span y) noexcept; // Less than / equality comparison functions for sorting / searching for byte // spans. bool SpanLessThan(span x, span y) noexcept; bool SpanEquals(span x, span y) noexcept; struct SpanLt { bool operator()(span l, span r) const { return SpanLessThan(l, r); } }; } // namespace v8_crdtp #endif // V8_CRDTP_SPAN_H_