![]() |
Bitcoin Core 30.99.0
P2P Digital Currency
|
#include <cassert>#include <cstddef>#include <span>#include <type_traits>#include <utility>Go to the source code of this file.
Concepts | |
| concept | BasicByte |
Functions | |
| template<typename T > | |
| T & | SpanPopBack (std::span< T > &span) |
| A span is an object that can refer to a contiguous sequence of objects. More... | |
| template<typename V > | |
| auto | MakeByteSpan (const V &v) noexcept |
| template<typename V > | |
| auto | MakeWritableByteSpan (V &&v) noexcept |
| unsigned char * | UCharCast (char *c) |
| unsigned char * | UCharCast (unsigned char *c) |
| unsigned char * | UCharCast (signed char *c) |
| unsigned char * | UCharCast (std::byte *c) |
| const unsigned char * | UCharCast (const char *c) |
| const unsigned char * | UCharCast (const unsigned char *c) |
| const unsigned char * | UCharCast (const signed char *c) |
| const unsigned char * | UCharCast (const std::byte *c) |
| template<typename T , size_t N> | |
| constexpr auto | UCharSpanCast (std::span< T, N > s) |
| template<typename V > | |
| constexpr auto | MakeUCharSpan (const V &v) -> decltype(UCharSpanCast(std::span{v})) |
| Like the std::span constructor, but for (const) unsigned char member types only. More... | |
| template<typename V > | |
| constexpr auto | MakeWritableUCharSpan (V &&v) -> decltype(UCharSpanCast(std::span{std::forward< V >(v)})) |
|
noexcept |
|
constexpr |
|
noexcept |
|
constexpr |
| T & SpanPopBack | ( | std::span< T > & | span | ) |
A span is an object that can refer to a contiguous sequence of objects.
Things to be aware of when writing code that deals with spans:
std::vector<int> vec{1,2,3,4};
std::span<int> sp(vec);
vec.push_back(5);
printf("%i\n", sp.front()); // UB!
may exhibit undefined behavior, as increasing the size of a vector may invalidate references.std::span<const int> sp(std::vector<int>{1, 2, 3});
printf("%i\n", sp.front()); // UB!
The lifetime of the vector ends when the statement it is created in ends. Thus the span is left with a dangling reference, and using it is undefined.Due to spans automatic creation from range-like objects (arrays, and data types that expose a data() and size() member function), functions that accept a span as input parameter can be called with any compatible range-like object. For example, this works:
void Foo(std::span<const int> arg);
Foo(std::vector<int>{1, 2, 3}); // Works
This is very useful in cases where a function truly does not care about the container, and only about having exactly a range of elements. However it may also be surprising to see automatic conversions in this case.
When a function accepts a span with a mutable element type, it will not accept temporaries; only variables or other references. For example:
void FooMut(std::span<int> arg);
FooMut(std::vector<int>{1, 2, 3}); // Does not compile
std::vector<int> baz{1, 2, 3};
FooMut(baz); // Works
This is similar to how functions that take (non-const) lvalue references as input cannot accept temporaries. This does not work either:
void FooVec(std::vector<int>& arg);
FooVec(std::vector<int>{1, 2, 3}); // Does not compile
The idea is that if a function accepts a mutable reference, a meaningful result will be present in that variable after the call. Passing a temporary is useless in that context. Pop the last element off a span, and return a reference to that element.
Definition at line 75 of file span.h.
|
inline |
|
inline |
|
inline |
|
inline |