diff --git a/AK/Span.h b/AK/Span.h index af3fa077aba..93e5e5fc0dc 100644 --- a/AK/Span.h +++ b/AK/Span.h @@ -125,6 +125,8 @@ class Span : public Detail::Span { public: using Detail::Span::Span; + using ElementType = T; + constexpr Span() = default; [[nodiscard]] ALWAYS_INLINE constexpr T const* data() const { return this->m_values; } diff --git a/Libraries/LibIPC/Encoder.h b/Libraries/LibIPC/Encoder.h index e6294edcf6c..f1723417180 100644 --- a/Libraries/LibIPC/Encoder.h +++ b/Libraries/LibIPC/Encoder.h @@ -139,6 +139,7 @@ template<> ErrorOr encode(Encoder&, URL::BlobURLEntry::MediaSource const&); template +requires(!IsArithmetic) ErrorOr encode(Encoder& encoder, T const& span) { TRY(encoder.encode_size(span.size())); @@ -149,6 +150,18 @@ ErrorOr encode(Encoder& encoder, T const& span) return {}; } +template +requires(IsArithmetic) +ErrorOr encode(Encoder& encoder, T const& span) +{ + TRY(encoder.encode_size(span.size())); + + VERIFY(!Checked::multiplication_would_overflow(span.size(), sizeof(typename T::ElementType))); + TRY(encoder.append(reinterpret_cast(span.data()), span.size() * sizeof(typename T::ElementType))); + + return {}; +} + template ErrorOr encode(Encoder& encoder, Array const& array) {