diff --git a/Userland/Libraries/LibIPC/Decoder.h b/Userland/Libraries/LibIPC/Decoder.h index 8f41894b75..57d4014c73 100644 --- a/Userland/Libraries/LibIPC/Decoder.h +++ b/Userland/Libraries/LibIPC/Decoder.h @@ -67,6 +67,24 @@ public: return {}; } + template + ErrorOr decode(OrderedHashMap& hashmap) + { + u32 size; + TRY(decode(size)); + if (size > NumericLimits::max()) + return Error::from_string_literal("IPC: Invalid HashMap size"sv); + + for (size_t i = 0; i < size; ++i) { + K key; + TRY(decode(key)); + V value; + TRY(decode(value)); + TRY(hashmap.try_set(move(key), move(value))); + } + return {}; + } + template ErrorOr decode(T& enum_value) { diff --git a/Userland/Libraries/LibIPC/Encoder.h b/Userland/Libraries/LibIPC/Encoder.h index 8d442d7ba4..b207e73ccd 100644 --- a/Userland/Libraries/LibIPC/Encoder.h +++ b/Userland/Libraries/LibIPC/Encoder.h @@ -57,6 +57,17 @@ public: return *this; } + template + Encoder& operator<<(OrderedHashMap const& hashmap) + { + *this << (u32)hashmap.size(); + for (auto it : hashmap) { + *this << it.key; + *this << it.value; + } + return *this; + } + template Encoder& operator<<(Vector const& vector) {