Bitcoin Core 29.99.0
P2P Digital Currency
span.h
Go to the documentation of this file.
1// Copyright (c) 2018-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#ifndef BITCOIN_SPAN_H
6#define BITCOIN_SPAN_H
7
8#include <cassert>
9#include <cstddef>
10#include <span>
11#include <type_traits>
12#include <utility>
13
74template <typename T>
75T& SpanPopBack(std::span<T>& span)
76{
77 size_t size = span.size();
78 T& back = span.back();
79 span = span.first(size - 1);
80 return back;
81}
82
83template <typename V>
84auto MakeByteSpan(const V& v) noexcept
85{
86 return std::as_bytes(std::span{v});
87}
88template <typename V>
89auto MakeWritableByteSpan(V&& v) noexcept
90{
91 return std::as_writable_bytes(std::span{std::forward<V>(v)});
92}
93
94// Helper functions to safely cast basic byte pointers to unsigned char pointers.
95inline unsigned char* UCharCast(char* c) { return reinterpret_cast<unsigned char*>(c); }
96inline unsigned char* UCharCast(unsigned char* c) { return c; }
97inline unsigned char* UCharCast(signed char* c) { return reinterpret_cast<unsigned char*>(c); }
98inline unsigned char* UCharCast(std::byte* c) { return reinterpret_cast<unsigned char*>(c); }
99inline const unsigned char* UCharCast(const char* c) { return reinterpret_cast<const unsigned char*>(c); }
100inline const unsigned char* UCharCast(const unsigned char* c) { return c; }
101inline const unsigned char* UCharCast(const signed char* c) { return reinterpret_cast<const unsigned char*>(c); }
102inline const unsigned char* UCharCast(const std::byte* c) { return reinterpret_cast<const unsigned char*>(c); }
103// Helper concept for the basic byte types.
104template <typename B>
105concept BasicByte = requires { UCharCast(std::span<B>{}.data()); };
106
107// Helper function to safely convert a span to a span<[const] unsigned char>.
108template <typename T, size_t N> constexpr auto UCharSpanCast(std::span<T, N> s) { return std::span<std::remove_pointer_t<decltype(UCharCast(s.data()))>, N>{UCharCast(s.data()), s.size()}; }
109
111template <typename V> constexpr auto MakeUCharSpan(const V& v) -> decltype(UCharSpanCast(std::span{v})) { return UCharSpanCast(std::span{v}); }
112template <typename V> constexpr auto MakeWritableUCharSpan(V&& v) -> decltype(UCharSpanCast(std::span{std::forward<V>(v)})) { return UCharSpanCast(std::span{std::forward<V>(v)}); }
113
114#endif // BITCOIN_SPAN_H
#define T(expected, seed, data)
constexpr auto MakeWritableUCharSpan(V &&v) -> decltype(UCharSpanCast(std::span{std::forward< V >(v)}))
Definition: span.h:112
auto MakeByteSpan(const V &v) noexcept
Definition: span.h:84
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span{v}))
Like the std::span constructor, but for (const) unsigned char member types only.
Definition: span.h:111
T & SpanPopBack(std::span< T > &span)
A span is an object that can refer to a contiguous sequence of objects.
Definition: span.h:75
auto MakeWritableByteSpan(V &&v) noexcept
Definition: span.h:89
constexpr auto UCharSpanCast(std::span< T, N > s)
Definition: span.h:108
unsigned char * UCharCast(char *c)
Definition: span.h:95