// Copyright 2019 The Chromium Authors. All rights reserved. // 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 #include 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 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. These are similar to absl::string_view's < and == operators. constexpr inline bool SpanLessThan(span x, span y) noexcept { auto min_size = std::min(x.size(), y.size()); const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size); return (r < 0) || (r == 0 && x.size() < y.size()); } constexpr inline bool SpanEquals(span x, span y) noexcept { auto len = x.size(); if (len != y.size()) return false; return x.data() == y.data() || len == 0 || std::memcmp(x.data(), y.data(), len) == 0; } } // namespace v8_crdtp #endif // V8_CRDTP_SPAN_H_