26 #include <daw/daw_attributes.h>
27 #include <daw/daw_traits.h>
37 namespace json_details {
47 template<LiteralAsStringOpt literal_as_
string,
typename ParseState>
48 DAW_ATTRIB_INLINE
inline constexpr
void
52 ErrorReason::InvalidNumberUnexpectedQuoting,
64 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
66 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
68 using constructor_t =
typename JsonMember::constructor_t;
69 using element_t =
typename JsonMember::base_type;
71 if constexpr( KnownBounds ) {
76 if constexpr( JsonMember::literal_as_string !=
78 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
89 if constexpr( JsonMember::literal_as_string !=
91 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
101 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
103 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
105 using constructor_t =
typename JsonMember::constructor_t;
106 using element_t =
typename JsonMember::base_type;
108 typename std::conditional_t<std::is_enum_v<element_t>,
109 std::underlying_type<element_t>,
110 daw::traits::identity<element_t>>::type;
112 static_assert( daw::is_signed<int_type>::value,
113 "Expected signed type" );
114 if constexpr( KnownBounds ) {
119 if constexpr( JsonMember::literal_as_string !=
121 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
123 }
else if constexpr( not ParseState::is_zero_terminated_string ) {
125 ErrorReason::UnexpectedEndOfData,
129 auto const sign =
static_cast<int_type
>(
132 if constexpr( KnownBounds ) {
135 static_cast<element_t
>(
136 sign *
static_cast<int_type
>(
138 KnownBounds>( ParseState::exec_tag,
143 static_cast<element_t
>(
144 sign *
static_cast<int_type
>(
146 KnownBounds>( ParseState::exec_tag,
148 if constexpr( JsonMember::literal_as_string !=
150 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
161 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
163 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
166 using constructor_t =
typename JsonMember::constructor_t;
167 using element_t =
typename JsonMember::base_type;
169 if constexpr( KnownBounds ) {
170 if constexpr( JsonMember::literal_as_string !=
172 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
179 unsigned_parser<element_t, JsonMember::range_check, KnownBounds>(
182 if constexpr( JsonMember::literal_as_string !=
184 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
186 if constexpr( not ParseState::is_zero_terminated_string ) {
188 ErrorReason::UnexpectedEndOfData,
191 }
else if constexpr( not ParseState::is_zero_terminated_string ) {
193 ErrorReason::UnexpectedEndOfData,
201 unsigned_parser<element_t, JsonMember::range_check, KnownBounds>(
203 if constexpr( JsonMember::literal_as_string !=
205 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
207 if constexpr( not ParseState::is_zero_terminated_string ) {
209 ErrorReason::UnexpectedEndOfData,
220 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
222 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
225 using constructor_t =
typename JsonMember::constructor_t;
226 if constexpr( KnownBounds ) {
235 std::string_view( std::data( JsonMember::name ),
236 std::size( JsonMember::name ) ) ) );
239 return parse_value<JsonMember, true>(
241 }
else if constexpr( ParseState::is_unchecked_input ) {
249 std::string_view( std::data( JsonMember::name ),
250 std::size( JsonMember::name ) ) ) );
260 return parse_value<JsonMember>(
273 return parse_value<JsonMember>(
278 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
280 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
282 using constructor_t =
typename JsonMember::constructor_t;
284 if constexpr( KnownBounds ) {
286 if constexpr( ParseState::is_unchecked_input ) {
303 if constexpr( JsonMember::literal_as_string !=
305 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
309 if constexpr( ParseState::is_unchecked_input ) {
327 if constexpr( JsonMember::literal_as_string !=
329 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
342 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
344 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
348 using constructor_t =
typename JsonMember::constructor_t;
349 if constexpr( KnownBounds ) {
361 if constexpr( JsonMember::allow_escape_character ==
382 if( first == last ) {
389 parse_state, first,
static_cast<std::size_t
>( last - first ) );
393 parse_state, first,
static_cast<std::size_t
>( last - first ) );
405 template<
typename JsonMember>
408 can_single_allocation_string<json_result<JsonMember>>,
409 can_single_allocation_string<json_base_type<JsonMember>>> {};
419 daw::is_detected<json_member_constructor_t, T>::value;
423 daw::is_detected<json_member_constructor_t, T>::value;
425 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
429 static_assert( has_json_member_constructor_v<JsonMember> );
430 static_assert( has_json_member_parse_to_v<JsonMember> );
432 using constructor_t =
typename JsonMember::constructor_t;
434 constexpr
bool AllowHighEightbits =
442 true>( parse_state2 );
448 std::data( parse_state2 ), daw::data_end( parse_state2 ) );
452 constexpr
bool AllowHighEightbits =
457 true>( parse_state2 );
463 std::data( parse_state2 ), daw::data_end( parse_state2 ) );
467 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
469 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
475 using constructor_t =
typename JsonMember::constructor_t;
478 std::data( str ), std::size( str ) );
481 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
482 [[nodiscard, maybe_unused]] constexpr json_result<JsonMember>
485 auto const str = [&] {
486 if constexpr( JsonMember::custom_json_type ==
488 if constexpr( KnownBounds ) {
493 }
else if constexpr( JsonMember::custom_json_type ==
497 static_assert( JsonMember::custom_json_type ==
502 if constexpr( KnownBounds ) {
504 if( *( result.first - 1 ) ==
'"' ) {
519 str.has_more( ) and not( str.front( ) ==
'[' or str.front( ) ==
'{' ),
520 ErrorReason::InvalidStartOfValue, str );
521 using constructor_t =
typename JsonMember::from_converter_t;
524 std::string_view( std::data( str ), std::size( str ) ) );
528 template<
typename ParseState>
529 struct trim_left_cleanup {
533 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
534 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
538 if( std::uncaught_exceptions( ) == 0 ) {
541 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
548 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
550 maybe_unused]] DAW_ATTRIB_FLATTEN constexpr json_result<JsonMember>
553 using element_t =
typename JsonMember::base_type;
557 if constexpr( is_guaranteed_rvo_v<ParseState> ) {
561 if constexpr( not KnownBounds ) {
562 auto const run_after_parse =
564 (void)run_after_parse;
572 if constexpr( KnownBounds ) {
576 if constexpr( force_aggregate_construction_v<element_t> ) {
577 auto const run_after_parse =
579 (void)run_after_parse;
602 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
604 maybe_unused]] DAW_ATTRIB_FLATTEN constexpr json_result<JsonMember>
609 "Expected a json_key_value" );
611 ErrorReason::ExpectedKeyValueToStartWithBrace,
617 #if defined( __GNUC__ ) or defined( __clang__ )
624 using constructor_t =
typename JsonMember::constructor_t;
638 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
640 maybe_unused]] DAW_ATTRIB_FLATTEN constexpr json_result<JsonMember>
644 static_assert( JsonMember::expected_type ==
646 "Expected a json_key_value" );
649 ErrorReason::ExpectedKeyValueArrayToStartWithBracket,
parse_state );
655 using constructor_t =
typename JsonMember::constructor_t;
661 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
663 maybe_unused]] DAW_ATTRIB_FLATTEN constexpr json_result<JsonMember>
675 using constructor_t =
typename JsonMember::constructor_t;
681 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
683 maybe_unused]] DAW_ATTRIB_FLATTEN constexpr json_result<JsonMember>
689 auto [is_found, parse_state2] = find_range<ParseState>(
695 auto const sz = parse_value<size_member>(
698 if constexpr( KnownBounds and ParseState::is_unchecked_input ) {
701 auto cnt =
static_cast<std::ptrdiff_t
>(
parse_state.counter );
714 using constructor_t =
typename JsonMember::constructor_t;
718 static_cast<std::size_t
>( sz ) );
724 maybe_unused]] DAW_ATTRIB_FLATTEN constexpr json_result<JsonMembers>
726 using element_t =
typename JsonMembers::json_elements;
727 constexpr std::size_t idx =
728 JsonMembers::base_map::base_map[
static_cast<int_fast8_t
>( BPT )];
730 if constexpr( idx < pack_size_v<typename element_t::element_map_t> ) {
732 pack_element_t<idx, typename element_t::element_map_t>;
733 return parse_value<JsonMember>(
736 if constexpr( ParseState::is_unchecked_input ) {
744 template<
typename JsonMember,
bool ,
typename ParseState>
746 maybe_unused]] DAW_ATTRIB_INLINE constexpr json_result<JsonMember>
751 return parse_variant_value<JsonBaseParseTypes::Class, JsonMember>(
754 return parse_variant_value<JsonBaseParseTypes::Array, JsonMember>(
758 return parse_variant_value<JsonBaseParseTypes::Bool, JsonMember>(
761 return parse_variant_value<JsonBaseParseTypes::String, JsonMember>(
775 return parse_variant_value<JsonBaseParseTypes::Number, JsonMember>(
778 if constexpr( ParseState::is_unchecked_input ) {
785 template<
typename Result,
typename TypeList, std::size_t pos = 0,
787 DAW_ATTRIB_FLATINLINE constexpr Result
790 using JsonMember = pack_element_t<pos, TypeList>;
792 return parse_value<JsonMember>(
795 return { parse_value<JsonMember>(
799 if constexpr( pos + 1 < pack_size_v<TypeList> ) {
800 return parse_visit<Result, TypeList, pos + 1>( idx,
parse_state );
802 if constexpr( ParseState::is_unchecked_input ) {
811 template<
typename JsonMember,
bool ,
typename ParseState>
813 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
817 auto [is_found, parse_state2] = find_range<ParseState>(
823 auto index =
typename JsonMember::switcher{ }( parse_value<tag_member>(
826 return parse_visit<json_result<JsonMember>,
827 typename JsonMember::json_elements::element_map_t>(
831 template<
typename JsonMember,
bool KnownBounds, std::size_t N,
832 typename ParseState,
bool B>
833 [[nodiscard]] constexpr json_result<JsonMember>
837 auto [is_found, parse_state2] = find_range<ParseState>(
843 auto index =
typename JsonMember::switcher{ }( parse_value<tag_member>(
846 return parse_visit<json_result<JsonMember>,
847 typename JsonMember::json_elements::element_map_t>(
851 template<
bool AllMembersMustExist,
typename ParseState>
857 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
858 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
870 if( std::uncaught_exceptions( ) == 0 ) {
881 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
887 template<
typename JsonMember,
bool KnownBounds,
typename ParseState,
889 DAW_ATTRIB_FLATINLINE constexpr json_result<JsonMember>
896 using tuple_t =
typename JsonMember::base_type;
898 auto const parse_value_help = [&](
auto Idx ) {
900 constexpr std::size_t index = decltype( Idx )::value;
903 #if defined( _MSC_VER ) and not defined( __clang__ )
913 using Constructor =
typename JsonMember::constructor_t;
916 std::is_invocable<Constructor, decltype( parse_value_help(
917 std::integral_constant<
918 std::size_t, Is>{ } ) )...>::value,
919 "Supplied types cannot be used for construction of this type" );
923 if constexpr( is_guaranteed_rvo_v<ParseState> ) {
925 json_details::all_json_members_must_exist_v<JsonMember, ParseState>,
927 (void)run_after_parse;
928 if constexpr( force_aggregate_construction_v<JsonMember> ) {
929 return tuple_t{ parse_value_help(
930 std::integral_constant<std::size_t, Is>{ } )... };
932 return construct_value_tp<tuple_t, Constructor>(
934 fwd_pack{ parse_value_help(
935 std::integral_constant<std::size_t, Is>{ } )... } );
939 if constexpr( force_aggregate_construction_v<JsonMember> ) {
940 return tuple_t{ parse_value_help(
941 std::integral_constant<std::size_t, Is>{ } )... };
943 return construct_value_tp<tuple_t, Constructor>(
945 fwd_pack{ parse_value_help(
946 std::integral_constant<std::size_t, Is>{ } )... } );
950 tuple_t, ParseState> ) {
963 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
964 DAW_ATTRIB_FLATINLINE constexpr json_result<JsonMember>
966 using tuple_t =
typename JsonMember::base_type;
969 return parse_tuple_value<JsonMember, KnownBounds>(
970 parse_state, std::make_index_sequence<element_pack::size>{ } );
973 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
974 DAW_ATTRIB_FLATINLINE constexpr json_result<JsonMember>
977 using constructor_t =
typename JsonMember::constructor_t;
978 if constexpr( KnownBounds ) {
986 std::data( value_parse_state ), std::size( value_parse_state ) );
990 template<std::size_t N,
typename JsonClass,
bool KnownBounds,
991 typename... JsonClasses,
typename ParseState>
992 DAW_ATTRIB_FLATTEN constexpr json_result<JsonClass>
995 DAW_ASSUME( idx <
sizeof...( JsonClasses ) );
996 using T =
typename JsonClass::base_type;
997 using Constructor =
typename JsonClass::constructor_t;
998 if constexpr(
sizeof...( JsonClasses ) >= N + 8 ) {
1001 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1004 parse_value<cur_json_class_t>(
1009 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1012 parse_value<cur_json_class_t>(
1017 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1020 parse_value<cur_json_class_t>(
1025 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1028 parse_value<cur_json_class_t>(
1033 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1036 parse_value<cur_json_class_t>(
1041 using cur_json_class_t = traits::nth_element<N + 5, JsonClasses...>;
1044 parse_value<cur_json_class_t>(
1049 using cur_json_class_t = traits::nth_element<N + 6, JsonClasses...>;
1052 parse_value<cur_json_class_t>(
1057 using cur_json_class_t = traits::nth_element<N + 7, JsonClasses...>;
1060 parse_value<cur_json_class_t>(
1065 if constexpr(
sizeof...( JsonClasses ) >= N + 8 ) {
1072 }
else if constexpr(
sizeof...( JsonClasses ) == N + 7 ) {
1075 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1078 parse_value<cur_json_class_t>(
1083 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1086 parse_value<cur_json_class_t>(
1091 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1094 parse_value<cur_json_class_t>(
1099 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1102 parse_value<cur_json_class_t>(
1107 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1110 parse_value<cur_json_class_t>(
1115 using cur_json_class_t = traits::nth_element<N + 5, JsonClasses...>;
1118 parse_value<cur_json_class_t>(
1123 DAW_ASSUME( idx == N + 6 );
1124 using cur_json_class_t = traits::nth_element<N + 6, JsonClasses...>;
1127 parse_value<cur_json_class_t>(
1132 }
else if constexpr(
sizeof...( JsonClasses ) == N + 6 ) {
1135 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1138 parse_value<cur_json_class_t>(
1143 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1146 parse_value<cur_json_class_t>(
1151 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1154 parse_value<cur_json_class_t>(
1159 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1162 parse_value<cur_json_class_t>(
1167 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1170 parse_value<cur_json_class_t>(
1175 DAW_ASSUME( idx == N + 5 );
1176 using cur_json_class_t = traits::nth_element<N + 5, JsonClasses...>;
1179 parse_value<cur_json_class_t>(
1184 }
else if constexpr(
sizeof...( JsonClasses ) == N + 5 ) {
1187 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1190 parse_value<cur_json_class_t>(
1195 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1198 parse_value<cur_json_class_t>(
1203 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1206 parse_value<cur_json_class_t>(
1211 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1214 parse_value<cur_json_class_t>(
1219 DAW_ASSUME( idx == N + 4 );
1220 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1223 parse_value<cur_json_class_t>(
1228 }
else if constexpr(
sizeof...( JsonClasses ) == N + 4 ) {
1231 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1234 parse_value<cur_json_class_t>(
1239 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1242 parse_value<cur_json_class_t>(
1247 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1250 parse_value<cur_json_class_t>(
1255 DAW_ASSUME( idx == N + 3 );
1256 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1259 parse_value<cur_json_class_t>(
1264 }
else if constexpr(
sizeof...( JsonClasses ) == N + 3 ) {
1267 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1270 parse_value<cur_json_class_t>(
1275 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1278 parse_value<cur_json_class_t>(
1283 DAW_ASSUME( idx == N + 2 );
1284 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1287 parse_value<cur_json_class_t>(
1292 }
else if constexpr(
sizeof...( JsonClasses ) == N + 2 ) {
1294 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1297 parse_value<cur_json_class_t>(
1301 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1304 parse_value<cur_json_class_t>(
1308 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1311 parse_value<cur_json_class_t>(
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:178
#define CPP20CONSTEXPR
Definition: daw_json_parse_common.h:40
ParseState & parse_state
Definition: daw_json_parse_value.h:530
static constexpr Unsigned unsigned_parser(constexpr_exec_tag, ParseState &parse_state)
Definition: daw_json_parse_unsigned_int.h:109
constexpr auto parse_string_known_stdstring(ParseState &parse_state)
Definition: daw_json_parse_std_string.h:194
typename json_type_deducer< T, has_json_data_contract_trait_v< T >, json_details::is_a_json_type_v< T >, has_json_link_quick_map_v< T >, is_container_v< T > >::type json_deduced_type
Definition: daw_json_parse_common.h:931
constexpr ParseState skip_value(ParseState &parse_state)
Definition: daw_json_skip.h:298
constexpr bool has_json_member_constructor_v
Definition: daw_json_parse_value.h:418
constexpr DAW_ATTRIB_FLATTEN json_result< JsonClass > parse_nth_class(std::size_t idx, ParseState &parse_state)
Definition: daw_json_parse_value.h:993
constexpr DAW_ATTRIB_FLATTEN json_result< JsonMembers > parse_variant_value(ParseState &parse_state)
Definition: daw_json_parse_value.h:725
constexpr ParseState skip_literal(ParseState &parse_state)
Definition: daw_json_skip.h:387
std::bool_constant< daw::is_detected_v< json_type_t, T > > is_a_json_type
Definition: daw_json_traits.h:426
constexpr DAW_ATTRIB_FLATINLINE Result parse_visit(std::size_t idx, ParseState &parse_state)
Definition: daw_json_parse_value.h:788
constexpr DAW_ATTRIB_FLATINLINE json_result< JsonMember > parse_tuple_value(ParseState &parse_state, std::index_sequence< Is... >)
Definition: daw_json_parse_value.h:890
constexpr bool all_json_members_must_exist_v
Definition: daw_json_traits.h:606
typename JsonMember::dependent_member dependent_member_t
Definition: daw_json_parse_common.h:961
typename T::parse_to_t json_member_parse_to_t
Definition: daw_json_parse_value.h:415
constexpr DAW_ATTRIB_FLATINLINE ParseState skip_string(ParseState &parse_state)
Definition: daw_json_skip.h:56
AllMembersMustExist
Definition: daw_json_location_info.h:198
typename T::constructor_t json_member_constructor_t
Definition: daw_json_parse_value.h:412
static constexpr DAW_ATTRIB_FLATINLINE auto construct_value(template_params< Value, Constructor >, ParseState &parse_state, Args &&...args)
Definition: daw_json_parse_common.h:63
typename JsonMember::parse_to_t json_result
Definition: daw_json_parse_common.h:205
constexpr bool needs_slow_path(ParseState const &parse_state)
Definition: daw_json_parse_string_need_slow.h:23
constexpr DAW_ATTRIB_INLINE void skip_quote_when_literal_as_string(ParseState &parse_state)
Definition: daw_json_parse_value.h:49
constexpr DAW_ATTRIB_INLINE json_result< JsonMember > parse_value(ParseState &parse_state, ParseTag< JsonParseTypes::Real >)
Definition: daw_json_parse_value.h:67
constexpr bool has_json_member_parse_to_v
Definition: daw_json_parse_value.h:422
constexpr DAW_ATTRIB_FLATINLINE int validate_signed_first(ParseState &parse_state)
Definition: daw_json_parse_policy_policy_details.h:73
constexpr DAW_ATTRIB_FLATINLINE bool is_number(char c)
Definition: daw_json_parse_policy_policy_details.h:34
constexpr DAW_ATTRIB_FLATINLINE void validate_unsigned_first(ParseState const &parse_state)
Definition: daw_json_parse_policy_policy_details.h:41
constexpr DAW_ATTRIB_FLATINLINE bool at_end_of_item(char c)
Definition: daw_json_parse_policy_policy_details.h:25
constexpr DAW_ATTRIB_FLATINLINE bool is_number_start(char c)
Definition: daw_json_parse_policy_policy_details.h:106
typename json_data_contract< T >::type json_data_contract_trait_t
Definition: daw_json_traits.h:133
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_enums.h:106
DAW_ATTRIB_NOINLINE void daw_json_error(ErrorReason reason)
Definition: daw_json_assert.h:39
JsonBaseParseTypes
Definition: daw_json_enums.h:40
Definition: daw_from_json.h:22
Definition: daw_json_parse_value.h:409
Definition: daw_json_parse_array_iterator.h:63
Definition: daw_json_parse_kv_array_iterator.h:60
Definition: daw_json_parse_kv_class_iterator.h:50
Definition: daw_json_parse_value.h:852
DAW_ATTRIB_INLINE CPP20CONSTEXPR ~ordered_class_cleanup() noexcept(false)
Definition: daw_json_parse_value.h:856
ParseState & parse_state
Definition: daw_json_parse_value.h:853
Allow tuple like types to be used in json_tuple.
Definition: daw_json_traits.h:638
#define DAW_JSON_VER
Definition: version.h:11