/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef MOZILLA_PARAMTRAITS_STL_H #define MOZILLA_PARAMTRAITS_STL_H #include "ipc/IPCMessageUtils.h" #include "mozilla/ipc/IPDLParamTraits.h" #include namespace IPC { template struct ParamTraits> final { using T = std::array; static void Write(MessageWriter* const writer, const T& in) { for (const auto& v : in) { WriteParam(writer, v); } } static bool Read(MessageReader* const reader, T* const out) { for (auto& v : *out) { if (!ReadParam(reader, &v)) return false; } return true; } }; // - template struct ParamTraits final { using T = U[N]; static constexpr size_t kByteSize = sizeof(U) * N; static_assert(std::is_trivial::value); static void Write(MessageWriter* const writer, const T& in) { writer->WriteBytes(in, kByteSize); } static bool Read(MessageReader* const reader, T* const out) { if (!reader->HasBytesAvailable(kByteSize)) { return false; } return reader->ReadBytesInto(*out, kByteSize); } }; // - template struct ParamTraits> final { using T = std::optional; static void Write(MessageWriter* const writer, const T& in) { WriteParam(writer, bool{in}); if (in) { WriteParam(writer, *in); } } static bool Read(MessageReader* const reader, T* const out) { bool isSome; if (!ReadParam(reader, &isSome)) return false; if (!isSome) { out->reset(); return true; } out->emplace(); return ReadParam(reader, &**out); } }; // - template struct ParamTraits> final { using T = std::pair; static void Write(MessageWriter* const writer, const T& in) { WriteParam(writer, in.first); WriteParam(writer, in.second); } static bool Read(MessageReader* const reader, T* const out) { bool ok = true; ok = ok && ReadParam(reader, &out->first); ok = ok && ReadParam(reader, &out->second); return ok; } }; // - template struct ParamTraits> final { using T = std::unordered_map; static void Write(MessageWriter* const writer, const T& in) { const auto size = uint64_t{in.size()}; WriteParam(writer, size); for (const auto& pair : in) { WriteParam(writer, pair); } } static bool Read(MessageReader* const reader, T* const out) { out->clear(); auto size = uint64_t{}; if (!ReadParam(reader, &size)) return false; out->reserve(static_cast(size)); for (const auto i : mozilla::IntegerRange(size)) { (void)i; auto pair = std::pair{}; if (!ReadParam(reader, &pair)) return false; out->insert(pair); } return true; } }; // - // template // struct ParamTraits> final { // using T = std::tuple; // // static void Write(MessageWriter* const writer, const T& in) { // mozilla::MapTuple(aArg, [&](const auto& field) { // WriteParam(writer, field); // return true; // ignored // }); // } // // static bool Read(MessageReader* const reader, T* const out) { // bool ok = true; // mozilla::MapTuple(*aArg, [&](auto& field) { // ok = ok && ReadParam(reader, &field); // return true; // ignored // }); // return ok; // } // }; } // namespace IPC #endif