13 #include <nlohmann/detail/iterators/iteration_proxy.hpp>
14 #include <nlohmann/detail/meta/cpp_future.hpp>
15 #include <nlohmann/detail/meta/type_traits.hpp>
16 #include <nlohmann/detail/value_t.hpp>
31 template<
typename BasicJsonType>
32 static void construct(BasicJsonType& j,
typename BasicJsonType::boolean_t b) noexcept
43 template<
typename BasicJsonType>
44 static void construct(BasicJsonType& j,
const typename BasicJsonType::string_t& s)
51 template<
typename BasicJsonType>
52 static void construct(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
55 j.m_value = std::move(s);
59 template<
typename BasicJsonType,
typename CompatibleStringType,
60 enable_if_t<not std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,
62 static void construct(BasicJsonType& j,
const CompatibleStringType& str)
65 j.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
73 template<
typename BasicJsonType>
74 static void construct(BasicJsonType& j,
typename BasicJsonType::number_float_t val) noexcept
85 template<
typename BasicJsonType>
86 static void construct(BasicJsonType& j,
typename BasicJsonType::number_unsigned_t val) noexcept
97 template<
typename BasicJsonType>
98 static void construct(BasicJsonType& j,
typename BasicJsonType::number_integer_t val) noexcept
102 j.assert_invariant();
109 template<
typename BasicJsonType>
110 static void construct(BasicJsonType& j,
const typename BasicJsonType::array_t& arr)
114 j.assert_invariant();
117 template<
typename BasicJsonType>
118 static void construct(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
121 j.m_value = std::move(arr);
122 j.assert_invariant();
125 template<
typename BasicJsonType,
typename CompatibleArrayType,
126 enable_if_t<not std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
128 static void construct(BasicJsonType& j,
const CompatibleArrayType& arr)
133 j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
134 j.assert_invariant();
137 template<
typename BasicJsonType>
138 static void construct(BasicJsonType& j,
const std::vector<bool>& arr)
142 j.m_value.array->reserve(arr.size());
143 for (
const bool x : arr)
145 j.m_value.array->push_back(x);
147 j.assert_invariant();
150 template<
typename BasicJsonType,
typename T,
151 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
152 static void construct(BasicJsonType& j,
const std::valarray<T>& arr)
156 j.m_value.array->resize(arr.size());
159 std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
161 j.assert_invariant();
168 template<
typename BasicJsonType>
169 static void construct(BasicJsonType& j,
const typename BasicJsonType::object_t& obj)
173 j.assert_invariant();
176 template<
typename BasicJsonType>
177 static void construct(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
180 j.m_value = std::move(obj);
181 j.assert_invariant();
184 template<
typename BasicJsonType,
typename CompatibleObjectType,
185 enable_if_t<not std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value,
int> = 0>
186 static void construct(BasicJsonType& j,
const CompatibleObjectType& obj)
192 j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
193 j.assert_invariant();
201 template<
typename BasicJsonType,
typename T,
202 enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value,
int> = 0>
203 void to_json(BasicJsonType& j, T b) noexcept
208 template<
typename BasicJsonType,
typename CompatibleString,
209 enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value,
int> = 0>
210 void to_json(BasicJsonType& j,
const CompatibleString& s)
212 external_constructor<value_t::string>::construct(j, s);
215 template<
typename BasicJsonType>
216 void to_json(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
218 external_constructor<value_t::string>::construct(j, std::move(s));
221 template<
typename BasicJsonType,
typename FloatType,
222 enable_if_t<std::is_floating_point<FloatType>::value,
int> = 0>
223 void to_json(BasicJsonType& j, FloatType val) noexcept
225 external_constructor<value_t::number_float>::construct(j,
static_cast<typename BasicJsonType::number_float_t
>(val));
228 template<
typename BasicJsonType,
typename CompatibleNumberUnsignedType,
229 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value,
int> = 0>
230 void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept
232 external_constructor<value_t::number_unsigned>::construct(j,
static_cast<typename BasicJsonType::number_unsigned_t
>(val));
235 template<
typename BasicJsonType,
typename CompatibleNumberIntegerType,
236 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value,
int> = 0>
237 void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept
239 external_constructor<value_t::number_integer>::construct(j,
static_cast<typename BasicJsonType::number_integer_t
>(val));
242 template<
typename BasicJsonType,
typename EnumType,
243 enable_if_t<std::is_enum<EnumType>::value,
int> = 0>
244 void to_json(BasicJsonType& j, EnumType e) noexcept
246 using underlying_type =
typename std::underlying_type<EnumType>::type;
247 external_constructor<value_t::number_integer>::construct(j,
static_cast<underlying_type
>(e));
250 template<
typename BasicJsonType>
251 void to_json(BasicJsonType& j,
const std::vector<bool>& e)
253 external_constructor<value_t::array>::construct(j, e);
256 template <
typename BasicJsonType,
typename CompatibleArrayType,
257 enable_if_t<is_compatible_array_type<BasicJsonType,
258 CompatibleArrayType>::value and
259 not is_compatible_object_type<
260 BasicJsonType, CompatibleArrayType>::value and
261 not is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value and
262 not is_basic_json<CompatibleArrayType>::value,
264 void to_json(BasicJsonType& j,
const CompatibleArrayType& arr)
266 external_constructor<value_t::array>::construct(j, arr);
269 template<
typename BasicJsonType,
typename T,
270 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
271 void to_json(BasicJsonType& j,
const std::valarray<T>& arr)
273 external_constructor<value_t::array>::construct(j, std::move(arr));
276 template<
typename BasicJsonType>
277 void to_json(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
279 external_constructor<value_t::array>::construct(j, std::move(arr));
282 template<
typename BasicJsonType,
typename CompatibleObjectType,
283 enable_if_t<is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value and not is_basic_json<CompatibleObjectType>::value,
int> = 0>
284 void to_json(BasicJsonType& j,
const CompatibleObjectType& obj)
286 external_constructor<value_t::object>::construct(j, obj);
289 template<
typename BasicJsonType>
290 void to_json(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
292 external_constructor<value_t::object>::construct(j, std::move(obj));
296 typename BasicJsonType,
typename T, std::size_t N,
297 enable_if_t<not std::is_constructible<
typename BasicJsonType::string_t,
298 const T(&)[N]>::value,
300 void to_json(BasicJsonType& j,
const T(&arr)[N])
302 external_constructor<value_t::array>::construct(j, arr);
305 template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value,
int > = 0 >
306 void to_json(BasicJsonType& j,
const std::pair<T1, T2>& p)
308 j = { p.first, p.second };
312 template <
typename BasicJsonType,
typename T,
313 enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value,
int> = 0>
314 void to_json(BasicJsonType& j,
const T& b)
316 j = { {b.key(), b.value()} };
319 template<
typename BasicJsonType,
typename Tuple, std::size_t... Idx>
320 void to_json_tuple_impl(BasicJsonType& j,
const Tuple& t, index_sequence<Idx...> )
322 j = { std::get<Idx>(t)... };
325 template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value,
int > = 0>
326 void to_json(BasicJsonType& j,
const T& t)
328 to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});
333 template<
typename BasicJsonType,
typename T>
334 auto operator()(BasicJsonType& j, T&& val)
const noexcept(noexcept(to_json(j, std::forward<T>(val))))
335 -> decltype(to_json(j, std::forward<T>(val)),
void())
337 return to_json(j, std::forward<T>(val));
value_t
the JSON type enumeration
Definition: value_t.hpp:42
@ number_integer
number value (signed integer)
@ object
object (unordered set of name/value pairs)
@ number_float
number value (floating-point)
@ number_unsigned
number value (unsigned integer)
@ array
array (ordered collection of values)
namespace for Niels Lohmann
Definition: adl_serializer.hpp:9
Definition: to_json.hpp:26
Definition: cpp_future.hpp:56
Definition: to_json.hpp:332