Bitcoin Core  31.0.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 
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
auto MakeByteSpan(const V &v) noexcept
Definition: span.h:84
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span
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
concept BasicByte
Definition: span.h:105
auto MakeWritableByteSpan(V &&v) noexcept
Definition: span.h:89
constexpr auto MakeWritableUCharSpan(V &&v) -> decltype(UCharSpanCast(std::span
Definition: span.h:112
constexpr auto UCharSpanCast(std::span< T, N > s)
Definition: span.h:108
unsigned char * UCharCast(char *c)
Definition: span.h:95
#define T(expected, seed, data)