Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
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
72
74
template
<
typename
T>
75
T
&
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
83
template
<
typename
V>
84
auto
MakeByteSpan
(
const
V& v)
noexcept
85
{
86
return
std::as_bytes(std::span{v});
87
}
88
template
<
typename
V>
89
auto
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.
95
inline
unsigned
char
*
UCharCast
(
char
* c) {
return
reinterpret_cast<
unsigned
char
*
>
(c); }
96
inline
unsigned
char
*
UCharCast
(
unsigned
char
* c) {
return
c; }
97
inline
unsigned
char
*
UCharCast
(
signed
char
* c) {
return
reinterpret_cast<
unsigned
char
*
>
(c); }
98
inline
unsigned
char
*
UCharCast
(std::byte* c) {
return
reinterpret_cast<
unsigned
char
*
>
(c); }
99
inline
const
unsigned
char
*
UCharCast
(
const
char
* c) {
return
reinterpret_cast<
const
unsigned
char
*
>
(c); }
100
inline
const
unsigned
char
*
UCharCast
(
const
unsigned
char
* c) {
return
c; }
101
inline
const
unsigned
char
*
UCharCast
(
const
signed
char
* c) {
return
reinterpret_cast<
const
unsigned
char
*
>
(c); }
102
inline
const
unsigned
char
*
UCharCast
(
const
std::byte* c) {
return
reinterpret_cast<
const
unsigned
char
*
>
(c); }
103
// Helper concept for the basic byte types.
104
template
<
typename
B>
105
concept
BasicByte
=
requires
{
UCharCast
(std::span<B>{}.data()); };
106
107
// Helper function to safely convert a span to a span<[const] unsigned char>.
108
template
<
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
111
template
<
typename
V>
constexpr
auto
MakeUCharSpan
(
const
V& v) ->
decltype
(
UCharSpanCast
(std::span{v})) {
return
UCharSpanCast
(std::span{v}); }
112
template
<
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
BasicByte
Definition
span.h:105
T
#define T(expected, seed, data)
MakeWritableUCharSpan
constexpr auto MakeWritableUCharSpan(V &&v) -> decltype(UCharSpanCast(std::span{std::forward< V >(v)}))
Definition
span.h:112
MakeByteSpan
auto MakeByteSpan(const V &v) noexcept
Definition
span.h:84
MakeUCharSpan
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
SpanPopBack
T & SpanPopBack(std::span< T > &span)
A span is an object that can refer to a contiguous sequence of objects.
Definition
span.h:75
MakeWritableByteSpan
auto MakeWritableByteSpan(V &&v) noexcept
Definition
span.h:89
UCharSpanCast
constexpr auto UCharSpanCast(std::span< T, N > s)
Definition
span.h:108
UCharCast
unsigned char * UCharCast(char *c)
Definition
span.h:95
Generated on
for Bitcoin Core by
1.17.0