ParamTraits_STL.h (3691B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef MOZILLA_PARAMTRAITS_STL_H 7 #define MOZILLA_PARAMTRAITS_STL_H 8 9 #include "ipc/IPCMessageUtils.h" 10 11 namespace IPC { 12 13 template <typename U, size_t N> 14 struct ParamTraits<std::array<U, N>> final { 15 using T = std::array<U, N>; 16 17 static void Write(MessageWriter* const writer, const T& in) { 18 for (const auto& v : in) { 19 WriteParam(writer, v); 20 } 21 } 22 23 static bool Read(MessageReader* const reader, T* const out) { 24 for (auto& v : *out) { 25 if (!ReadParam(reader, &v)) return false; 26 } 27 return true; 28 } 29 }; 30 31 // - 32 33 template <typename U, size_t N> 34 struct ParamTraits<U[N]> final { 35 using T = U[N]; 36 static constexpr size_t kByteSize = sizeof(U) * N; 37 38 static_assert(std::is_trivial<U>::value); 39 40 static void Write(MessageWriter* const writer, const T& in) { 41 writer->WriteBytes(in, kByteSize); 42 } 43 44 static bool Read(MessageReader* const reader, T* const out) { 45 if (!reader->HasBytesAvailable(kByteSize)) { 46 return false; 47 } 48 return reader->ReadBytesInto(*out, kByteSize); 49 } 50 }; 51 52 // - 53 54 template <class U> 55 struct ParamTraits<std::optional<U>> final { 56 using T = std::optional<U>; 57 58 static void Write(MessageWriter* const writer, const T& in) { 59 WriteParam(writer, bool{in}); 60 if (in) { 61 WriteParam(writer, *in); 62 } 63 } 64 65 static bool Read(MessageReader* const reader, T* const out) { 66 bool isSome; 67 if (!ReadParam(reader, &isSome)) return false; 68 69 if (!isSome) { 70 out->reset(); 71 return true; 72 } 73 out->emplace(); 74 return ReadParam(reader, &**out); 75 } 76 }; 77 78 // - 79 80 template <class A, class B> 81 struct ParamTraits<std::pair<A, B>> final { 82 using T = std::pair<A, B>; 83 84 static void Write(MessageWriter* const writer, const T& in) { 85 WriteParam(writer, in.first); 86 WriteParam(writer, in.second); 87 } 88 89 static bool Read(MessageReader* const reader, T* const out) { 90 bool ok = true; 91 ok = ok && ReadParam(reader, &out->first); 92 ok = ok && ReadParam(reader, &out->second); 93 return ok; 94 } 95 }; 96 97 // - 98 99 template <class K, class V, class H, class E> 100 struct ParamTraits<std::unordered_map<K, V, H, E>> final { 101 using T = std::unordered_map<K, V, H, E>; 102 103 static void Write(MessageWriter* const writer, const T& in) { 104 const auto size = uint64_t{in.size()}; 105 WriteParam(writer, size); 106 for (const auto& pair : in) { 107 WriteParam(writer, pair); 108 } 109 } 110 111 static bool Read(MessageReader* const reader, T* const out) { 112 out->clear(); 113 114 auto size = uint64_t{}; 115 if (!ReadParam(reader, &size)) return false; 116 117 out->reserve(static_cast<size_t>(size)); 118 for (const auto i : mozilla::IntegerRange(size)) { 119 (void)i; 120 auto pair = std::pair<K, V>{}; 121 if (!ReadParam(reader, &pair)) return false; 122 out->insert(pair); 123 } 124 return true; 125 } 126 }; 127 128 // - 129 130 // template <class... T> 131 // struct ParamTraits<std::tuple<T...>> final { 132 // using T = std::tuple<T...>; 133 // 134 // static void Write(MessageWriter* const writer, const T& in) { 135 // mozilla::MapTuple(aArg, [&](const auto& field) { 136 // WriteParam(writer, field); 137 // return true; // ignored 138 // }); 139 // } 140 // 141 // static bool Read(MessageReader* const reader, T* const out) { 142 // bool ok = true; 143 // mozilla::MapTuple(*aArg, [&](auto& field) { 144 // ok = ok && ReadParam(reader, &field); 145 // return true; // ignored 146 // }); 147 // return ok; 148 // } 149 // }; 150 151 } // namespace IPC 152 153 #endif