From b98acb9a37a80b22a0da1bee7be0c4c44adadb56 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Wed, 29 Oct 2025 20:26:33 -0500 Subject: [PATCH] Common/BitUtils: Add overloads of AsU8Span/AsWritableU8Span that handle conversions from contiguous ranges. --- Source/Core/Common/BitUtils.h | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) 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)};