// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once #include "td/utils/common.h" #include "td/utils/logging.h" #include namespace td { namespace detail { template class SpanImpl { InnerT *data_{nullptr}; size_t size_{0}; public: SpanImpl() = default; SpanImpl(InnerT *data, size_t size) : data_(data), size_(size) { } SpanImpl(InnerT &data) : SpanImpl(&data, 1) { } template SpanImpl(const SpanImpl &other) : SpanImpl(other.data(), other.size()) { } template SpanImpl(const std::array &arr) : SpanImpl(arr.data(), arr.size()) { } template SpanImpl(std::array &arr) : SpanImpl(arr.data(), arr.size()) { } SpanImpl(const vector &v) : SpanImpl(v.data(), v.size()) { } SpanImpl(vector &v) : SpanImpl(v.data(), v.size()) { } template SpanImpl &operator=(const SpanImpl &other) { SpanImpl copy{other}; *this = copy; } InnerT &operator[](size_t i) { DCHECK(i < size()); return data_[i]; } InnerT *data() const { return data_; } InnerT *begin() const { return data_; } InnerT *end() const { return data_ + size_; } size_t size() const { return size_; } SpanImpl &truncate(size_t size) { CHECK(size <= size_); size_ = size; return *this; } SpanImpl substr(size_t offset) const { CHECK(offset <= size_); return SpanImpl(begin() + offset, size_ - offset); } }; } // namespace detail template using Span = detail::SpanImpl; template using MutableSpan = detail::SpanImpl; } // namespace td