26#include <daw/daw_algorithm.h>
27#include <daw/daw_attributes.h>
28#include <daw/daw_traits.h>
29#include <daw/daw_utility.h>
37#if defined( __cpp_constexpr_dynamic_alloc )
38#define CPP20CONSTEXPR constexpr
45 namespace json_details {
55 template<LiteralAsStringOpt literal_as_
string,
typename ParseState>
56 DAW_ATTRIB_INLINE
inline constexpr void
60 ErrorReason::InvalidNumberUnexpectedQuoting,
72 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
74 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
76 using constructor_t =
typename JsonMember::constructor_t;
77 using element_t =
typename JsonMember::base_type;
79 if constexpr( JsonMember::literal_as_string !=
81 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
83 if constexpr( JsonMember::allow_number_errors ==
85 JsonMember::allow_number_errors ==
87 element_t sign = element_t( 1.0 );
89 sign = element_t( -1.0 );
109 return daw::cxmath::copy_sign(
110 daw::numeric_limits<element_t>::infinity( ), sign );
111 }
else if( sign < element_t( 0 ) ) {
115 if constexpr( JsonMember::allow_number_errors ==
117 JsonMember::allow_number_errors ==
126 return daw::numeric_limits<element_t>::quiet_NaN( );
130 if constexpr( KnownBounds ) {
143 if constexpr( JsonMember::literal_as_string !=
145 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
157 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
159 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
161 using constructor_t =
typename JsonMember::constructor_t;
162 using element_t =
typename JsonMember::base_type;
164 typename std::conditional_t<std::is_enum_v<element_t>,
165 std::underlying_type<element_t>,
166 daw::traits::identity<element_t>>::type;
168 static_assert( daw::is_signed<int_type>::value,
169 "Expected signed type" );
170 if constexpr( KnownBounds ) {
175 if constexpr( JsonMember::literal_as_string !=
177 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
179 }
else if constexpr( not ParseState::is_zero_terminated_string ) {
181 ErrorReason::UnexpectedEndOfData,
185 auto const sign =
static_cast<int_type
>(
188 typename std::conditional_t<daw::is_system_integral_v<int_type>,
189 daw::make_unsigned<int_type>,
190 daw::traits::identity<int_type>>::type;
192 unsigned_parser<uint_type, JsonMember::range_check, KnownBounds>(
196 if constexpr( KnownBounds ) {
199 static_cast<element_t
>( parsed_val ) );
203 static_cast<element_t
>( parsed_val ) );
204 if constexpr( JsonMember::literal_as_string !=
206 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
218 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
220 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
223 using constructor_t =
typename JsonMember::constructor_t;
224 using element_t =
typename JsonMember::base_type;
226 typename std::conditional_t<std::is_enum_v<element_t>,
227 std::underlying_type<element_t>,
228 daw::traits::identity<element_t>>::type;
230 if constexpr( KnownBounds ) {
231 if constexpr( JsonMember::literal_as_string !=
233 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
240 unsigned_parser<uint_type, JsonMember::range_check, KnownBounds>(
243 if constexpr( JsonMember::literal_as_string !=
245 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
247 if constexpr( not ParseState::is_zero_terminated_string ) {
249 ErrorReason::UnexpectedEndOfData,
252 }
else if constexpr( not ParseState::is_zero_terminated_string ) {
254 ErrorReason::UnexpectedEndOfData,
262 unsigned_parser<uint_type, JsonMember::range_check, KnownBounds>(
264 if constexpr( JsonMember::literal_as_string !=
266 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
268 if constexpr( not ParseState::is_zero_terminated_string ) {
270 ErrorReason::UnexpectedEndOfData,
282 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
284 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
287 using constructor_t =
typename JsonMember::constructor_t;
288 if constexpr( KnownBounds ) {
297 std::string_view( std::data( JsonMember::name ),
298 std::size( JsonMember::name ) ) ) );
301 return parse_value<JsonMember, true>(
303 }
else if constexpr( ParseState::is_unchecked_input ) {
311 std::string_view( std::data( JsonMember::name ),
312 std::size( JsonMember::name ) ) ) );
322 return parse_value<JsonMember>(
336 return parse_value<JsonMember>(
341 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
343 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
345 using constructor_t =
typename JsonMember::constructor_t;
347 if constexpr( KnownBounds ) {
349 if constexpr( ParseState::is_unchecked_input ) {
366 if constexpr( JsonMember::literal_as_string !=
368 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
372 if constexpr( ParseState::is_unchecked_input ) {
390 if constexpr( JsonMember::literal_as_string !=
392 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
406 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
408 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
412 using constructor_t =
typename JsonMember::constructor_t;
413 if constexpr( KnownBounds ) {
425 if constexpr( JsonMember::allow_escape_character ==
446 if( first == last ) {
453 parse_state, first,
static_cast<std::size_t
>( last - first ) );
457 parse_state, first,
static_cast<std::size_t
>( last - first ) );
469 template<
typename JsonMember>
472 can_single_allocation_string<json_result<JsonMember>>,
473 can_single_allocation_string<json_base_type<JsonMember>>> {};
483 daw::is_detected<json_member_constructor_t, T>::value;
487 daw::is_detected<json_member_constructor_t, T>::value;
489 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
493 static_assert( has_json_member_constructor_v<JsonMember> );
494 static_assert( has_json_member_parse_to_v<JsonMember> );
496 using constructor_t =
typename JsonMember::constructor_t;
498 using AllowHighEightbits =
499 std::bool_constant<JsonMember::eight_bit_mode !=
504 if( not AllowHighEightbits::value or
515 std::data( parse_state2 ), daw::data_end( parse_state2 ) );
519 using AllowHighEightbits =
520 std::bool_constant<JsonMember::eight_bit_mode !=
522 if( not AllowHighEightbits::value or
533 std::data( parse_state2 ), daw::data_end( parse_state2 ) );
537 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
539 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
545 using constructor_t =
typename JsonMember::constructor_t;
548 std::data( str ), std::size( str ) );
551 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
552 [[nodiscard, maybe_unused]]
constexpr json_result<JsonMember>
555 auto const str = [&] {
556 if constexpr( JsonMember::custom_json_type ==
558 if constexpr( KnownBounds ) {
563 }
else if constexpr( JsonMember::custom_json_type ==
567 static_assert( JsonMember::custom_json_type ==
572 if constexpr( KnownBounds ) {
574 if( *( result.first - 1 ) ==
'"' ) {
589 str.has_more( ) and not( str.front( ) ==
'[' or str.front( ) ==
'{' ),
590 ErrorReason::InvalidStartOfValue, str );
591 using constructor_t =
typename JsonMember::from_converter_t;
594 std::string_view( std::data( str ), std::size( str ) ) );
598 template<
typename ParseState>
599 struct trim_left_cleanup {
603#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
604 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
608 if( std::uncaught_exceptions( ) == 0 ) {
611#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
618 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
620 maybe_unused]] DAW_ATTRIB_FLATTEN
constexpr json_result<JsonMember>
623 using element_t =
typename JsonMember::base_type;
627 if constexpr( use_direct_construction_v<ParseState, JsonMember> ) {
631 if constexpr( KnownBounds ) {
635 auto const run_after_parse =
637 (void)run_after_parse;
642 if constexpr( KnownBounds ) {
646 if constexpr( force_aggregate_construction_v<element_t> ) {
647 auto const run_after_parse =
649 (void)run_after_parse;
672 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
674 maybe_unused]] DAW_ATTRIB_FLATTEN
constexpr json_result<JsonMember>
679 "Expected a json_key_value" );
681 ErrorReason::ExpectedKeyValueToStartWithBrace,
687#if defined( __GNUC__ ) or defined( __clang__ )
694 using constructor_t =
typename JsonMember::constructor_t;
708 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
710 maybe_unused]] DAW_ATTRIB_FLATTEN
constexpr json_result<JsonMember>
714 static_assert( JsonMember::expected_type ==
716 "Expected a json_key_value" );
719 ErrorReason::ExpectedKeyValueArrayToStartWithBracket,
parse_state );
725 using constructor_t =
typename JsonMember::constructor_t;
731 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
733 maybe_unused]] DAW_ATTRIB_FLATTEN
constexpr json_result<JsonMember>
745 using constructor_t =
typename JsonMember::constructor_t;
751 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
753 maybe_unused]] DAW_ATTRIB_FLATTEN
constexpr json_result<JsonMember>
759 auto [is_found, parse_state2] = find_range<ParseState>(
765 auto const sz = parse_value<size_member>(
768 if constexpr( KnownBounds and ParseState::is_unchecked_input ) {
771 auto cnt =
static_cast<std::ptrdiff_t
>(
parse_state.counter );
784 using constructor_t =
typename JsonMember::constructor_t;
788 static_cast<std::size_t
>( sz ) );
794 maybe_unused]] DAW_ATTRIB_FLATTEN
constexpr json_result<JsonMembers>
796 using element_t =
typename JsonMembers::json_elements;
797 using idx = daw::constant<(
798 JsonMembers::base_map::base_map[
static_cast<int_fast8_t
>( BPT )] )>;
800 if constexpr( idx::value <
801 pack_size_v<typename element_t::element_map_t> ) {
803 pack_element_t<idx::value, typename element_t::element_map_t>;
804 return parse_value<JsonMember>(
807 if constexpr( ParseState::is_unchecked_input ) {
815 template<
typename JsonMember,
bool ,
typename ParseState>
817 maybe_unused]] DAW_ATTRIB_INLINE
constexpr json_result<JsonMember>
822 return parse_variant_value<JsonBaseParseTypes::Class, JsonMember>(
825 return parse_variant_value<JsonBaseParseTypes::Array, JsonMember>(
829 return parse_variant_value<JsonBaseParseTypes::Bool, JsonMember>(
832 return parse_variant_value<JsonBaseParseTypes::String, JsonMember>(
846 return parse_variant_value<JsonBaseParseTypes::Number, JsonMember>(
849 if constexpr( ParseState::is_unchecked_input ) {
856 template<
typename Result,
typename TypeList, std::size_t pos = 0,
858 DAW_ATTRIB_INLINE
constexpr Result
861 using JsonMember = pack_element_t<pos, TypeList>;
862 if constexpr( std::is_same_v<json_result<JsonMember>, Result> ) {
863 return parse_value<JsonMember>(
866 return { parse_value<JsonMember>(
870 if constexpr( pos + 1 < pack_size_v<TypeList> ) {
871 return parse_visit<Result, TypeList, pos + 1>( idx,
parse_state );
873 if constexpr( ParseState::is_unchecked_input ) {
882 template<
typename JsonMember,
typename ParseState>
884 using tag_member =
typename JsonMember::tag_member;
885 using class_wrapper_t =
typename JsonMember::tag_member_class_wrapper;
887 using switcher_t =
typename JsonMember::switcher;
891 if constexpr( is_an_ordered_member_v<tag_member> ) {
895 return switcher_t{ }( std::get<0>( parse_value<class_wrapper_t>(
902 parse_value<class_wrapper_t>(
908 template<
typename JsonMember,
bool ,
typename ParseState>
910 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
913 auto const index = find_index<JsonMember>(
parse_state );
914 return parse_visit<json_result<JsonMember>,
915 typename JsonMember::json_elements::element_map_t>(
919 template<
typename JsonMember,
bool ,
typename ParseState>
921 maybe_unused]] DAW_ATTRIB_INLINE
inline constexpr json_result<JsonMember>
924 auto const index = [&] {
925 using tag_submember =
typename JsonMember::tag_submember;
926 using class_wrapper_t =
927 typename JsonMember::tag_submember_class_wrapper;
929 using switcher_t =
typename JsonMember::switcher;
930 if constexpr( is_an_ordered_member_v<tag_submember> ) {
931 return switcher_t{ }( std::get<0>( parse_value<class_wrapper_t>(
935 parse_value<class_wrapper_t>(
941 return parse_visit<json_result<JsonMember>,
942 typename JsonMember::json_elements::element_map_t>(
946 template<
typename JsonMember,
bool KnownBounds, std::size_t N,
947 typename ParseState,
bool B>
948 [[nodiscard]]
constexpr json_result<JsonMember>
952 auto [is_found, parse_state2] = find_range<ParseState>(
958 auto index =
typename JsonMember::switcher{ }( parse_value<tag_member>(
961 return parse_visit<json_result<JsonMember>,
962 typename JsonMember::json_elements::element_map_t>(
967 typename OldClassPos>
974#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
975 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
988 if( std::uncaught_exceptions( ) == 0 ) {
1000#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
1006 namespace pocm_details {
1014 template<
bool Nullable,
typename ParseState>
1015 DAW_ATTRIB_INLINE
inline constexpr void
1017 std::size_t ¤t_position,
1018 std::size_t desired_position ) {
1021 ErrorReason::OutOfOrderOrderedMembers,
1023 using skip_check_end =
1024 std::bool_constant<( ParseState::is_unchecked_input and
Nullable )>;
1025 while( ( current_position < desired_position ) &
1026 ( skip_check_end::value or
parse_state.front( ) !=
']' ) ) {
1031 ErrorReason::UnexpectedEndOfData,
1036#if defined( _MSC_VER ) and not defined( __clang__ )
1037 template<
typename ParseState>
1038 struct position_info {
1040 ParseState state{ };
1042 constexpr explicit operator bool( )
const {
1043 return not state.is_null( );
1054 template<
bool Nullable,
typename ParseState, std::
size_t N>
1056 ParseState &
parse_state, std::size_t ¤t_position,
1057 std::size_t desired_position,
1058 std::array<position_info<ParseState>, N> &parse_locations ) {
1060 auto const desired = daw::algorithm::find_if(
1061 std::data( parse_locations ), daw::data_end( parse_locations ),
1062 [desired_position]( position_info<ParseState>
const &loc ) {
1063 return loc.index == desired_position;
1066 return desired->state;
1068#if not defined( NDEBUG )
1072 using skip_check_end =
1073 std::bool_constant<( ParseState::is_unchecked_input and
Nullable )>;
1074 while( ( current_position < desired_position ) &
1075 ( skip_check_end::value or
parse_state.front( ) !=
']' ) ) {
1076 auto const current = daw::algorithm::find_if(
1077 std::data( parse_locations ), daw::data_end( parse_locations ),
1078 [current_position]( position_info<ParseState>
const &loc ) {
1079 return loc.index == current_position;
1082 if( current != daw::data_end( parse_locations ) ) {
1083 current->state = state;
1088 ErrorReason::UnexpectedEndOfData,
1096 template<
typename JsonMember,
bool KnownBounds,
typename ParseState,
1098 DAW_ATTRIB_INLINE
constexpr json_result<JsonMember>
1108 using tuple_t =
typename JsonMember::base_type;
1109 using tuple_members =
typename JsonMember::sub_member_list;
1111#if defined( _MSC_VER ) and not defined( __clang__ )
1112 using position_info_t = pocm_details::position_info<ParseState>;
1113 std::size_t parse_locations_last_index = 0U;
1114 std::array<position_info_t,
sizeof...( Is )> parse_locations{
1115 [&](
auto Index )
mutable -> position_info_t {
1116 constexpr std::size_t index =
decltype( Index )::value;
1117 using member_t = std::tuple_element_t<index, tuple_members>;
1118 if constexpr( is_an_ordered_member_v<member_t> ) {
1119 parse_locations_last_index = member_t::member_index;
1120 return { member_t::member_index };
1122 return { parse_locations_last_index++ };
1124 }( daw::constant<Is>{ } )... };
1126 auto const parse_value_help = [&](
auto PackIdx,
1127 std::size_t &ClassIdx ) {
1128 using index_t =
decltype( PackIdx );
1129 using CurrentMember =
1130 std::tuple_element_t<index_t::value, tuple_members>;
1133#if defined( _MSC_VER ) and not defined( __clang__ )
1134 ParseState parse_state2 =
1135 pocm_details::maybe_skip_members<is_json_nullable_v<json_member_t>>(
1136 parse_state, ClassIdx, index_t::value, parse_locations );
1137 if constexpr(
sizeof...( Is ) > 1 ) {
1142 auto const run_after_parse = daw::on_exit_success(
1143 [&] {
parse_state.move_next_member_or_end( ); } );
1144 (void)run_after_parse;
1145 return parse_value<without_name<json_member_t>>(
1148 auto result = parse_value<without_name<json_member_t>>(
1155 return parse_value<without_name<json_member_t>,
true>(
1160 if constexpr( is_an_ordered_member_v<CurrentMember> ) {
1162 is_json_nullable_v<json_member_t>>(
1163 parse_state, ClassIdx, CurrentMember::member_index );
1166 ErrorReason::UnexpectedEndOfData,
1170 if constexpr( use_direct_construction_v<ParseState, JsonMember> ) {
1171 auto const run_after_parse = daw::on_exit_success(
1172 [&] {
parse_state.move_next_member_or_end( ); } );
1173 (void)run_after_parse;
1174 return parse_value<without_name<json_member_t>>(
1177 auto result = parse_value<without_name<json_member_t>>(
1182#if defined( _MSC_VER ) and not defined( __clang__ )
1188 using Constructor =
typename JsonMember::constructor_t;
1192 std::size_t class_idx = 0;
1193 if constexpr( use_direct_construction_v<ParseState, JsonMember> ) {
1195 json_details::all_json_members_must_exist_v<JsonMember, ParseState>,
1198 (void)run_after_parse;
1199 if constexpr( force_aggregate_construction_v<JsonMember> ) {
1201 parse_value_help( daw::constant<Is>{ }, class_idx )... };
1203 return construct_value_tp<tuple_t, Constructor>(
1204 parse_state, fwd_pack{ parse_value_help( daw::constant<Is>{ },
1209 if constexpr( force_aggregate_construction_v<JsonMember> ) {
1211 parse_value_help( daw::constant<Is>{ }, class_idx )... };
1213 return construct_value_tp<tuple_t, Constructor>(
1214 parse_state, fwd_pack{ parse_value_help( daw::constant<Is>{ },
1219 tuple_t, ParseState> ) {
1233 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
1234 DAW_ATTRIB_FLATTEN
constexpr json_result<JsonMember>
1236 using element_pack =
1237 typename JsonMember::sub_member_list;
1239 return parse_tuple_value<JsonMember, KnownBounds>(
1241 std::make_index_sequence<std::tuple_size_v<element_pack>>{ } );
1244 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
1245 DAW_ATTRIB_INLINE
constexpr json_result<JsonMember>
1248 using constructor_t =
typename JsonMember::constructor_t;
1249 if constexpr( KnownBounds ) {
1257 std::data( value_parse_state ), std::size( value_parse_state ) );
1261 template<std::size_t N,
typename JsonClass,
bool KnownBounds,
1262 typename... JsonClasses,
typename ParseState>
1263 DAW_ATTRIB_INLINE
constexpr json_result<JsonClass>
1266 DAW_ASSUME( idx <
sizeof...( JsonClasses ) );
1267 using T =
typename JsonClass::base_type;
1268 using Constructor =
typename JsonClass::constructor_t;
1269 if constexpr(
sizeof...( JsonClasses ) >= N + 8 ) {
1272 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1275 parse_value<cur_json_class_t>(
1280 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1283 parse_value<cur_json_class_t>(
1288 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1291 parse_value<cur_json_class_t>(
1296 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1299 parse_value<cur_json_class_t>(
1304 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1307 parse_value<cur_json_class_t>(
1312 using cur_json_class_t = traits::nth_element<N + 5, JsonClasses...>;
1315 parse_value<cur_json_class_t>(
1320 using cur_json_class_t = traits::nth_element<N + 6, JsonClasses...>;
1323 parse_value<cur_json_class_t>(
1328 using cur_json_class_t = traits::nth_element<N + 7, JsonClasses...>;
1331 parse_value<cur_json_class_t>(
1336 if constexpr(
sizeof...( JsonClasses ) >= N + 8 ) {
1343 }
else if constexpr(
sizeof...( JsonClasses ) == N + 7 ) {
1346 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1349 parse_value<cur_json_class_t>(
1354 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1357 parse_value<cur_json_class_t>(
1362 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1365 parse_value<cur_json_class_t>(
1370 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1373 parse_value<cur_json_class_t>(
1378 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1381 parse_value<cur_json_class_t>(
1386 using cur_json_class_t = traits::nth_element<N + 5, JsonClasses...>;
1389 parse_value<cur_json_class_t>(
1394 DAW_ASSUME( idx == N + 6 );
1395 using cur_json_class_t = traits::nth_element<N + 6, JsonClasses...>;
1398 parse_value<cur_json_class_t>(
1403 }
else if constexpr(
sizeof...( JsonClasses ) == N + 6 ) {
1406 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1409 parse_value<cur_json_class_t>(
1414 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1417 parse_value<cur_json_class_t>(
1422 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1425 parse_value<cur_json_class_t>(
1430 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1433 parse_value<cur_json_class_t>(
1438 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1441 parse_value<cur_json_class_t>(
1446 DAW_ASSUME( idx == N + 5 );
1447 using cur_json_class_t = traits::nth_element<N + 5, JsonClasses...>;
1450 parse_value<cur_json_class_t>(
1455 }
else if constexpr(
sizeof...( JsonClasses ) == N + 5 ) {
1458 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1461 parse_value<cur_json_class_t>(
1466 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1469 parse_value<cur_json_class_t>(
1474 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1477 parse_value<cur_json_class_t>(
1482 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1485 parse_value<cur_json_class_t>(
1490 DAW_ASSUME( idx == N + 4 );
1491 using cur_json_class_t = traits::nth_element<N + 4, JsonClasses...>;
1494 parse_value<cur_json_class_t>(
1499 }
else if constexpr(
sizeof...( JsonClasses ) == N + 4 ) {
1502 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1505 parse_value<cur_json_class_t>(
1510 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1513 parse_value<cur_json_class_t>(
1518 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1521 parse_value<cur_json_class_t>(
1526 DAW_ASSUME( idx == N + 3 );
1527 using cur_json_class_t = traits::nth_element<N + 3, JsonClasses...>;
1530 parse_value<cur_json_class_t>(
1535 }
else if constexpr(
sizeof...( JsonClasses ) == N + 3 ) {
1538 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1541 parse_value<cur_json_class_t>(
1546 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1549 parse_value<cur_json_class_t>(
1554 DAW_ASSUME( idx == N + 2 );
1555 using cur_json_class_t = traits::nth_element<N + 2, JsonClasses...>;
1558 parse_value<cur_json_class_t>(
1563 }
else if constexpr(
sizeof...( JsonClasses ) == N + 2 ) {
1565 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1568 parse_value<cur_json_class_t>(
1572 using cur_json_class_t = traits::nth_element<N + 1, JsonClasses...>;
1575 parse_value<cur_json_class_t>(
1579 using cur_json_class_t = traits::nth_element<N + 0, JsonClasses...>;
1582 parse_value<cur_json_class_t>(
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:190
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:179
OldClassPos const & old_class_pos
Definition: daw_json_parse_class.h:183
#define CPP20CONSTEXPR
Definition: daw_json_parse_value.h:40
ParseState & parse_state
Definition: daw_json_parse_value.h:600
constexpr DAW_ATTRIB_INLINE void maybe_skip_members(ParseState &parse_state, std::size_t ¤t_position, std::size_t desired_position)
Definition: daw_json_parse_value.h:1016
constexpr auto parse_string_known_stdstring(ParseState &parse_state)
Definition: daw_json_parse_std_string.h:197
constexpr ParseState skip_value(ParseState &parse_state)
Definition: daw_json_skip.h:304
constexpr DAW_ATTRIB_INLINE json_result< JsonMember > parse_value(ParseState &parse_state, ParseTag< JsonParseTypes::Real >)
Definition: daw_json_parse_value.h:75
constexpr bool has_json_member_constructor_v
Definition: daw_json_parse_value.h:482
constexpr DAW_ATTRIB_INLINE Result parse_visit(std::size_t idx, ParseState &parse_state)
Definition: daw_json_parse_value.h:859
constexpr ParseState skip_literal(ParseState &parse_state)
Definition: daw_json_skip.h:393
std::bool_constant< daw::is_detected_v< json_type_t, T > > is_a_json_type
Definition: daw_json_traits.h:446
typename daw::detected_or_t< T, ordered_member_subtype_test, T > ordered_member_subtype_t
Definition: daw_json_parse_common.h:51
constexpr bool all_json_members_must_exist_v
Definition: daw_json_traits.h:641
constexpr DAW_ATTRIB_INLINE json_result< JsonClass > parse_nth_class(std::size_t idx, ParseState &parse_state)
Definition: daw_json_parse_value.h:1264
typename JsonMember::dependent_member dependent_member_t
Definition: daw_json_parse_common.h:995
typename T::parse_to_t json_member_parse_to_t
Definition: daw_json_parse_value.h:479
constexpr DAW_ATTRIB_INLINE json_result< JsonMember > parse_tuple_value(ParseState &parse_state, std::index_sequence< Is... >)
Definition: daw_json_parse_value.h:1099
constexpr DAW_ATTRIB_FLATTEN json_result< JsonMembers > parse_variant_value(ParseState &parse_state)
Definition: daw_json_parse_value.h:795
constexpr DAW_ATTRIB_FLATINLINE ParseState skip_string(ParseState &parse_state)
Definition: daw_json_skip.h:56
AllMembersMustExist
Definition: daw_json_location_info.h:206
typename JsonMember::switcher switcher_t
Definition: daw_json_traits.h:159
typename T::constructor_t json_member_constructor_t
Definition: daw_json_parse_value.h:476
constexpr auto find_index(ParseState parse_state)
Definition: daw_json_parse_value.h:883
static constexpr DAW_ATTRIB_FLATINLINE auto construct_value(template_params< Value, Constructor >, ParseState &parse_state, Args &&...args)
Definition: daw_json_parse_common.h:60
typename JsonMember::parse_to_t json_result
Definition: daw_json_parse_common.h:200
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:57
constexpr bool use_direct_construction_v
Definition: daw_json_parse_common.h:959
constexpr Signed to_signed(Unsigned &&u, Signed sign)
Definition: daw_json_parse_unsigned_int.h:38
constexpr bool has_json_member_parse_to_v
Definition: daw_json_parse_value.h:486
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:107
@ KeyValueArray
Class - Member names form the string key into a key/value,map, or dictionary like type.
daw::constant< v > ParseTag
Definition: daw_json_enums.h:119
typename json_data_contract< T >::type json_data_contract_trait_t
Definition: daw_json_traits.h:135
DAW_ATTRIB_NOINLINE void daw_json_error(ErrorReason reason)
Definition: daw_json_assert.h:39
JsonBaseParseTypes
The fundamental JSON types.
Definition: daw_json_enums.h:53
Definition: daw_from_json.h:22
Definition: daw_json_parse_value.h:473
Definition: daw_json_parse_array_iterator.h:64
Definition: daw_json_parse_kv_array_iterator.h:60
Definition: daw_json_parse_kv_class_iterator.h:65
Definition: daw_json_parse_value.h:968
ParseState & parse_state
Definition: daw_json_parse_value.h:969
OldClassPos const & old_class_pos
Definition: daw_json_parse_value.h:970
DAW_ATTRIB_INLINE CPP20CONSTEXPR ~ordered_class_cleanup() noexcept(false)
Definition: daw_json_parse_value.h:973
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16