/* * Copyright (c) 2018-2020, 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<<(const char*); Encoder& operator<<(const StringView&); Encoder& operator<<(const String&); Encoder& operator<<(const ByteBuffer&); Encoder& operator<<(const URL&); Encoder& operator<<(const Dictionary&); Encoder& operator<<(const File&); template Encoder& operator<<(const HashMap& hashmap) { *this << (u32)hashmap.size(); for (auto it : hashmap) { *this << it.key; *this << it.value; } return *this; } template Encoder& operator<<(const Vector& 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<<(const T& value) { encode(value); return *this; } template Encoder& operator<<(const Optional& optional) { *this << optional.has_value(); if (optional.has_value()) *this << optional.value(); return *this; } template void encode(const T& value) { IPC::encode(*this, value); } private: MessageBuffer& m_buffer; }; }