LibGUI: Implement serialization for BAN::Vector
This commit is contained in:
parent
d73a667437
commit
7aa24b6157
|
@ -75,6 +75,15 @@
|
||||||
namespace LibGUI
|
namespace LibGUI
|
||||||
{
|
{
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
concept Vector = requires {
|
||||||
|
requires BAN::same_as<T, BAN::Vector<typename T::value_type>>;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr BAN::StringView s_window_server_socket = "/tmp/window-server.socket"_sv;
|
static constexpr BAN::StringView s_window_server_socket = "/tmp/window-server.socket"_sv;
|
||||||
|
|
||||||
namespace Serialize
|
namespace Serialize
|
||||||
|
@ -153,6 +162,40 @@ namespace LibGUI
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<detail::Vector T>
|
||||||
|
inline size_t serialized_size_impl(const T& vector)
|
||||||
|
{
|
||||||
|
size_t result = sizeof(uint32_t);
|
||||||
|
for (const auto& element : vector)
|
||||||
|
result += serialized_size_impl(element);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<detail::Vector T>
|
||||||
|
inline BAN::ErrorOr<void> send_serialized_impl(int socket, const T& vector)
|
||||||
|
{
|
||||||
|
const uint32_t value_size = vector.size();
|
||||||
|
TRY(send_raw_data(socket, BAN::ConstByteSpan::from(value_size)));
|
||||||
|
for (const auto& element : vector)
|
||||||
|
TRY(send_serialized_impl(socket, element));
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<detail::Vector T>
|
||||||
|
inline BAN::ErrorOr<T> deserialize_impl(BAN::ConstByteSpan& buffer)
|
||||||
|
{
|
||||||
|
if (buffer.size() < sizeof(uint32_t))
|
||||||
|
return BAN::Error::from_errno(ENOBUFS);
|
||||||
|
const uint32_t vector_size = buffer.as<const uint32_t>();
|
||||||
|
buffer = buffer.slice(sizeof(uint32_t));
|
||||||
|
|
||||||
|
T vector;
|
||||||
|
TRY(vector.resize(vector_size));
|
||||||
|
for (auto& element : vector)
|
||||||
|
element = TRY(deserialize_impl<typename T::value_type>(buffer));
|
||||||
|
|
||||||
|
return vector;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class PacketType : uint32_t
|
enum class PacketType : uint32_t
|
||||||
|
|
Loading…
Reference in New Issue