2019-11-12 09:13:48 +00:00
|
|
|
// 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 <cstdint>
|
|
|
|
#include <cstring>
|
|
|
|
#include <string>
|
2020-03-20 03:50:22 +00:00
|
|
|
|
|
|
|
#include "export.h"
|
2019-11-12 09:13:48 +00:00
|
|
|
|
|
|
|
namespace v8_crdtp {
|
|
|
|
// =============================================================================
|
|
|
|
// span - sequence of bytes
|
|
|
|
// =============================================================================
|
|
|
|
|
|
|
|
// This template is similar to std::span, which will be included in C++20.
|
|
|
|
template <typename T>
|
|
|
|
class span {
|
|
|
|
public:
|
|
|
|
using index_type = size_t;
|
|
|
|
|
2019-12-05 21:41:21 +00:00
|
|
|
constexpr span() : data_(nullptr), size_(0) {}
|
|
|
|
constexpr span(const T* data, index_type size) : data_(data), size_(size) {}
|
2019-11-12 09:13:48 +00:00
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr const T* data() const { return data_; }
|
2019-11-12 09:13:48 +00:00
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr const T* begin() const { return data_; }
|
|
|
|
constexpr const T* end() const { return data_ + size_; }
|
2019-11-12 09:13:48 +00:00
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr const T& operator[](index_type idx) const { return data_[idx]; }
|
2019-11-12 09:13:48 +00:00
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr span<T> subspan(index_type offset, index_type count) const {
|
2019-11-12 09:13:48 +00:00
|
|
|
return span(data_ + offset, count);
|
|
|
|
}
|
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr span<T> subspan(index_type offset) const {
|
2019-11-12 09:13:48 +00:00
|
|
|
return span(data_ + offset, size_ - offset);
|
|
|
|
}
|
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr bool empty() const { return size_ == 0; }
|
2019-11-12 09:13:48 +00:00
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr index_type size() const { return size_; }
|
|
|
|
constexpr index_type size_bytes() const { return size_ * sizeof(T); }
|
2019-11-12 09:13:48 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
const T* data_;
|
|
|
|
index_type size_;
|
|
|
|
};
|
|
|
|
|
2020-07-01 15:01:18 +00:00
|
|
|
template <size_t N>
|
|
|
|
constexpr span<char> MakeSpan(const char (&str)[N]) {
|
|
|
|
return span<char>(str, N - 1);
|
|
|
|
}
|
|
|
|
|
2019-11-12 09:13:48 +00:00
|
|
|
template <size_t N>
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr span<uint8_t> SpanFrom(const char (&str)[N]) {
|
2019-11-12 09:13:48 +00:00
|
|
|
return span<uint8_t>(reinterpret_cast<const uint8_t*>(str), N - 1);
|
|
|
|
}
|
|
|
|
|
2019-12-09 20:33:50 +00:00
|
|
|
constexpr inline span<uint8_t> SpanFrom(const char* str) {
|
2019-11-12 09:13:48 +00:00
|
|
|
return str ? span<uint8_t>(reinterpret_cast<const uint8_t*>(str), strlen(str))
|
|
|
|
: span<uint8_t>();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline span<uint8_t> SpanFrom(const std::string& v) {
|
|
|
|
return span<uint8_t>(reinterpret_cast<const uint8_t*>(v.data()), v.size());
|
|
|
|
}
|
|
|
|
|
2019-12-18 19:43:24 +00:00
|
|
|
// This SpanFrom routine works for std::vector<uint8_t> and
|
|
|
|
// std::vector<uint16_t>, but also for base::span<const uint8_t> in Chromium.
|
|
|
|
template <typename C,
|
|
|
|
typename = std::enable_if_t<
|
|
|
|
std::is_unsigned<typename C::value_type>{} &&
|
|
|
|
std::is_member_function_pointer<decltype(&C::size)>{}>>
|
|
|
|
inline span<typename C::value_type> SpanFrom(const C& v) {
|
|
|
|
return span<typename C::value_type>(v.data(), v.size());
|
|
|
|
}
|
|
|
|
|
2019-11-12 09:13:48 +00:00
|
|
|
// Less than / equality comparison functions for sorting / searching for byte
|
2020-07-01 15:01:18 +00:00
|
|
|
// spans.
|
2020-03-20 03:50:22 +00:00
|
|
|
bool SpanLessThan(span<uint8_t> x, span<uint8_t> y) noexcept;
|
|
|
|
bool SpanEquals(span<uint8_t> x, span<uint8_t> y) noexcept;
|
|
|
|
|
2020-07-01 15:01:18 +00:00
|
|
|
// Less than / equality comparison functions for sorting / searching for byte
|
|
|
|
// spans.
|
|
|
|
bool SpanLessThan(span<char> x, span<char> y) noexcept;
|
|
|
|
bool SpanEquals(span<char> x, span<char> y) noexcept;
|
|
|
|
|
2020-03-20 03:50:22 +00:00
|
|
|
struct SpanLt {
|
|
|
|
bool operator()(span<uint8_t> l, span<uint8_t> r) const {
|
|
|
|
return SpanLessThan(l, r);
|
|
|
|
}
|
|
|
|
};
|
2019-11-12 09:13:48 +00:00
|
|
|
} // namespace v8_crdtp
|
|
|
|
|
|
|
|
#endif // V8_CRDTP_SPAN_H_
|