11 #include <nlohmann/detail/meta.hpp>
12 #include <nlohmann/detail/value_t.hpp>
27 template<
typename BasicJsonType>
28 static void construct(BasicJsonType& j,
typename BasicJsonType::boolean_t b) noexcept
39 template<
typename BasicJsonType>
40 static void construct(BasicJsonType& j,
const typename BasicJsonType::string_t& s)
47 template<
typename BasicJsonType>
48 static void construct(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
51 j.m_value = std::move(s);
59 template<
typename BasicJsonType>
60 static void construct(BasicJsonType& j,
typename BasicJsonType::number_float_t val) noexcept
71 template<
typename BasicJsonType>
72 static void construct(BasicJsonType& j,
typename BasicJsonType::number_unsigned_t val) noexcept
83 template<
typename BasicJsonType>
84 static void construct(BasicJsonType& j,
typename BasicJsonType::number_integer_t val) noexcept
95 template<
typename BasicJsonType>
96 static void construct(BasicJsonType& j,
const typename BasicJsonType::array_t& arr)
100 j.assert_invariant();
103 template<
typename BasicJsonType>
104 static void construct(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
107 j.m_value = std::move(arr);
108 j.assert_invariant();
111 template<
typename BasicJsonType,
typename CompatibleArrayType,
112 enable_if_t<not std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
114 static void construct(BasicJsonType& j,
const CompatibleArrayType& arr)
119 j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
120 j.assert_invariant();
123 template<
typename BasicJsonType>
124 static void construct(BasicJsonType& j,
const std::vector<bool>& arr)
128 j.m_value.array->reserve(arr.size());
129 for (
const bool x : arr)
131 j.m_value.array->push_back(x);
133 j.assert_invariant();
136 template<
typename BasicJsonType,
typename T,
137 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
138 static void construct(BasicJsonType& j,
const std::valarray<T>& arr)
142 j.m_value.array->resize(arr.size());
143 std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
144 j.assert_invariant();
151 template<
typename BasicJsonType>
152 static void construct(BasicJsonType& j,
const typename BasicJsonType::object_t& obj)
156 j.assert_invariant();
159 template<
typename BasicJsonType>
160 static void construct(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
163 j.m_value = std::move(obj);
164 j.assert_invariant();
167 template<
typename BasicJsonType,
typename CompatibleObjectType,
168 enable_if_t<not std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value,
int> = 0>
169 static void construct(BasicJsonType& j,
const CompatibleObjectType& obj)
175 j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
176 j.assert_invariant();
184 template<
typename BasicJsonType,
typename T,
185 enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value,
int> = 0>
186 void to_json(BasicJsonType& j, T b) noexcept
191 template<
typename BasicJsonType,
typename CompatibleString,
192 enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value,
int> = 0>
193 void to_json(BasicJsonType& j,
const CompatibleString& s)
195 external_constructor<value_t::string>::construct(j, s);
198 template<
typename BasicJsonType>
199 void to_json(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
201 external_constructor<value_t::string>::construct(j, std::move(s));
204 template<
typename BasicJsonType,
typename FloatType,
205 enable_if_t<std::is_floating_point<FloatType>::value,
int> = 0>
206 void to_json(BasicJsonType& j, FloatType val) noexcept
208 external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));
211 template<
typename BasicJsonType,
typename CompatibleNumberUnsignedType,
212 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value,
int> = 0>
213 void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept
215 external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));
218 template<
typename BasicJsonType,
typename CompatibleNumberIntegerType,
219 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value,
int> = 0>
220 void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept
222 external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));
225 template<
typename BasicJsonType,
typename EnumType,
226 enable_if_t<std::is_enum<EnumType>::value,
int> = 0>
227 void to_json(BasicJsonType& j, EnumType e) noexcept
229 using underlying_type =
typename std::underlying_type<EnumType>::type;
230 external_constructor<value_t::number_integer>::construct(j, static_cast<underlying_type>(e));
233 template<
typename BasicJsonType>
234 void to_json(BasicJsonType& j,
const std::vector<bool>& e)
236 external_constructor<value_t::array>::construct(j, e);
239 template<
typename BasicJsonType,
typename CompatibleArrayType,
240 enable_if_t<is_compatible_array_type<BasicJsonType, CompatibleArrayType>::value or
241 std::is_same<typename BasicJsonType::array_t, CompatibleArrayType>::value,
243 void to_json(BasicJsonType& j,
const CompatibleArrayType& arr)
245 external_constructor<value_t::array>::construct(j, arr);
248 template<
typename BasicJsonType,
typename T,
249 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
250 void to_json(BasicJsonType& j, std::valarray<T> arr)
252 external_constructor<value_t::array>::construct(j, std::move(arr));
255 template<
typename BasicJsonType>
256 void to_json(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
258 external_constructor<value_t::array>::construct(j, std::move(arr));
261 template<
typename BasicJsonType,
typename CompatibleObjectType,
262 enable_if_t<is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value,
int> = 0>
263 void to_json(BasicJsonType& j,
const CompatibleObjectType& obj)
265 external_constructor<value_t::object>::construct(j, obj);
268 template<
typename BasicJsonType>
269 void to_json(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
271 external_constructor<value_t::object>::construct(j, std::move(obj));
274 template<
typename BasicJsonType,
typename T, std::size_t N,
275 enable_if_t<not std::is_constructible<
typename BasicJsonType::string_t, T (&)[N]>::value,
int> = 0>
276 void to_json(BasicJsonType& j, T (&arr)[N])
278 external_constructor<value_t::array>::construct(j, arr);
281 template<
typename BasicJsonType,
typename... Args>
282 void to_json(BasicJsonType& j,
const std::pair<Args...>& p)
284 j = {p.first, p.second};
287 template<
typename BasicJsonType,
typename Tuple, std::size_t... Idx>
288 void to_json_tuple_impl(BasicJsonType& j,
const Tuple& t, index_sequence<Idx...>)
290 j = {std::get<Idx>(t)...};
293 template<
typename BasicJsonType,
typename... Args>
294 void to_json(BasicJsonType& j,
const std::tuple<Args...>& t)
296 to_json_tuple_impl(j, t, index_sequence_for<Args...> {});
302 template<
typename BasicJsonType,
typename T>
303 auto call(BasicJsonType& j, T&& val,
priority_tag<1> )
const noexcept(noexcept(to_json(j, std::forward<T>(val))))
304 -> decltype(to_json(j, std::forward<T>(val)),
void())
306 return to_json(j, std::forward<T>(val));
309 template<
typename BasicJsonType,
typename T>
312 static_assert(
sizeof(BasicJsonType) == 0,
313 "could not find to_json() method in T's namespace");
317 using decayed = uncvref_t<T>;
318 static_assert(
sizeof(
typename decayed::force_msvc_stacktrace) == 0,
319 "forcing MSVC stacktrace to show which T we're talking about.");
324 template<
typename BasicJsonType,
typename T>
325 void operator()(BasicJsonType& j, T&& val)
const
326 noexcept(noexcept(std::declval<to_json_fn>().call(j, std::forward<T>(val),
priority_tag<1> {})))