| 144 | |
| 145 | template <typename T> |
| 146 | T deserialize(Reader& is) { |
| 147 | if constexpr (std::is_arithmetic_v<T>) { |
| 148 | T v; |
| 149 | is.read(reinterpret_cast<char*>(&v), sizeof(T)); |
| 150 | if (is_big_endian()) { |
| 151 | reverse_bytes(v); |
| 152 | } |
| 153 | return v; |
| 154 | } else if constexpr (std::is_enum_v<T>) { |
| 155 | return static_cast<T>(deserialize<int>(is)); |
| 156 | } else if constexpr (std::is_same_v<T, std::nullptr_t>) { |
| 157 | return nullptr; |
| 158 | } else if constexpr (is_iterable<T>) { |
| 159 | T v; |
| 160 | auto size = deserialize<uint64_t>(is); |
| 161 | v.reserve(size); |
| 162 | for (int i = 0; i < size; ++i) { |
| 163 | v.push_back(deserialize<typename T::value_type>(is)); |
| 164 | } |
| 165 | return v; |
| 166 | } else if constexpr (is_pair<T> || is_tuple<T>) { |
| 167 | return deserialize_tuple<T>( |
| 168 | is, std::make_index_sequence<std::tuple_size_v<std::decay_t<T>>>{}); |
| 169 | } else if constexpr (is_optional<T>) { |
| 170 | auto has_value = deserialize<bool>(is); |
| 171 | if (has_value) { |
| 172 | return T{deserialize<typename T::value_type>(is)}; |
| 173 | } else { |
| 174 | return std::nullopt; |
| 175 | } |
| 176 | } else if constexpr (is_variant<T>) { |
| 177 | return deserialize_variant<T>(is); |
| 178 | } else { |
| 179 | NotDeserializable<T>(); |
| 180 | } |
| 181 | } |
| 182 | |
| 183 | enum class VariantType { Int = 0, Float = 1, Bool = 2 }; |
| 184 |
nothing calls this directly
no test coverage detected