12 #include <nlohmann/detail/iterators/iteration_proxy.hpp>
13 #include <nlohmann/detail/meta/cpp_future.hpp>
14 #include <nlohmann/detail/meta/type_traits.hpp>
15 #include <nlohmann/detail/value_t.hpp>
30 template<
typename BasicJsonType>
31 static void construct(BasicJsonType& j,
typename BasicJsonType::boolean_t b) noexcept
42 template<
typename BasicJsonType>
43 static void construct(BasicJsonType& j,
const typename BasicJsonType::string_t& s)
50 template<
typename BasicJsonType>
51 static void construct(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
54 j.m_value = std::move(s);
58 template <
typename BasicJsonType,
typename CompatibleStringType,
59 enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,
61 static void construct(BasicJsonType& j,
const CompatibleStringType& str)
64 j.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
72 template<
typename BasicJsonType>
73 static void construct(BasicJsonType& j,
const typename BasicJsonType::binary_t& b)
76 typename BasicJsonType::binary_t
value{b};
81 template<
typename BasicJsonType>
82 static void construct(BasicJsonType& j,
typename BasicJsonType::binary_t&& b)
85 typename BasicJsonType::binary_t
value{std::move(b)};
94 template<
typename BasicJsonType>
95 static void construct(BasicJsonType& j,
typename BasicJsonType::number_float_t val) noexcept
106 template<
typename BasicJsonType>
107 static void construct(BasicJsonType& j,
typename BasicJsonType::number_unsigned_t val) noexcept
111 j.assert_invariant();
118 template<
typename BasicJsonType>
119 static void construct(BasicJsonType& j,
typename BasicJsonType::number_integer_t val) noexcept
123 j.assert_invariant();
130 template<
typename BasicJsonType>
131 static void construct(BasicJsonType& j,
const typename BasicJsonType::array_t& arr)
135 j.assert_invariant();
138 template<
typename BasicJsonType>
139 static void construct(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
142 j.m_value = std::move(arr);
143 j.assert_invariant();
146 template <
typename BasicJsonType,
typename CompatibleArrayType,
147 enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
149 static void construct(BasicJsonType& j,
const CompatibleArrayType& arr)
154 j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
155 j.assert_invariant();
158 template<
typename BasicJsonType>
159 static void construct(BasicJsonType& j,
const std::vector<bool>& arr)
163 j.m_value.array->reserve(arr.size());
164 for (
const bool x : arr)
166 j.m_value.array->push_back(x);
168 j.assert_invariant();
171 template<
typename BasicJsonType,
typename T,
172 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
173 static void construct(BasicJsonType& j,
const std::valarray<T>& arr)
177 j.m_value.array->resize(arr.size());
180 std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
182 j.assert_invariant();
189 template<
typename BasicJsonType>
190 static void construct(BasicJsonType& j,
const typename BasicJsonType::object_t& obj)
194 j.assert_invariant();
197 template<
typename BasicJsonType>
198 static void construct(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
201 j.m_value = std::move(obj);
202 j.assert_invariant();
205 template <
typename BasicJsonType,
typename CompatibleObjectType,
206 enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value,
int > = 0 >
207 static void construct(BasicJsonType& j,
const CompatibleObjectType& obj)
213 j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
214 j.assert_invariant();
222 template<
typename BasicJsonType,
typename T,
223 enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value,
int> = 0>
224 void to_json(BasicJsonType& j, T b) noexcept
229 template<
typename BasicJsonType,
typename CompatibleString,
230 enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value,
int> = 0>
231 void to_json(BasicJsonType& j,
const CompatibleString& s)
233 external_constructor<value_t::string>::construct(j, s);
236 template<
typename BasicJsonType>
237 void to_json(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
239 external_constructor<value_t::string>::construct(j, std::move(s));
242 template<
typename BasicJsonType,
typename FloatType,
243 enable_if_t<std::is_floating_point<FloatType>::value,
int> = 0>
244 void to_json(BasicJsonType& j, FloatType val) noexcept
246 external_constructor<value_t::number_float>::construct(j,
static_cast<typename BasicJsonType::number_float_t
>(val));
249 template<
typename BasicJsonType,
typename CompatibleNumberUnsignedType,
250 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value,
int> = 0>
251 void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept
253 external_constructor<value_t::number_unsigned>::construct(j,
static_cast<typename BasicJsonType::number_unsigned_t
>(val));
256 template<
typename BasicJsonType,
typename CompatibleNumberIntegerType,
257 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value,
int> = 0>
258 void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept
260 external_constructor<value_t::number_integer>::construct(j,
static_cast<typename BasicJsonType::number_integer_t
>(val));
263 template<
typename BasicJsonType,
typename EnumType,
264 enable_if_t<std::is_enum<EnumType>::value,
int> = 0>
265 void to_json(BasicJsonType& j, EnumType e) noexcept
267 using underlying_type =
typename std::underlying_type<EnumType>::type;
268 external_constructor<value_t::number_integer>::construct(j,
static_cast<underlying_type
>(e));
271 template<
typename BasicJsonType>
272 void to_json(BasicJsonType& j,
const std::vector<bool>& e)
274 external_constructor<value_t::array>::construct(j, e);
277 template <
typename BasicJsonType,
typename CompatibleArrayType,
278 enable_if_t < is_compatible_array_type<BasicJsonType,
279 CompatibleArrayType>::value&&
280 !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value&&
281 !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&&
282 !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&&
283 !is_basic_json<CompatibleArrayType>::value,
285 void to_json(BasicJsonType& j,
const CompatibleArrayType& arr)
287 external_constructor<value_t::array>::construct(j, arr);
290 template<
typename BasicJsonType>
291 void to_json(BasicJsonType& j,
const typename BasicJsonType::binary_t& bin)
293 external_constructor<value_t::binary>::construct(j, bin);
296 template<
typename BasicJsonType,
typename T,
297 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
298 void to_json(BasicJsonType& j,
const std::valarray<T>& arr)
300 external_constructor<value_t::array>::construct(j, std::move(arr));
303 template<
typename BasicJsonType>
304 void to_json(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
306 external_constructor<value_t::array>::construct(j, std::move(arr));
309 template <
typename BasicJsonType,
typename CompatibleObjectType,
310 enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value&& !is_basic_json<CompatibleObjectType>::value,
int > = 0 >
311 void to_json(BasicJsonType& j,
const CompatibleObjectType& obj)
313 external_constructor<value_t::object>::construct(j, obj);
316 template<
typename BasicJsonType>
317 void to_json(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
319 external_constructor<value_t::object>::construct(j, std::move(obj));
323 typename BasicJsonType,
typename T, std::size_t N,
324 enable_if_t < !std::is_constructible<
typename BasicJsonType::string_t,
325 const T(&)[N]>::value,
327 void to_json(BasicJsonType& j,
const T(&arr)[N])
329 external_constructor<value_t::array>::construct(j, arr);
332 template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value,
int > = 0 >
333 void to_json(BasicJsonType& j,
const std::pair<T1, T2>& p)
335 j = { p.first, p.second };
339 template<
typename BasicJsonType,
typename T,
340 enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value,
int> = 0>
341 void to_json(BasicJsonType& j,
const T& b)
343 j = { {b.key(), b.value()} };
346 template<
typename BasicJsonType,
typename Tuple, std::size_t... Idx>
347 void to_json_tuple_impl(BasicJsonType& j,
const Tuple& t, index_sequence<Idx...> )
349 j = { std::get<Idx>(t)... };
352 template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value,
int > = 0>
353 void to_json(BasicJsonType& j,
const T& t)
355 to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});
360 template<
typename BasicJsonType,
typename T>
361 auto operator()(BasicJsonType& j, T&& val)
const noexcept(noexcept(to_json(j, std::forward<T>(val))))
362 -> decltype(to_json(j, std::forward<T>(val)),
void())
364 return to_json(j, std::forward<T>(val));
value_t
the JSON type enumeration
Definition: value_t.hpp:41
@ number_integer
number value (signed integer)
@ binary
binary array (ordered collection of bytes)
@ 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)
@ value
the parser finished reading a JSON value
namespace for Niels Lohmann
Definition: adl_serializer.hpp:9
Definition: to_json.hpp:25
Definition: cpp_future.hpp:55
Definition: to_json.hpp:359