diff options
| author | Pieter Wuille <[email protected]> | 2020-06-18 16:31:08 -0700 |
|---|---|---|
| committer | Pieter Wuille <[email protected]> | 2020-07-30 13:57:09 -0700 |
| commit | e63dcc3a6752e7d406e7a650c2d6c2e95cd39aab (patch) | |
| tree | b34c1f56300dcb2a9248610a443d7311a5e5cc27 | |
| parent | Make uint256 Span-convertible by adding ::data() (diff) | |
| download | discoin-e63dcc3a6752e7d406e7a650c2d6c2e95cd39aab.tar.xz discoin-e63dcc3a6752e7d406e7a650c2d6c2e95cd39aab.zip | |
Add MakeUCharSpan, to help constructing Span<[const] unsigned char>
Based on a suggestion by Russell Yanofsky.
| -rw-r--r-- | src/span.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/span.h b/src/span.h index 79f13c920..4afb383a5 100644 --- a/src/span.h +++ b/src/span.h @@ -207,4 +207,16 @@ T& SpanPopBack(Span<T>& span) return back; } +// Helper functions to safely cast to unsigned char pointers. +inline unsigned char* UCharCast(char* c) { return (unsigned char*)c; } +inline unsigned char* UCharCast(unsigned char* c) { return c; } +inline const unsigned char* UCharCast(const char* c) { return (unsigned char*)c; } +inline const unsigned char* UCharCast(const unsigned char* c) { return c; } + +// Helper function to safely convert a Span to a Span<[const] unsigned char>. +template <typename T> constexpr auto UCharSpanCast(Span<T> s) -> Span<typename std::remove_pointer<decltype(UCharCast(s.data()))>::type> { return {UCharCast(s.data()), s.size()}; } + +/** Like MakeSpan, but for (const) unsigned char member types only. Only works for (un)signed char containers. */ +template <typename V> constexpr auto MakeUCharSpan(V&& v) -> decltype(UCharSpanCast(MakeSpan(std::forward<V>(v)))) { return UCharSpanCast(MakeSpan(std::forward<V>(v))); } + #endif |