16 #include <daw/daw_algorithm.h>
17 #include <daw/daw_arith_traits.h>
18 #include <daw/daw_bounded_vector.h>
19 #include <daw/daw_move.h>
20 #include <daw/daw_traits.h>
21 #include <utf8/unchecked.h>
28 #ifndef DAW_JSON_CUSTOM_D2S
29 #include <third_party/dragonbox/dragonbox.h>
30 #elif __has_include( "custom_d2s.h" )
31 #include "custom_d2s.h"
33 #error Request for local d2s, but no custom_d2s.h supplied with char * d2s( Real const & value, char * ); declaration/definition in namespace daw::json
36 #include <type_traits>
40 template<
typename Real,
typename OutputIterator>
42 OutputIterator out_it ) {
44 #ifndef DAW_JSON_CUSTOM_D2S
45 if constexpr( std::is_same_v<Real, float> ) {
46 return jkj::dragonbox::to_chars_n( value, out_it );
48 return jkj::dragonbox::to_chars_n(
static_cast<double>( value ), out_it );
51 if constexpr( std::is_same_v<Real, float> ) {
52 return DAW_JSON_NS::d2s( value, out_it );
54 return DAW_JSON_NS::d2s(
static_cast<double>( value ), out_it );
74 using has_to_string = daw::is_detected<to_string_test::to_string_result, T>;
80 [[nodiscard, maybe_unused]]
auto to_string( std::optional<T>
const &v )
93 std::enable_if_t<json_details::to_strings::has_to_string_v<U>,
94 std::nullptr_t> =
nullptr>
95 [[nodiscard]]
inline constexpr decltype(
auto )
96 operator( )( U &&value )
const {
102 std::enable_if_t<not json_details::to_strings::has_to_string_v<U>,
103 std::nullptr_t> =
nullptr>
104 [[nodiscard]]
inline std::string operator( )( U &&value )
const {
105 std::stringstream ss;
106 ss << DAW_FWD( value );
113 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
114 [[nodiscard]]
inline OutputIterator constexpr
to_string(
116 parse_to_t
const &value );
118 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
119 [[nodiscard]] constexpr OutputIterator
121 parse_to_t
const &value );
123 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
124 [[nodiscard]] constexpr OutputIterator
126 parse_to_t
const &value );
128 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
129 [[nodiscard]] constexpr OutputIterator
131 parse_to_t
const &value );
133 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
134 [[nodiscard]] constexpr OutputIterator
136 parse_to_t
const &value );
138 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
139 [[nodiscard]] constexpr OutputIterator
141 parse_to_t
const &value );
143 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
144 [[nodiscard]] constexpr OutputIterator
146 parse_to_t
const &value );
148 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
151 parse_to_t
const &value );
153 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
154 [[nodiscard]] constexpr OutputIterator
156 parse_to_t
const &value );
158 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
159 [[nodiscard]] constexpr OutputIterator
161 parse_to_t
const &value );
163 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
164 [[nodiscard]] constexpr OutputIterator
166 parse_to_t
const &value );
168 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
169 [[nodiscard]] constexpr OutputIterator
171 parse_to_t
const &value );
173 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
174 [[nodiscard]] constexpr OutputIterator
176 parse_to_t
const &value );
178 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
179 [[nodiscard]] constexpr OutputIterator
181 parse_to_t
const &value );
184 template<
typename Char>
186 auto const u =
static_cast<unsigned>(
static_cast<unsigned char>( c ) );
189 return static_cast<char>( u +
static_cast<unsigned char>(
'0' ) );
191 return static_cast<char>( ( u - 10U ) +
192 static_cast<unsigned char>(
'A' ) );
196 template<
typename OutputIterator>
197 constexpr OutputIterator
output_hex( std::uint16_t c, OutputIterator it ) {
198 char const nibbles[] = {
'\\',
214 template<
typename OutputIterator>
217 *it++ =
static_cast<char>( cp );
221 *it++ =
static_cast<char>( ( cp >> 6U ) | 0b11000000U );
222 *it++ =
static_cast<char>( ( cp & 0b00111111U ) | 0b10000000U );
225 if( cp <= 0xFFFFU ) {
226 *it++ =
static_cast<char>( ( cp >> 12U ) | 0b11100000U );
227 *it++ =
static_cast<char>( ( ( cp >> 6U ) & 0b00111111U ) | 0b10000000U );
228 *it++ =
static_cast<char>( ( cp & 0b00111111U ) | 0b10000000U );
231 if( cp <= 0x10FFFFU ) {
232 *it++ =
static_cast<char>( ( cp >> 18U ) | 0b11110000U );
234 static_cast<char>( ( ( cp >> 12U ) & 0b00111111U ) | 0b10000000U );
235 *it++ =
static_cast<char>( ( ( cp >> 6U ) & 0b00111111U ) | 0b10000000U );
236 *it++ =
static_cast<char>( ( cp & 0b00111111U ) | 0b10000000U );
244 template<
bool do_escape =
false,
246 typename OutputIterator,
typename Container,
247 daw::enable_when_t<traits::is_container_like_v<
248 daw::remove_cvref_t<Container>>> =
nullptr>
249 [[nodiscard]] constexpr OutputIterator
251 if constexpr( do_escape ) {
252 using iter = daw::remove_cvref_t<decltype( std::begin( container ) )>;
253 using it_t = utf8::unchecked::iterator<iter>;
254 auto first = it_t( std::begin( container ) );
255 auto const last = it_t( std::end( container ) );
256 while( first != last ) {
257 auto const cp = *first++;
294 if( cp >= 0x7FU and cp <= 0xFFFFU ) {
301 static_cast<std::uint16_t
>( 0xD7C0U + ( cp >> 10U ) ), it );
303 static_cast<std::uint16_t
>( 0xDC00U + ( cp & 0x3FFU ) ), it );
312 for(
auto c : container ) {
315 static_cast<unsigned char>( c ) <= 0x7FU ),
316 ErrorReason::InvalidStringHighASCII );
324 template<
bool do_escape =
false,
326 typename OutputIterator>
329 if( ptr ==
nullptr ) {
332 if constexpr( do_escape ) {
334 auto chr_it = utf8::unchecked::iterator<char const *>( ptr );
335 while( *chr_it.base( ) !=
'\0' ) {
336 auto const cp = *chr_it++;
373 if( cp >= 0x7FU and cp <= 0xFFFFU ) {
380 static_cast<std::uint16_t
>( 0xD7C0U + ( cp >> 10U ) ), it );
382 static_cast<std::uint16_t
>( 0xDC00U + ( cp & 0x3FFU ) ), it );
391 while( *ptr !=
'\0' ) {
394 static_cast<unsigned>( *ptr ) <= 0x7FU ),
395 ErrorReason::InvalidStringHighASCII );
403 template<
bool do_escape =
false,
405 typename OutputIterator,
typename Range>
406 [[nodiscard]] constexpr OutputIterator
409 return copy_to_iterator<do_escape, EightBitMode>( it,
"null" );
411 return copy_to_iterator<do_escape, EightBitMode>( it,
418 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
419 [[nodiscard]] constexpr OutputIterator
421 parse_to_t
const &value ) {
439 template<std::size_t idx,
typename JsonMembers,
typename OutputIterator,
442 parse_to_t
const &value ) {
443 if constexpr( idx < std::variant_size_v<parse_to_t> ) {
444 if( value.index( ) != idx ) {
445 to_variant_string<idx + 1, JsonMembers>( it, value );
448 using element_t =
typename JsonMembers::json_elements;
450 typename std::tuple_element<idx,
451 typename element_t::element_map_t>::type;
453 it, std::get<idx>( value ) );
457 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
458 [[nodiscard]]
inline constexpr OutputIterator
460 parse_to_t
const &value ) {
462 to_variant_string<0, JsonMember>( it, value );
466 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
467 [[nodiscard]]
inline constexpr OutputIterator
469 parse_to_t
const &value ) {
471 to_variant_string<0, JsonMember>( it, value );
477 -> decltype( *value );
483 daw::remove_cvref_t<decltype( deref_detect( std::declval<T>( ) ) )>;
485 template<
typename Optional>
487 daw::is_detected_v<deref_t, Optional>;
489 template<
typename JsonMember,
typename OutputIterator,
typename Optional>
490 [[nodiscard]]
inline constexpr OutputIterator
492 Optional
const &value ) {
493 static_assert( is_valid_optional_v<Optional> );
496 return to_string<JsonMember>( tag_type{ }, it, *value );
499 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
502 parse_to_t
const &value ) {
505 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
506 "value must be convertible to specified type in class contract" );
508 if constexpr( std::is_floating_point_v<typename JsonMember::parse_to_t> ) {
509 if( std::isnan( value ) ) {
519 }
else if( std::isinf( value ) ) {
536 if constexpr( daw::is_floating_point_v<parse_to_t> ) {
537 static_assert(
sizeof( parse_to_t ) <=
sizeof(
double ) );
538 if constexpr( std::is_same_v<OutputIterator, char *> ) {
545 std::copy( buff, ptr, it );
559 template<
typename T,
bool>
566 using type = std::underlying_type_t<T>;
574 std::array<char[2], 100> result{ };
575 for(
size_t n = 0; n < 100; ++n ) {
577 static_cast<char>( ( n % 10 ) +
static_cast<unsigned char>(
'0' ) );
579 static_cast<char>( ( n / 10 ) +
static_cast<unsigned char>(
'0' ) );
584 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
585 [[nodiscard]] constexpr OutputIterator
587 parse_to_t
const &value ) {
590 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
591 "value must be convertible to specified type in class contract" );
601 if constexpr( std::is_enum_v<parse_to_t> or
602 daw::is_integral_v<parse_to_t> ) {
603 auto v =
static_cast<under_type
>( value );
605 char buff[daw::numeric_limits<under_type>::digits10 + 1]{ };
611 *ptr++ =
'0' -
static_cast<char>( v % 10 );
626 auto const tmp =
static_cast<std::size_t
>( v % 100 );
633 *ptr++ =
'0' +
static_cast<char>( v );
637 while( ptr != buff ) {
652 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
653 [[nodiscard]] constexpr OutputIterator
655 parse_to_t
const &value ) {
658 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
659 "value must be convertible to specified type in class contract" );
669 if constexpr( std::is_enum_v<parse_to_t> or
670 daw::is_integral_v<parse_to_t> ) {
671 auto v =
static_cast<under_type
>( value );
673 char buff[daw::numeric_limits<under_type>::digits10 + 1]{ };
679 auto const tmp =
static_cast<std::size_t
>( v % 100 );
686 *ptr++ =
'0' +
static_cast<char>( v );
690 while( ptr != buff ) {
708 namespace utils_details {
710 template<
typename Integer>
712 using parse_to_t = Integer;
719 template<
typename Integer,
typename OutputIterator>
721 Integer
const &value ) {
722 static_assert( daw::is_integral_v<Integer> );
724 if constexpr( daw::is_unsigned_v<Integer> ) {
725 return json_details::to_string<utils_details::number<Integer>>(
728 return json_details::to_string<utils_details::number<Integer>>(
735 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
736 [[nodiscard]]
inline constexpr OutputIterator
738 parse_to_t
const &value ) {
741 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
742 "value must be convertible to specified type in class contract" );
744 constexpr
EightBitModes eight_bit_mode = JsonMember::eight_bit_mode;
746 if( std::size( value ) > 0U ) {
747 it = utils::copy_to_iterator<false, eight_bit_mode>( it, value );
753 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
754 [[nodiscard]]
inline constexpr OutputIterator
756 parse_to_t
const &value ) {
764 constexpr
EightBitModes eight_bit_mode = JsonMember::eight_bit_mode;
766 it = utils::copy_to_iterator<true, eight_bit_mode>( it, value );
772 [[nodiscard]]
inline constexpr
bool is_null( std::optional<T>
const &v ) {
773 return not
static_cast<bool>( v );
777 [[nodiscard]]
inline constexpr
bool is_null( T
const & ) {
781 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
782 [[nodiscard]] constexpr OutputIterator
784 parse_to_t
const &value ) {
787 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
788 "value must be convertible to specified type in class contract" );
798 if( civil.
month < 10 ) {
803 if( civil.
day < 10 ) {
808 if( civil.
hour < 10 ) {
832 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
833 [[nodiscard]]
inline constexpr OutputIterator
835 parse_to_t
const &value ) {
840 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
841 [[nodiscard]]
inline constexpr OutputIterator
843 parse_to_t
const &value ) {
846 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
847 "value must be convertible to specified type in class contract" );
849 if constexpr( has_json_to_json_data_v<parse_to_t> ) {
854 static_assert( is_submember_tagged_variant_v<parse_to_t> );
859 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
860 [[nodiscard]]
inline constexpr OutputIterator
862 parse_to_t
const &value ) {
865 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
866 "value must be convertible to specified type in class contract" );
870 if constexpr( std::is_invocable_r_v<OutputIterator,
871 typename JsonMember::to_converter_t,
872 OutputIterator, parse_to_t> ) {
874 it =
typename JsonMember::to_converter_t{ }( it, value );
877 it,
typename JsonMember::to_converter_t{ }( value ) );
883 it,
typename JsonMember::to_converter_t{ }( value ) );
887 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
888 [[nodiscard]] constexpr OutputIterator
890 parse_to_t
const &value ) {
893 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
894 "value must be convertible to specified type in class contract" );
897 if( not std::empty( value ) ) {
898 auto count = std::size( value ) - 1U;
899 for(
auto const &v : value ) {
900 it = to_string<typename JsonMember::json_element_t>(
911 template<
typename Key,
typename Value>
912 [[maybe_unused]]
inline constexpr Key
const &
917 template<
typename Key,
typename Value>
918 [[maybe_unused]]
inline constexpr Value
const &
923 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
924 [[nodiscard]] constexpr OutputIterator
926 parse_to_t
const &value ) {
929 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
930 "value must be convertible to specified type in class contract" );
931 using key_t =
typename JsonMember::json_key_t;
932 using value_t =
typename JsonMember::json_value_t;
934 if( not std::empty( value ) ) {
935 auto count = std::size( value ) - 1U;
936 for(
auto const &v : value ) {
967 template<
typename JsonMember,
typename OutputIterator,
typename parse_to_t>
968 [[nodiscard]] constexpr OutputIterator
970 parse_to_t
const &value ) {
973 std::is_convertible_v<parse_to_t, typename JsonMember::parse_to_t>,
974 "value must be convertible to specified type in class contract" );
977 if( not std::empty( value ) ) {
978 auto count = std::size( value ) - 1U;
979 for(
auto const &v : value ) {
980 it = to_string<typename JsonMember::json_key_t>(
984 it = to_string<typename JsonMember::json_element_t>(
996 template<
typename JsonMember,
typename OutputIterator,
typename T>
997 [[nodiscard]]
inline constexpr OutputIterator
1000 DAW_MOVE( it ), value );
1003 template<
typename JsonMember>
1006 template<
typename JsonMember>
1008 daw::is_detected_v<tag_member_t, JsonMember>;
1009 template<std::size_t,
typename JsonMember,
typename OutputIterator,
1010 typename Value,
typename VisitedMembers,
1011 std::enable_if_t<not has_tag_member_v<JsonMember>, std::nullptr_t> =
1015 VisitedMembers
const & ) {}
1017 std::size_t pos,
typename JsonMember,
typename OutputIterator,
1018 typename Value,
typename VisitedMembers,
1019 std::enable_if_t<has_tag_member_v<JsonMember>, std::nullptr_t> =
nullptr>
1022 VisitedMembers &visited_members ) {
1024 constexpr
auto tag_member_name = daw::string_view(
1025 std::data( tag_member::name ), std::size( tag_member::name ) );
1026 if( daw::algorithm::contains( std::data( visited_members ),
1027 daw::data_end( visited_members ),
1028 tag_member_name ) ) {
1031 visited_members.push_back( tag_member_name );
1032 if( not is_first ) {
1037 it = utils::copy_to_iterator<false, EightBitModes::AllowFull>(
1038 it, tag_member_name );
1039 it = utils::copy_to_iterator<false, EightBitModes::AllowFull>( it,
"\":" );
1040 it = member_to_string<tag_member>( DAW_MOVE( it ),
1041 typename JsonMember::switcher{ }( v ) );
1044 template<std::size_t pos,
typename JsonMember,
typename OutputIterator,
1045 typename... Args,
typename Value,
typename Visited>
1046 inline constexpr
void to_json_str(
bool &is_first, OutputIterator &it,
1047 std::tuple<Args...>
const &tp,
1048 Value
const &, Visited &visited_members ) {
1050 std::data( JsonMember::name ), std::size( JsonMember::name ) );
1051 if( daw::algorithm::contains( std::data( visited_members ),
1052 daw::data_end( visited_members ),
1057 static_assert( is_a_json_type_v<JsonMember>,
"Unsupported data type" );
1058 if constexpr( is_json_nullable_v<JsonMember> ) {
1059 if( not std::get<pos>( tp ) ) {
1063 if( not is_first ) {
1068 it = utils::copy_to_iterator<false, EightBitModes::AllowFull>(
1069 it, JsonMember::name );
1070 it = utils::copy_to_iterator<false, EightBitModes::AllowFull>( it,
"\":" );
1071 it = member_to_string<JsonMember>( DAW_MOVE( it ), std::get<pos>( tp ) );
1074 template<
size_t TupleIdx,
typename JsonMember,
typename OutputIterator,
1078 std::tuple<Args...>
const &tp ) {
1081 static_assert( is_a_json_type_v<json_member_type>,
1082 "Unsupported data type" );
1086 not is_a_json_tagged_variant_v<json_member_type>,
1087 "JSON tagged variant types are not supported when inside an array "
1088 "as an ordered structure" );
1090 if constexpr( is_an_ordered_member_v<JsonMember> ) {
1091 for( ; array_idx < JsonMember::member_index; ++array_idx ) {
1092 if( array_idx > 0 ) {
1101 if( array_idx > 0 ) {
1104 it = member_to_string<json_member_type>( it, std::get<TupleIdx>( tp ) );
Definition: daw_json_value.h:305
constexpr std::string_view get_string_view() const
Definition: daw_json_value.h:426
constexpr bool is_null() const
Definition: daw_json_value.h:457
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:191
static constexpr LiteralAsStringOpt literal_as_string
Definition: daw_json_to_string.h:713
constexpr ymdhms time_point_to_civil(std::chrono::time_point< Clock, Duration > const &tp)
Definition: daw_json_parse_iso8601_utils.h:268
decltype(to_string_test(std::declval< T >())) to_string_result
Definition: daw_json_to_string.h:70
auto to_string_test(T &&v) -> decltype(to_string(DAW_FWD(v)))
Definition: daw_json_to_string.h:60
auto to_string(std::optional< T > const &v) -> decltype(to_string(*v))
Definition: daw_json_to_string.h:80
constexpr bool has_to_string_v
Definition: daw_json_to_string.h:77
daw::is_detected< to_string_test::to_string_result, T > has_to_string
Definition: daw_json_to_string.h:74
Definition: daw_from_json_fwd.h:19
constexpr OutputIterator to_string(ParseTag< JsonParseTypes::Null >, OutputIterator it, parse_to_t const &value)
constexpr void utf32_to_utf8(std::uint32_t cp, OutputIterator &it)
Definition: daw_json_to_string.h:215
typename ordered_member_subtype< T, is_an_ordered_member_v< T > >::type ordered_member_subtype_t
Definition: daw_json_parse_common.h:68
constexpr OutputIterator output_hex(std::uint16_t c, OutputIterator it)
Definition: daw_json_to_string.h:197
constexpr auto digits100
Definition: daw_json_to_string.h:573
constexpr bool has_tag_member_v
Definition: daw_json_to_string.h:1007
constexpr Value const & json_get_value(std::pair< Key, Value > const &kv)
Definition: daw_json_to_string.h:919
constexpr void to_variant_string(OutputIterator &it, parse_to_t const &value)
Definition: daw_json_to_string.h:441
constexpr bool is_valid_optional_v
Definition: daw_json_to_string.h:486
constexpr char to_nibble_char(Char c)
Definition: daw_json_to_string.h:185
constexpr OutputIterator member_to_string(OutputIterator it, T const &value)
Definition: daw_json_to_string.h:998
constexpr bool is_null(std::optional< T > const &v)
Definition: daw_json_to_string.h:772
typename base_int_type_impl< T, std::is_enum_v< T > >::type base_int_type_t
Definition: daw_json_to_string.h:571
constexpr void tags_to_json_str(bool &, OutputIterator const &, Value const &, VisitedMembers const &)
Definition: daw_json_to_string.h:1013
constexpr Key const & json_get_key(std::pair< Key, Value > const &kv)
Definition: daw_json_to_string.h:913
constexpr OutputIterator to_string(ParseTag< JsonParseTypes::Unknown >, OutputIterator it, parse_to_t const &value)
Definition: daw_json_to_string.h:834
typename JsonMember::tag_member tag_member_t
Definition: daw_json_to_string.h:1004
daw::remove_cvref_t< decltype(deref_detect(std::declval< T >()))> deref_t
Definition: daw_json_to_string.h:483
constexpr void to_json_str(bool &is_first, OutputIterator &it, std::tuple< Args... > const &tp, Value const &, Visited &visited_members)
Definition: daw_json_to_string.h:1046
constexpr auto deref_detect(T &&value) -> decltype(*value)
constexpr void to_json_ordered_str(std::size_t &array_idx, OutputIterator &it, std::tuple< Args... > const &tp)
Definition: daw_json_to_string.h:1076
Definition: daw_json_to_string.h:243
constexpr OutputIterator copy_to_iterator(OutputIterator it, Container const &container)
Definition: daw_json_to_string.h:250
constexpr OutputIterator integer_to_string(OutputIterator it, Integer const &value)
Definition: daw_json_to_string.h:720
Definition: daw_from_json.h:22
LiteralAsStringOpt
Definition: daw_json_enums.h:97
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_enums.h:89
EightBitModes
Definition: daw_json_enums.h:69
constexpr std::string_view to_string(JsonBaseParseTypes pt)
Definition: daw_json_enums.h:47
typename DAW_JSON_NS::json_data_contract< T >::type json_data_contract_trait_t
Definition: daw_json_traits.h:47
DAW_JSON_NOINLINE void daw_json_error(ErrorReason reason)
Definition: daw_json_assert.h:53
OutputIterator real2string(Real const &value, OutputIterator out_it)
Definition: daw_json_to_string.h:41
Definition: daw_json_to_string.h:91
Definition: daw_json_parse_iso8601_utils.h:256
std::uint_least32_t hour
Definition: daw_json_parse_iso8601_utils.h:260
std::int_least32_t year
Definition: daw_json_parse_iso8601_utils.h:257
std::uint_least32_t month
Definition: daw_json_parse_iso8601_utils.h:258
std::uint_least32_t millisecond
Definition: daw_json_parse_iso8601_utils.h:263
std::uint_least32_t day
Definition: daw_json_parse_iso8601_utils.h:259
std::uint_least32_t second
Definition: daw_json_parse_iso8601_utils.h:262
std::uint_least32_t minute
Definition: daw_json_parse_iso8601_utils.h:261
Definition: daw_json_traits.h:41
std::underlying_type_t< T > type
Definition: daw_json_to_string.h:566
Definition: daw_json_to_string.h:560
T type
Definition: daw_json_to_string.h:561
Definition: daw_json_value_state.h:55