/* * Copyright (c) 2018-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace IPC { template bool encode(Encoder&, T&) { static_assert(DependentFalse, "Base IPC::encode() was instantiated"); VERIFY_NOT_REACHED(); } class Encoder { public: explicit Encoder(MessageBuffer& buffer) : m_buffer(buffer) { } Encoder& operator<<(bool); Encoder& operator<<(u8); Encoder& operator<<(u16); Encoder& operator<<(u32); Encoder& operator<<(u64); Encoder& operator<<(i8); Encoder& operator<<(i16); Encoder& operator<<(i32); Encoder& operator<<(i64); Encoder& operator<<(float); Encoder& operator<<(double); Encoder& operator<<(char const*); Encoder& operator<<(StringView); Encoder& operator<<(String const&); Encoder& operator<<(ByteBuffer const&); Encoder& operator<<(URL const&); Encoder& operator<<(Dictionary const&); Encoder& operator<<(File const&); template Encoder& operator<<(HashMap const& hashmap) { *this << (u32)hashmap.size(); for (auto it : hashmap) { *this << it.key; *this << it.value; } return *this; } template Encoder& operator<<(Vector const& vector) { *this << (u64)vector.size(); for (auto& value : vector) *this << value; return *this; } template Encoder& operator<<(T const& enum_value) { *this << AK::to_underlying(enum_value); return *this; } template Encoder& operator<<(T const& value) { encode(value); return *this; } template Encoder& operator<<(Optional const& optional) { *this << optional.has_value(); if (optional.has_value()) *this << optional.value(); return *this; } template void encode(T const& value) { IPC::encode(*this, value); } private: MessageBuffer& m_buffer; }; }