Changeset View
Changeset View
Standalone View
Standalone View
src/span.h
- This file was added.
// Copyright (c) 2018 The Bitcoin Core developers | |||||
// Distributed under the MIT software license, see the accompanying | |||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||
#ifndef BITCOIN_SPAN_H | |||||
#define BITCOIN_SPAN_H | |||||
#include <cstddef> | |||||
#include <type_traits> | |||||
/** A Span is an object that can refer to a contiguous sequence of objects. | |||||
* | |||||
* It implements a subset of C++20's std::span. | |||||
*/ | |||||
template <typename C> class Span { | |||||
C *m_data; | |||||
std::ptrdiff_t m_size; | |||||
public: | |||||
constexpr Span() noexcept : m_data(nullptr), m_size(0) {} | |||||
constexpr Span(C *data, std::ptrdiff_t size) noexcept | |||||
: m_data(data), m_size(size) {} | |||||
constexpr C *data() const noexcept { return m_data; } | |||||
constexpr std::ptrdiff_t size() const noexcept { return m_size; } | |||||
}; | |||||
/** Create a span to a container exposing data() and size(). | |||||
* | |||||
* This correctly deals with constness: the returned Span's element type will be | |||||
* whatever data() returns a pointer to. If either the passed container is | |||||
* const, or its element type is const, the resulting span will have a const | |||||
* element type. | |||||
* | |||||
* std::span will have a constructor that implements this functionality | |||||
* directly. | |||||
*/ | |||||
template <typename V> | |||||
constexpr Span< | |||||
typename std::remove_pointer<decltype(std::declval<V>().data())>::type> | |||||
MakeSpan(V &v) { | |||||
return Span< | |||||
typename std::remove_pointer<decltype(std::declval<V>().data())>::type>( | |||||
v.data(), v.size()); | |||||
} | |||||
#endif // BITCOIN_SPAN_H |