diff --git a/src/span.h b/src/span.h --- a/src/span.h +++ b/src/span.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #ifdef DEBUG @@ -195,4 +196,33 @@ return back; } +// Helper functions to safely cast to uint8_t pointers. +inline uint8_t *UCharCast(char *c) { + return (uint8_t *)c; +} +inline uint8_t *UCharCast(uint8_t *c) { + return c; +} +inline const uint8_t *UCharCast(const char *c) { + return (uint8_t *)c; +} +inline const uint8_t *UCharCast(const uint8_t *c) { + return c; +} + +// Helper function to safely convert a Span to a Span<[const] uint8_t>. +template +constexpr auto UCharSpanCast(Span s) + -> Span::type> { + return {UCharCast(s.data()), s.size()}; +} + +/** Like MakeSpan, but for (const) uint8_t member types only. Only works + * for (un)signed char containers. */ +template +constexpr auto MakeUCharSpan(V &&v) + -> decltype(UCharSpanCast(MakeSpan(std::forward(v)))) { + return UCharSpanCast(MakeSpan(std::forward(v))); +} + #endif // BITCOIN_SPAN_H