diff --git a/Libraries/LibIPC/Concepts.h b/Libraries/LibIPC/Concepts.h index c11d8f9f84c..e6f6dd88e3c 100644 --- a/Libraries/LibIPC/Concepts.h +++ b/Libraries/LibIPC/Concepts.h @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -27,7 +28,8 @@ namespace IPC::Concepts { namespace Detail { -// Cannot use SpecializationOf with these templates because they have non-type parameters. See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1985r3.pdf +// Cannot use SpecializationOf with these templates because they have non-type parameters. See: +// https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1985r3.pdf template constexpr inline bool IsArray = false; template @@ -56,6 +58,9 @@ concept Array = Detail::IsArray; template concept Vector = Detail::IsVector; +template +concept Span = SpecializationOf; + template concept HashMap = Detail::IsHashMap; diff --git a/Libraries/LibIPC/Encoder.h b/Libraries/LibIPC/Encoder.h index 62d5118096b..04109393302 100644 --- a/Libraries/LibIPC/Encoder.h +++ b/Libraries/LibIPC/Encoder.h @@ -116,26 +116,27 @@ ErrorOr encode(Encoder&, File const&); template<> ErrorOr encode(Encoder&, Empty const&); -template -ErrorOr encode(Encoder& encoder, Array const& array) +template +ErrorOr encode(Encoder& encoder, T const& span) { - TRY(encoder.encode_size(array.size())); + TRY(encoder.encode_size(span.size())); - for (auto const& value : array) + for (auto const& value : span) TRY(encoder.encode(value)); return {}; } +template +ErrorOr encode(Encoder& encoder, Array const& array) +{ + return encoder.encode(array.span()); +} + template ErrorOr encode(Encoder& encoder, T const& vector) { - TRY(encoder.encode_size(vector.size())); - - for (auto const& value : vector) - TRY(encoder.encode(value)); - - return {}; + return encoder.encode(vector.span()); } template