diff --git a/Source/Core/Common/BitUtils.h b/Source/Core/Common/BitUtils.h index 6b4835d8aa6..e052c8aeff4 100644 --- a/Source/Core/Common/BitUtils.h +++ b/Source/Core/Common/BitUtils.h @@ -255,15 +255,33 @@ T ExpandValue(T value, size_t left_shift_amount) (T(-ExtractBit<0>(value)) >> (BitSize() - left_shift_amount)); } +// Convert a contiguous range of a trivially-copyable type to a `span` +template +requires(std::is_trivially_copyable_v>) +constexpr auto AsU8Span(const T& range) +{ + return std::span{reinterpret_cast(range.data()), range.size() * sizeof(*range.data())}; +} + +// Convert a contiguous range of a non-const trivially-copyable type to a `span` +template +requires(std::is_trivially_copyable_v>) +constexpr auto AsWritableU8Span(T& range) +{ + return std::span{reinterpret_cast(range.data()), range.size() * sizeof(*range.data())}; +} + +// Convert a trivially-copyable object to a `span` template -requires(std::is_trivially_copyable_v) +requires(!std::ranges::contiguous_range && std::is_trivially_copyable_v) constexpr auto AsU8Span(const T& obj) { return std::span{reinterpret_cast(std::addressof(obj)), sizeof(obj)}; } +// Convert a non-const trivially-copyable object to a `span` template -requires(std::is_trivially_copyable_v) +requires(!std::ranges::contiguous_range && std::is_trivially_copyable_v) constexpr auto AsWritableU8Span(T& obj) { return std::span{reinterpret_cast(std::addressof(obj)), sizeof(obj)};