45 namespace json_details {
55 template<options::LiteralAsStringOpt literal_as_string,
57 DAW_ATTRIB_INLINE
constexpr void
58 skip_quote_when_literal_as_string( ParseState &parse_state ) {
59 if constexpr( literal_as_string ==
60 options::LiteralAsStringOpt::Always ) {
62 ErrorReason::InvalidNumberUnexpectedQuoting,
64 parse_state.remove_prefix( );
65 }
else if constexpr( literal_as_string ==
66 options::LiteralAsStringOpt::Maybe ) {
68 ErrorReason::UnexpectedEndOfData,
70 if( parse_state.front( ) ==
'"' ) {
71 parse_state.remove_prefix( );
76 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
77 [[nodiscard]]
constexpr json_result_t<JsonMember>
78 parse_value_real( ParseState &parse_state ) {
79 using constructor_t = json_constructor_t<JsonMember>;
80 using element_t = json_base_type_t<JsonMember>;
82 if constexpr( JsonMember::literal_as_string !=
83 options::LiteralAsStringOpt::Never ) {
84 if constexpr( not KnownBounds ) {
85 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
88 if constexpr( JsonMember::allow_number_errors ==
89 options::JsonNumberErrors::AllowInf or
90 JsonMember::allow_number_errors ==
91 options::JsonNumberErrors::AllowNanInf ) {
92 element_t sign = element_t( 1.0 );
93 if( parse_state.front( ) ==
'-' ) {
94 sign = element_t( -1.0 );
98 if( parse_state.starts_with_skip(
"Inf" ) ) {
99 if( not( parse_state.starts_with_skip(
"\"" ) or
100 parse_state.starts_with_skip(
"inity\"" ) ) ) {
103 if constexpr( KnownBounds ) {
105 ErrorReason::InvalidNumber,
109 parse_policy_details::at_end_of_item(
110 parse_state.front( ) ),
111 ErrorReason::InvalidEndOfValue,
114 return daw::cxmath::copy_sign(
115 daw::numeric_limits<element_t>::infinity( ), sign );
116 }
else if( sign < element_t( 0 ) ) {
120 if constexpr( JsonMember::allow_number_errors ==
121 options::JsonNumberErrors::AllowNaN or
122 JsonMember::allow_number_errors ==
123 options::JsonNumberErrors::AllowNanInf ) {
124 if( parse_state.starts_with(
"NaN" ) ) {
125 parse_state.template move_to_next_of<
'"'>( );
126 parse_state.remove_prefix( );
127 if constexpr( KnownBounds ) {
129 ErrorReason::InvalidNumber,
133 parse_policy_details::at_end_of_item(
134 parse_state.front( ) ),
135 ErrorReason::InvalidEndOfValue,
138 return daw::numeric_limits<element_t>::quiet_NaN( );
142 if constexpr( KnownBounds and JsonMember::literal_as_string ==
143 options::LiteralAsStringOpt::Never ) {
144 return construct_value<json_result_t<JsonMember>, constructor_t>(
145 parse_state, parse_real<element_t, true>( parse_state ) );
148 parse_state.has_more( ) and
149 parse_policy_details::is_number_start( parse_state.front( ) ),
150 ErrorReason::InvalidNumberStart,
154 construct_value<json_result_t<JsonMember>, constructor_t>(
155 parse_state, parse_real<element_t, false>( parse_state ) );
157 if constexpr( KnownBounds ) {
159 parse_state.empty( ) or
160 parse_policy_details::at_end_of_item( parse_state.front( ) ),
161 ErrorReason::InvalidEndOfValue,
164 if constexpr( JsonMember::literal_as_string !=
165 options::LiteralAsStringOpt::Never ) {
166 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
170 parse_state.empty( ) or
171 parse_policy_details::at_end_of_item( parse_state.front( ) ),
172 ErrorReason::InvalidEndOfValue,
179 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
180 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
181 parse_value_signed( ParseState &parse_state ) {
182 using constructor_t = json_constructor_t<JsonMember>;
183 using element_t = json_base_type_t<JsonMember>;
185 typename daw::conditional_t<std::is_enum_v<element_t>,
186 std::underlying_type<element_t>,
187 daw::traits::identity<element_t>>::type;
189 static_assert( daw::is_signed_v<int_type>,
"Expected signed type" );
190 if constexpr( KnownBounds ) {
192 parse_policy_details::is_number_start( parse_state.front( ) ),
193 ErrorReason::InvalidNumberStart,
196 if constexpr( JsonMember::literal_as_string !=
197 options::LiteralAsStringOpt::Never ) {
198 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
200 }
else if constexpr( not ParseState::is_zero_terminated_string ) {
202 ErrorReason::UnexpectedEndOfData,
206 auto const sign =
static_cast<int_type
>(
207 parse_policy_details::validate_signed_first( parse_state ) );
209 typename daw::conditional_t<daw::is_system_integral_v<int_type>,
210 daw::make_unsigned<int_type>,
211 daw::traits::identity<int_type>>::type;
212 auto parsed_val = to_signed(
213 unsigned_parser<uint_type, JsonMember::range_check, KnownBounds>(
217 if constexpr( KnownBounds ) {
218 return construct_value<json_result_t<JsonMember>, constructor_t>(
219 parse_state,
static_cast<element_t
>( parsed_val ) );
222 construct_value<json_result_t<JsonMember>, constructor_t>(
223 parse_state,
static_cast<element_t
>( parsed_val ) );
224 if constexpr( JsonMember::literal_as_string !=
225 options::LiteralAsStringOpt::Never ) {
226 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
229 parse_state.trim_left( );
231 not parse_state.has_more( ) or
232 parse_policy_details::at_end_of_item( parse_state.front( ) ),
233 ErrorReason::InvalidEndOfValue,
239 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
240 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
241 parse_value_unsigned( ParseState &parse_state ) {
242 using constructor_t = json_constructor_t<JsonMember>;
243 using element_t = json_base_type_t<JsonMember>;
245 typename daw::conditional_t<std::is_enum_v<element_t>,
246 std::underlying_type<element_t>,
247 daw::traits::identity<element_t>>::type;
249 if constexpr( KnownBounds ) {
250 parse_policy_details::validate_unsigned_first( parse_state );
252 return construct_value<json_result_t<JsonMember>, constructor_t>(
254 unsigned_parser<uint_type, JsonMember::range_check, KnownBounds>(
257 if constexpr( JsonMember::literal_as_string !=
258 options::LiteralAsStringOpt::Never ) {
259 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
261 if constexpr( not ParseState::is_zero_terminated_string ) {
263 ErrorReason::UnexpectedEndOfData,
266 }
else if constexpr( not ParseState::is_zero_terminated_string ) {
268 ErrorReason::UnexpectedEndOfData,
272 parse_policy_details::is_number( parse_state.front( ) ),
273 ErrorReason::InvalidNumber,
276 construct_value<json_result_t<JsonMember>, constructor_t>(
278 unsigned_parser<uint_type, JsonMember::range_check, KnownBounds>(
280 if constexpr( JsonMember::literal_as_string !=
281 options::LiteralAsStringOpt::Never ) {
282 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
284 if constexpr( not ParseState::is_zero_terminated_string ) {
286 ErrorReason::UnexpectedEndOfData,
291 not parse_state.has_more( ) or
292 parse_policy_details::at_end_of_item( parse_state.front( ) ),
293 ErrorReason::InvalidEndOfValue,
299 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
300 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
301 parse_value_null( ParseState &parse_state ) {
303 using constructor_t = json_constructor_t<JsonMember>;
304 auto const construct_empty = [&] {
305 if constexpr( daw::is_callable_v<
307 concepts::construct_nullable_with_empty_t> ) {
308 return construct_value<
typename JsonMember::wrapped_type,
310 parse_state, concepts::construct_nullable_with_empty );
312 return construct_value<
typename JsonMember::wrapped_type,
313 constructor_t>( parse_state );
317 using base_member_type =
typename JsonMember::member_type;
318 static_assert( not std::is_same_v<base_member_type, JsonMember> );
319 if constexpr( KnownBounds ) {
321 if( parse_state.is_null( ) ) {
322 return construct_empty( );
324 return construct_value<base_member_type, constructor_t>(
326 parse_value<base_member_type,
328 base_member_type::expected_type>( parse_state ) );
329 }
else if constexpr( ParseState::is_unchecked_input ) {
330 if( not parse_state.has_more( ) or
331 parse_state.is_at_token_after_value( ) ) {
332 return construct_empty( );
334 if( parse_state.front( ) ==
'n' ) {
335 parse_state.remove_prefix( 4 );
336 parse_state.trim_left_unchecked( );
337 parse_state.remove_prefix( );
338 return construct_empty( );
340 return construct_value<base_member_type, constructor_t>(
342 parse_value<base_member_type,
344 base_member_type::expected_type>( parse_state ) );
346 if( not parse_state.has_more( ) or
347 parse_state.is_at_token_after_value( ) ) {
348 return construct_empty( );
350 if( parse_state.starts_with(
"null" ) ) {
351 parse_state.remove_prefix( 4 );
353 not parse_state.has_more( ) or
354 parse_policy_details::at_end_of_item( parse_state.front( ) ),
355 ErrorReason::InvalidLiteral,
357 parse_state.trim_left_checked( );
358 return construct_empty( );
360 using parse_to_t = json_result_t<base_member_type>;
361 if constexpr( not std::is_move_constructible_v<parse_to_t> and
362 not std::is_copy_constructible_v<parse_to_t> ) {
365 concepts::nullable_value_traits<json_result_t<JsonMember>>,
366 concepts::construct_nullable_with_pointer_t,
368 return construct_value<base_member_type, constructor_t>(
370 concepts::construct_nullable_with_pointer,
372 parse_value<base_member_type,
374 base_member_type::expected_type>( parse_state ) } );
376 return construct_value<base_member_type, constructor_t>(
378 parse_value<base_member_type,
380 base_member_type::expected_type>( parse_state ) );
385 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
386 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
387 parse_value_bool( ParseState &parse_state ) {
388 using constructor_t = json_constructor_t<JsonMember>;
390 if constexpr( KnownBounds ) {
392 if constexpr( ParseState::is_unchecked_input ) {
393 return static_cast<bool>( parse_state.counter );
395 switch( parse_state.front( ) ) {
397 return construct_value<json_result_t<JsonMember>, constructor_t>(
400 return construct_value<json_result_t<JsonMember>, constructor_t>(
401 parse_state, false );
407 if constexpr( JsonMember::literal_as_string !=
408 options::LiteralAsStringOpt::Never ) {
409 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
413 if constexpr( ParseState::is_unchecked_input ) {
414 if( parse_state.front( ) ==
't' ) {
416 parse_state.remove_prefix( 4 );
418 parse_state.remove_prefix( 5 );
421 if( parse_state.starts_with(
"true" ) ) {
422 parse_state.remove_prefix( 4 );
424 }
else if( parse_state.starts_with(
"false" ) ) {
425 parse_state.remove_prefix( 5 );
431 if constexpr( JsonMember::literal_as_string !=
432 options::LiteralAsStringOpt::Never ) {
433 skip_quote_when_literal_as_string<JsonMember::literal_as_string>(
436 parse_state.trim_left( );
438 not parse_state.has_more( ) or
439 parse_policy_details::at_end_of_item( parse_state.front( ) ),
440 ErrorReason::InvalidEndOfValue,
442 return construct_value<json_result_t<JsonMember>, constructor_t>(
443 parse_state, result );
447 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
448 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
449 parse_value_string_raw( ParseState &parse_state ) {
451 using constructor_t = json_constructor_t<JsonMember>;
452 if constexpr( KnownBounds ) {
453 return construct_value<json_result_t<JsonMember>, constructor_t>(
454 parse_state, std::data( parse_state ), std::size( parse_state ) );
456 if constexpr( JsonMember::allow_escape_character ==
457 options::AllowEscapeCharacter::Allow ) {
458 auto const str = skip_string( parse_state );
459 return construct_value<json_result_t<JsonMember>, constructor_t>(
460 parse_state, std::data( str ), std::size( str ) );
462 parse_state.remove_prefix( );
464 char const *
const first = parse_state.first;
465 parse_state.template move_to_next_of<
'"'>( );
466 char const *
const last = parse_state.first;
467 parse_state.remove_prefix( );
468 return construct_value<json_result_t<JsonMember>, constructor_t>(
469 parse_state, first,
static_cast<std::size_t
>( last - first ) );
480 template<
typename JsonMember>
481 DAW_CPP20_CONCEPT can_parse_to_stdstring_fast_v =
482 can_single_allocation_string_v<json_result_t<JsonMember>> or
483 can_single_allocation_string_v<json_base_type_t<JsonMember>>;
486 json_constructor_t<T> );
491 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
492 [[nodiscard]] DAW_ATTRIB_INLINE
constexpr json_result_t<JsonMember>
493 parse_value_string_escaped( ParseState &parse_state ) {
494 static_assert( has_json_member_constructor_v<JsonMember> );
495 static_assert( has_json_member_parse_to_v<JsonMember> );
496 if constexpr( not KnownBounds ) {
498 ErrorReason::UnexpectedNull );
500 using constructor_t = json_constructor_t<JsonMember>;
501 if constexpr( can_parse_to_stdstring_fast_v<JsonMember> ) {
502 using AllowHighEightbits =
503 std::bool_constant<JsonMember::eight_bit_mode !=
504 options::EightBitModes::DisallowHigh>;
506 KnownBounds ? parse_state : skip_string( parse_state );
507 if( not AllowHighEightbits::value or
508 needs_slow_path( parse_state2 ) ) {
510 return parse_string_known_stdstring<AllowHighEightbits::value,
512 true>( parse_state2 );
516 return construct_value<json_result_t<JsonMember>, constructor_t>(
518 std::data( parse_state2 ),
519 daw::data_end( parse_state2 ) );
522 KnownBounds ? parse_state : skip_string( parse_state );
523 using AllowHighEightbits =
524 std::bool_constant<JsonMember::eight_bit_mode !=
525 options::EightBitModes::DisallowHigh>;
526 if( not AllowHighEightbits::value or
527 needs_slow_path( parse_state2 ) ) {
529 return parse_string_known_stdstring<AllowHighEightbits::value,
531 true>( parse_state2 );
535 return construct_value<json_result_t<JsonMember>, constructor_t>(
537 std::data( parse_state2 ),
538 daw::data_end( parse_state2 ) );
542 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
543 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
544 parse_value_date( ParseState &parse_state ) {
547 ErrorReason::UnexpectedEndOfData,
549 auto str = KnownBounds ? parse_state : skip_string( parse_state );
550 using constructor_t = json_constructor_t<JsonMember>;
551 return construct_value<json_result_t<JsonMember>, constructor_t>(
552 parse_state, std::data( str ), std::size( str ) );
555 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
556 [[nodiscard]]
static constexpr json_result_t<JsonMember>
557 parse_value_custom( ParseState &parse_state ) {
559 auto const str = [&] {
560 if constexpr( JsonMember::custom_json_type ==
561 options::JsonCustomTypes::String ) {
562 if constexpr( KnownBounds ) {
565 return skip_string( parse_state );
567 }
else if constexpr( JsonMember::custom_json_type ==
568 options::JsonCustomTypes::Literal ) {
569 return KnownBounds ? parse_state : skip_literal( parse_state );
571 static_assert( JsonMember::custom_json_type ==
572 options::JsonCustomTypes::Any );
576 if constexpr( KnownBounds ) {
577 auto result = parse_state;
578 if( *( result.first - 1 ) ==
'"' ) {
583 if( parse_state.front( ) ==
'"' ) {
584 auto result = skip_string( parse_state );
588 return skip_value( parse_state );
593 str.has_more( ) and not( str.front( ) ==
'[' or str.front( ) ==
'{' ),
594 ErrorReason::InvalidStartOfValue,
596 using constructor_t =
typename JsonMember::from_converter_t;
597 return construct_value<json_result_t<JsonMember>, constructor_t>(
598 parse_state, std::string_view( std::data( str ), std::size( str ) ) );
601 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
602 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
603 parse_value_class( ParseState &parse_state ) {
605 using element_t =
typename JsonMember::wrapped_type;
607 ErrorReason::UnexpectedEndOfData,
610 if constexpr( KnownBounds ) {
612 template parse_to_class<JsonMember, KnownBounds>( parse_state );
613 }
else if constexpr( is_pinned_type_v<element_t> ) {
614 auto const run_after_parse = daw::on_exit_success( [&] {
615 parse_state.trim_left_checked( );
617 (void)run_after_parse;
619 template parse_to_class<JsonMember, KnownBounds>( parse_state );
620 }
else if constexpr( is_deduced_empty_class_v<JsonMember> ) {
621 parse_state.trim_left_checked( );
622 return json_result_t<JsonMember>{ };
625 template parse_to_class<JsonMember, KnownBounds>( parse_state );
626 parse_state.trim_left_checked( );
639 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
640 [[nodiscard]]
static constexpr json_result_t<JsonMember>
641 parse_value_keyvalue( ParseState &parse_state ) {
643 static_assert( JsonMember::expected_type == JsonParseTypes::KeyValue,
644 "Expected a json_key_value" );
646 ErrorReason::ExpectedKeyValueToStartWithBrace,
649 parse_state.remove_prefix( );
650 parse_state.trim_left( );
653 json_parse_kv_class_iterator<JsonMember,
655 can_be_random_iterator_v<KnownBounds>>;
657 using constructor_t = json_constructor_t<JsonMember>;
658 return construct_value<json_result_t<JsonMember>, constructor_t>(
659 parse_state, iter_t( parse_state ), iter_t( ) );
670 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
671 [[nodiscard]]
static constexpr json_result_t<JsonMember>
672 parse_value_keyvalue_array( ParseState &parse_state ) {
674 static_assert( JsonMember::expected_type ==
675 JsonParseTypes::KeyValueArray,
676 "Expected a json_key_value" );
678 parse_state.is_opening_bracket_checked( ),
679 ErrorReason::ExpectedKeyValueArrayToStartWithBracket,
682 parse_state.remove_prefix( );
685 json_parse_kv_array_iterator<JsonMember,
687 can_be_random_iterator_v<KnownBounds>>;
688 using constructor_t = json_constructor_t<JsonMember>;
689 return construct_value<json_result_t<JsonMember>, constructor_t>(
690 parse_state, iter_t( parse_state ), iter_t( ) );
693 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
694 [[nodiscard]]
static constexpr json_result_t<JsonMember>
695 parse_value_array( ParseState &parse_state ) {
696 parse_state.trim_left( );
698 ErrorReason::InvalidArrayStart,
700 parse_state.remove_prefix( );
701 parse_state.trim_left_unchecked( );
706 json_parse_array_iterator<JsonMember,
708 can_be_random_iterator_v<KnownBounds>>;
709 using constructor_t = json_constructor_t<JsonMember>;
710 return construct_value<json_result_t<JsonMember>, constructor_t>(
711 parse_state, iterator_t( parse_state ), iterator_t( ) );
714 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
715 [[nodiscard]]
static constexpr json_result_t<JsonMember>
716 parse_value_sz_array( ParseState &parse_state ) {
718 using size_member = dependent_member_t<JsonMember>;
720 auto [parse_state2, is_found] = find_range<ParseState>(
721 ParseState( parse_state.class_first, parse_state.last ),
725 is_found, ErrorReason::TagMemberNotFound, parse_state );
727 parse_value<size_member, false, size_member::expected_type>(
730 if constexpr( KnownBounds and ParseState::is_unchecked_input ) {
733 auto cnt =
static_cast<std::ptrdiff_t
>( parse_state.counter );
735 ErrorReason::NumberOutOfRange,
738 parse_state.trim_left( );
740 ErrorReason::InvalidArrayStart,
742 parse_state.remove_prefix( );
743 parse_state.trim_left_unchecked( );
747 json_parse_array_iterator<JsonMember, ParseState, false>;
748 using constructor_t = json_constructor_t<JsonMember>;
749 return construct_value<json_result_t<JsonMember>, constructor_t>(
751 iterator_t( parse_state ),
753 static_cast<std::size_t
>( sz ) );
758 [[nodiscard]]
constexpr json_result_t<JsonMembers>
759 parse_variant_value( ParseState &parse_state ) {
760 using element_t =
typename JsonMembers::json_elements;
761 using idx = daw::constant<( JsonMembers::base_map::base_map
762 [
static_cast<std::int_fast8_t
>( BPT )] )>;
764 if constexpr( idx::value <
765 pack_size_v<typename element_t::element_map_t> ) {
767 pack_element_t<idx::value, typename element_t::element_map_t>;
768 return parse_value<JsonMember,
770 JsonMember::expected_type>( parse_state );
776 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
777 [[nodiscard]]
static constexpr json_result_t<JsonMember>
778 parse_value_variant( ParseState &parse_state ) {
779 if constexpr( KnownBounds ) {
782 if( *( parse_state.first - 1 ) ==
'"' ) {
784 return parse_variant_value<JsonBaseParseTypes::String,
786 KnownBounds>( parse_state );
789 switch( parse_state.front( ) ) {
791 return parse_variant_value<JsonBaseParseTypes::Class,
793 KnownBounds>( parse_state );
795 return parse_variant_value<JsonBaseParseTypes::Array,
797 KnownBounds>( parse_state );
800 return parse_variant_value<JsonBaseParseTypes::Bool,
802 KnownBounds>( parse_state );
804 return parse_variant_value<JsonBaseParseTypes::String,
806 KnownBounds>( parse_state );
819 return parse_variant_value<JsonBaseParseTypes::Number,
821 KnownBounds>( parse_state );
823 if constexpr( ParseState::is_unchecked_input ) {
830 template<
typename Result,
typename TypeList, std::size_t pos = 0,
832 DAW_ATTRIB_INLINE
constexpr Result
833 parse_visit( std::size_t idx, ParseState &parse_state ) {
835 using JsonMember = pack_element_t<pos, TypeList>;
836 if constexpr( std::is_same_v<json_result_t<JsonMember>, Result> ) {
837 return parse_value<JsonMember, false, JsonMember::expected_type>(
841 parse_value<JsonMember, false, JsonMember::expected_type>(
845 if constexpr( pos + 1 < pack_size_v<TypeList> ) {
846 return parse_visit<Result, TypeList, pos + 1>( idx, parse_state );
848 if constexpr( ParseState::is_unchecked_input ) {
857 template<
typename JsonMember,
typename ParseState>
858 [[nodiscard]]
constexpr auto find_index( ParseState
const &parse_state ) {
859 using tag_member =
typename JsonMember::tag_member;
860 using class_wrapper_t =
typename JsonMember::tag_member_class_wrapper;
862 using switcher_t =
typename JsonMember::switcher;
863 auto parse_state2 = ParseState( parse_state.class_first,
864 parse_state.class_last,
865 parse_state.class_first,
866 parse_state.class_last );
867 if constexpr( is_an_ordered_member_v<tag_member> ) {
870 ErrorReason::InvalidArrayStart,
872 return switcher_t{ }( std::get<0>(
873 parse_value<class_wrapper_t, false, class_wrapper_t::expected_type>(
878 ErrorReason::InvalidClassStart,
880 return switcher_t{ }( std::get<0>(
881 parse_value<class_wrapper_t, false, class_wrapper_t::expected_type>(
887 template<
typename JsonMember,
typename ParseState>
888 [[nodiscard]]
constexpr json_result_t<JsonMember>
889 parse_value_variant_tagged( ParseState &parse_state ) {
890 auto const index = find_index<JsonMember>( parse_state );
891 return parse_visit<json_result_t<JsonMember>,
892 typename JsonMember::json_elements::element_map_t>(
893 index, parse_state );
896 template<
typename JsonMember,
typename ParseState>
897 [[nodiscard]]
constexpr json_result_t<JsonMember>
898 parse_value_variant_intrusive( ParseState &parse_state ) {
899 auto const index = [&] {
900 using tag_submember =
typename JsonMember::tag_submember;
901 using class_wrapper_t =
902 typename JsonMember::tag_submember_class_wrapper;
903 auto parse_state2 = parse_state;
904 using switcher_t =
typename JsonMember::switcher;
905 if constexpr( is_an_ordered_member_v<tag_submember> ) {
906 return switcher_t{ }( std::get<0>(
907 parse_value<class_wrapper_t,
909 class_wrapper_t::expected_type>( parse_state2 ) ) );
911 return switcher_t{ }( std::get<0>(
912 parse_value<class_wrapper_t,
914 class_wrapper_t::expected_type>( parse_state2 )
919 return parse_visit<json_result_t<JsonMember>,
920 typename JsonMember::json_elements::element_map_t>(
921 index, parse_state );
924 template<
bool AllMembersMustExist,
typename ParseState,
925 typename OldClassPos>
926 DAW_ATTRIB_INLINE
constexpr void ordered_class_cleanup(
927 ParseState &parse_state,
930 if constexpr( AllMembersMustExist ) {
931 parse_state.trim_left( );
933 ErrorReason::UnknownMember,
935 parse_state.remove_prefix( );
936 parse_state.trim_left_checked( );
938 (void)parse_state.skip_array( );
940 parse_state.set_class_position( old_class_pos );
943 namespace pocm_details {
951 template<
bool Nullable,
typename ParseState>
952 constexpr void maybe_skip_members( ParseState &parse_state,
953 std::size_t ¤t_position,
954 std::size_t desired_position ) {
957 ErrorReason::OutOfOrderOrderedMembers,
959 using skip_check_end =
960 std::bool_constant<( ParseState::is_unchecked_input and Nullable )>;
961 while( ( current_position < desired_position ) &
962 ( skip_check_end::value or parse_state.front( ) !=
']' ) ) {
963 (void)skip_value( parse_state );
964 parse_state.move_next_member_or_end( );
967 ErrorReason::UnexpectedEndOfData,
972#if defined( DAW_JSON_BUGFIX_MSVC_EVAL_ORDER_002 )
973 template<
typename ParseState>
974 struct position_info {
978 constexpr explicit operator bool( )
const {
979 return not state.is_null( );
990 template<
bool Nullable,
typename ParseState, std::
size_t N>
991 DAW_ATTRIB_INLINE
static constexpr ParseState maybe_skip_members(
992 ParseState &parse_state, std::size_t ¤t_position,
993 std::size_t desired_position,
994 std::array<position_info<ParseState>, N> &parse_locations ) {
996 auto const desired = daw::algorithm::find_if(
997 std::data( parse_locations ),
998 daw::data_end( parse_locations ),
999 [desired_position]( position_info<ParseState>
const &loc ) {
1000 return loc.index == desired_position;
1003 return desired->state;
1005#if not defined( NDEBUG )
1007 ErrorReason::UnexpectedEndOfData,
1010 using skip_check_end =
1011 std::bool_constant<( ParseState::is_unchecked_input and Nullable )>;
1012 while( ( current_position < desired_position ) &
1013 ( skip_check_end::value or parse_state.front( ) !=
']' ) ) {
1014 auto const current = daw::algorithm::find_if(
1015 std::data( parse_locations ),
1016 daw::data_end( parse_locations ),
1017 [current_position]( position_info<ParseState>
const &loc ) {
1018 return loc.index == current_position;
1020 auto state = skip_value( parse_state );
1021 if( current != daw::data_end( parse_locations ) ) {
1022 current->state = state;
1024 parse_state.move_next_member_or_end( );
1027 ErrorReason::UnexpectedEndOfData,
1035 template<
typename T>
1036 struct member_index_t {
1037 static constexpr std::size_t value = T::member_index;
1040 template<
typename Idx,
typename JsonMember>
1041 inline constexpr std::size_t member_index_v =
1042 daw::conditional_t<has_member_index_v<JsonMember>,
1043 member_index_t<JsonMember>, Idx>::value;
1046 template<
typename JsonMember,
bool KnownBounds,
typename ParseState,
1048 DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
1049 parse_tuple_value( ParseState &parse_state, std::index_sequence<Is...> ) {
1050 parse_state.trim_left( );
1052 ErrorReason::InvalidArrayStart,
1055 auto const old_class_pos = parse_state.get_class_position( );
1056 parse_state.set_class_position( );
1057 parse_state.remove_prefix( );
1058 parse_state.move_next_member_or_end( );
1059 using tuple_t = json_base_type_t<JsonMember>;
1060 using tuple_members =
typename JsonMember::sub_member_list;
1062#if defined( DAW_JSON_BUGFIX_MSVC_EVAL_ORDER_002 )
1063 using position_info_t = pocm_details::position_info<ParseState>;
1064 std::size_t parse_locations_last_index = 0U;
1065 std::array<position_info_t,
sizeof...( Is )> parse_locations{
1066 [&](
auto Index )
mutable -> position_info_t {
1067 constexpr std::size_t index =
decltype( Index )::value;
1068 using member_t = std::tuple_element_t<index, tuple_members>;
1069 if constexpr( is_an_ordered_member_v<member_t> ) {
1070 parse_locations_last_index = member_t::member_index;
1071 return { member_t::member_index };
1073 return { parse_locations_last_index++ };
1075 }(daw::constant_v<Is>)... };
1077 auto const parse_value_help = [&](
auto PackIdx,
1078 std::size_t &ClassIdx ) {
1079 using index_t =
decltype( PackIdx );
1080 using CurrentMember =
1081 std::tuple_element_t<index_t::value, tuple_members>;
1083 using json_member_t = ordered_member_subtype_t<CurrentMember>;
1085#if defined( DAW_JSON_BUGFIX_MSVC_EVAL_ORDER_002 )
1086 ParseState parse_state2 =
1087 pocm_details::maybe_skip_members<is_json_nullable_v<json_member_t>>(
1090 pocm_details::member_index_v<index_t, CurrentMember>,
1092 if constexpr(
sizeof...( Is ) > 1 ) {
1094 if( parse_state2.first == parse_state.first ) {
1095 if constexpr( is_pinned_type_v<json_result_t<JsonMember>> ) {
1096 auto const run_after_parse = daw::on_exit_success( [&] {
1097 parse_state.move_next_member_or_end( );
1099 (void)run_after_parse;
1100 return parse_value<json_member_t,
1102 json_member_t::expected_type>( parse_state );
1105 parse_value<json_member_t,
1107 json_member_t::expected_type>( parse_state );
1108 parse_state.move_next_member_or_end( );
1113 return parse_value<json_member_t,
1115 json_member_t::expected_type>( parse_state2 );
1119 if constexpr( is_an_ordered_member_v<CurrentMember> ) {
1120 pocm_details::maybe_skip_members<
1121 is_json_nullable_v<json_member_t>>(
1122 parse_state, ClassIdx, CurrentMember::member_index );
1125 ErrorReason::UnexpectedEndOfData,
1129 if constexpr( is_pinned_type_v<json_result_t<JsonMember>> ) {
1130 auto const run_after_parse = daw::on_exit_success( [&] {
1131 parse_state.move_next_member_or_end( );
1133 (void)run_after_parse;
1134 return parse_value<json_member_t,
1136 json_member_t::expected_type>( parse_state );
1139 parse_value<json_member_t, false, json_member_t::expected_type>(
1141 parse_state.move_next_member_or_end( );
1144#if defined( DAW_JSON_BUGFIX_MSVC_EVAL_ORDER_002 )
1149 static_assert( is_a_json_type_v<JsonMember> );
1150 using Constructor = json_constructor_t<JsonMember>;
1152 parse_state.trim_left( );
1154 std::size_t class_idx = 0;
1155 if constexpr( is_pinned_type_v<json_result_t<JsonMember>> ) {
1156 auto const run_after_parse = daw::on_exit_success( [&] {
1157 ordered_class_cleanup<
1158 all_json_members_must_exist_v<JsonMember, ParseState>,
1160 decltype( old_class_pos )>( parse_state, old_class_pos );
1162 (void)run_after_parse;
1167 parse_value_help( daw::constant_v<Is>, class_idx )... };
1169 return construct_value_tp<tuple_t, Constructor>(
1172 parse_value_help( daw::constant_v<Is>, class_idx )... } );
1180 parse_value_help( daw::constant_v<Is>, class_idx )... };
1182 return construct_value_tp<tuple_t, Constructor>(
1185 parse_value_help( daw::constant_v<Is>, class_idx )... } );
1188 if constexpr( all_json_members_must_exist_v<tuple_t, ParseState> ) {
1189 parse_state.trim_left( );
1191 ErrorReason::UnknownMember,
1193 parse_state.remove_prefix( );
1194 parse_state.trim_left( );
1196 (void)parse_state.skip_array( );
1198 parse_state.set_class_position( old_class_pos );
1203 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
1204 static constexpr json_result_t<JsonMember>
1205 parse_value_tuple( ParseState &parse_state ) {
1206 using element_pack =
1207 typename JsonMember::sub_member_list;
1209 return parse_tuple_value<JsonMember, KnownBounds>(
1211 std::make_index_sequence<std::tuple_size_v<element_pack>>{ } );
1214 template<
typename JsonMember,
bool KnownBounds,
typename ParseState>
1215 DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
1216 parse_value_unknown( ParseState &parse_state ) {
1217 using constructor_t = json_constructor_t<JsonMember>;
1218 if constexpr( KnownBounds ) {
1219 return construct_value<json_result_t<JsonMember>, constructor_t>(
1220 parse_state, std::data( parse_state ), std::size( parse_state ) );
1222 auto value_parse_state = skip_value<true>( parse_state );
1223 return construct_value<json_result_t<JsonMember>, constructor_t>(
1225 std::data( value_parse_state ),
1226 std::size( value_parse_state ) );
1230 template<
typename JsonMember,
bool KnownBounds,
JsonParseTypes PTag,
1231 typename ParseState>
1232 [[nodiscard]] DAW_ATTRIB_INLINE
static constexpr json_result_t<JsonMember>
1233 parse_value( ParseState &parse_state ) {
1234 if constexpr( PTag == JsonParseTypes::Real ) {
1235 return parse_value_real<JsonMember, KnownBounds>( parse_state );
1236 }
else if constexpr( PTag == JsonParseTypes::Signed ) {
1237 return parse_value_signed<JsonMember, KnownBounds>( parse_state );
1238 }
else if constexpr( PTag == JsonParseTypes::Unsigned ) {
1239 return parse_value_unsigned<JsonMember, KnownBounds>( parse_state );
1240 }
else if constexpr( PTag == JsonParseTypes::Null ) {
1241 return parse_value_null<JsonMember, KnownBounds>( parse_state );
1242 }
else if constexpr( PTag == JsonParseTypes::Bool ) {
1243 return parse_value_bool<JsonMember, KnownBounds>( parse_state );
1244 }
else if constexpr( PTag == JsonParseTypes::StringRaw ) {
1245 return parse_value_string_raw<JsonMember, KnownBounds>( parse_state );
1246 }
else if constexpr( PTag == JsonParseTypes::StringEscaped ) {
1247 return parse_value_string_escaped<JsonMember, KnownBounds>(
1249 }
else if constexpr( PTag == JsonParseTypes::Date ) {
1250 return parse_value_date<JsonMember, KnownBounds>( parse_state );
1251 }
else if constexpr( PTag == JsonParseTypes::Custom ) {
1252 return parse_value_custom<JsonMember, KnownBounds>( parse_state );
1253 }
else if constexpr( PTag == JsonParseTypes::Class ) {
1254 return parse_value_class<JsonMember, KnownBounds>( parse_state );
1255 }
else if constexpr( PTag == JsonParseTypes::KeyValue ) {
1256 return parse_value_keyvalue<JsonMember, KnownBounds>( parse_state );
1257 }
else if constexpr( PTag == JsonParseTypes::KeyValueArray ) {
1258 return parse_value_keyvalue_array<JsonMember, KnownBounds>(
1260 }
else if constexpr( PTag == JsonParseTypes::Array ) {
1261 return parse_value_array<JsonMember, KnownBounds>( parse_state );
1262 }
else if constexpr( PTag == JsonParseTypes::SizedArray ) {
1263 return parse_value_sz_array<JsonMember, KnownBounds>( parse_state );
1264 }
else if constexpr( PTag == JsonParseTypes::Variant ) {
1265 return parse_value_variant<JsonMember, KnownBounds>( parse_state );
1266 }
else if constexpr( PTag == JsonParseTypes::VariantTagged ) {
1267 return parse_value_variant_tagged<JsonMember>( parse_state );
1268 }
else if constexpr( PTag == JsonParseTypes::VariantIntrusive ) {
1269 return parse_value_variant_intrusive<JsonMember>( parse_state );
1270 }
else if constexpr( PTag == JsonParseTypes::Tuple ) {
1271 return parse_value_tuple<JsonMember, KnownBounds>( parse_state );
1273 static_assert( PTag == JsonParseTypes::Unknown,
1274 "Unexpected JsonParseType" );
1275 return parse_value_unknown<JsonMember, KnownBounds>( parse_state );
1279 template<std::size_t N,
typename JsonClass,
bool KnownBounds,
1280 typename... JsonClasses,
typename ParseState>
1281 DAW_ATTRIB_INLINE
constexpr json_result_t<JsonClass>
1282 parse_nth_class( std::size_t idx, ParseState &parse_state ) {
1284 DAW_ASSUME( idx <
sizeof...( JsonClasses ) );
1285 using T = json_base_type_t<JsonClass>;
1286 using Constructor = json_constructor_t<JsonClass>;
1287 if constexpr(
sizeof...( JsonClasses ) >= N + 8 ) {
1290 using cur_json_class_t =
1291 daw::traits::nth_element<N + 0, JsonClasses...>;
1292 return construct_value<T, Constructor>(
1294 parse_value<cur_json_class_t,
1296 cur_json_class_t::expected_type>( parse_state ) );
1299 using cur_json_class_t =
1300 daw::traits::nth_element<N + 1, JsonClasses...>;
1301 return construct_value<T, Constructor>(
1303 parse_value<cur_json_class_t,
1305 cur_json_class_t::expected_type>( parse_state ) );
1308 using cur_json_class_t =
1309 daw::traits::nth_element<N + 2, JsonClasses...>;
1310 return construct_value<T, Constructor>(
1312 parse_value<cur_json_class_t,
1314 cur_json_class_t::expected_type>( parse_state ) );
1317 using cur_json_class_t =
1318 daw::traits::nth_element<N + 3, JsonClasses...>;
1319 return construct_value<T, Constructor>(
1321 parse_value<cur_json_class_t,
1323 cur_json_class_t::expected_type>( parse_state ) );
1326 using cur_json_class_t =
1327 daw::traits::nth_element<N + 4, JsonClasses...>;
1328 return construct_value<T, Constructor>(
1330 parse_value<cur_json_class_t,
1332 cur_json_class_t::expected_type>( parse_state ) );
1335 using cur_json_class_t =
1336 daw::traits::nth_element<N + 5, JsonClasses...>;
1337 return construct_value<T, Constructor>(
1339 parse_value<cur_json_class_t,
1341 cur_json_class_t::expected_type>( parse_state ) );
1344 using cur_json_class_t =
1345 daw::traits::nth_element<N + 6, JsonClasses...>;
1346 return construct_value<T, Constructor>(
1348 parse_value<cur_json_class_t,
1350 cur_json_class_t::expected_type>( parse_state ) );
1353 using cur_json_class_t =
1354 daw::traits::nth_element<N + 7, JsonClasses...>;
1355 return construct_value<T, Constructor>(
1357 parse_value<cur_json_class_t,
1359 cur_json_class_t::expected_type>( parse_state ) );
1362 if constexpr(
sizeof...( JsonClasses ) >= N + 8 ) {
1363 return parse_nth_class<N + 8,
1366 JsonClasses...>( idx, parse_state );
1371 }
else if constexpr(
sizeof...( JsonClasses ) == N + 7 ) {
1374 using cur_json_class_t =
1375 daw::traits::nth_element<N + 0, JsonClasses...>;
1376 return construct_value<T, Constructor>(
1378 parse_value<cur_json_class_t,
1380 cur_json_class_t::expected_type>( parse_state ) );
1383 using cur_json_class_t =
1384 daw::traits::nth_element<N + 1, JsonClasses...>;
1385 return construct_value<T, Constructor>(
1387 parse_value<cur_json_class_t,
1389 cur_json_class_t::expected_type>( parse_state ) );
1392 using cur_json_class_t =
1393 daw::traits::nth_element<N + 2, JsonClasses...>;
1394 return construct_value<T, Constructor>(
1396 parse_value<cur_json_class_t,
1398 cur_json_class_t::expected_type>( parse_state ) );
1401 using cur_json_class_t =
1402 daw::traits::nth_element<N + 3, JsonClasses...>;
1403 return construct_value<T, Constructor>(
1405 parse_value<cur_json_class_t,
1407 cur_json_class_t::expected_type>( parse_state ) );
1410 using cur_json_class_t =
1411 daw::traits::nth_element<N + 4, JsonClasses...>;
1412 return construct_value<T, Constructor>(
1414 parse_value<cur_json_class_t,
1416 cur_json_class_t::expected_type>( parse_state ) );
1419 using cur_json_class_t =
1420 daw::traits::nth_element<N + 5, JsonClasses...>;
1421 return construct_value<T, Constructor>(
1423 parse_value<cur_json_class_t,
1425 cur_json_class_t::expected_type>( parse_state ) );
1428 DAW_ASSUME( idx == N + 6 );
1429 using cur_json_class_t =
1430 daw::traits::nth_element<N + 6, JsonClasses...>;
1431 return construct_value<T, Constructor>(
1433 parse_value<cur_json_class_t,
1435 cur_json_class_t::expected_type>( parse_state ) );
1438 }
else if constexpr(
sizeof...( JsonClasses ) == N + 6 ) {
1441 using cur_json_class_t =
1442 daw::traits::nth_element<N + 0, JsonClasses...>;
1443 return construct_value<T, Constructor>(
1445 parse_value<cur_json_class_t,
1447 cur_json_class_t::expected_type>( parse_state ) );
1450 using cur_json_class_t =
1451 daw::traits::nth_element<N + 1, JsonClasses...>;
1452 return construct_value<T, Constructor>(
1454 parse_value<cur_json_class_t,
1456 cur_json_class_t::expected_type>( parse_state ) );
1459 using cur_json_class_t =
1460 daw::traits::nth_element<N + 2, JsonClasses...>;
1461 return construct_value<T, Constructor>(
1463 parse_value<cur_json_class_t,
1465 cur_json_class_t::expected_type>( parse_state ) );
1468 using cur_json_class_t =
1469 daw::traits::nth_element<N + 3, JsonClasses...>;
1470 return construct_value<T, Constructor>(
1472 parse_value<cur_json_class_t,
1474 cur_json_class_t::expected_type>( parse_state ) );
1477 using cur_json_class_t =
1478 daw::traits::nth_element<N + 4, JsonClasses...>;
1479 return construct_value<T, Constructor>(
1481 parse_value<cur_json_class_t,
1483 cur_json_class_t::expected_type>( parse_state ) );
1486 DAW_ASSUME( idx == N + 5 );
1487 using cur_json_class_t =
1488 daw::traits::nth_element<N + 5, JsonClasses...>;
1489 return construct_value<T, Constructor>(
1491 parse_value<cur_json_class_t,
1493 cur_json_class_t::expected_type>( parse_state ) );
1496 }
else if constexpr(
sizeof...( JsonClasses ) == N + 5 ) {
1499 using cur_json_class_t =
1500 daw::traits::nth_element<N + 0, JsonClasses...>;
1501 return construct_value<T, Constructor>(
1503 parse_value<cur_json_class_t,
1505 cur_json_class_t::expected_type>( parse_state ) );
1508 using cur_json_class_t =
1509 daw::traits::nth_element<N + 1, JsonClasses...>;
1510 return construct_value<T, Constructor>(
1512 parse_value<cur_json_class_t,
1514 cur_json_class_t::expected_type>( parse_state ) );
1517 using cur_json_class_t =
1518 daw::traits::nth_element<N + 2, JsonClasses...>;
1519 return construct_value<T, Constructor>(
1521 parse_value<cur_json_class_t,
1523 cur_json_class_t::expected_type>( parse_state ) );
1526 using cur_json_class_t =
1527 daw::traits::nth_element<N + 3, JsonClasses...>;
1528 return construct_value<T, Constructor>(
1530 parse_value<cur_json_class_t,
1532 cur_json_class_t::expected_type>( parse_state ) );
1535 DAW_ASSUME( idx == N + 4 );
1536 using cur_json_class_t =
1537 daw::traits::nth_element<N + 4, JsonClasses...>;
1538 return construct_value<T, Constructor>(
1540 parse_value<cur_json_class_t,
1542 cur_json_class_t::expected_type>( parse_state ) );
1545 }
else if constexpr(
sizeof...( JsonClasses ) == N + 4 ) {
1548 using cur_json_class_t =
1549 daw::traits::nth_element<N + 0, JsonClasses...>;
1550 return construct_value<T, Constructor>(
1552 parse_value<cur_json_class_t,
1554 cur_json_class_t::expected_type>( parse_state ) );
1557 using cur_json_class_t =
1558 daw::traits::nth_element<N + 1, JsonClasses...>;
1559 return construct_value<T, Constructor>(
1561 parse_value<cur_json_class_t,
1563 cur_json_class_t::expected_type>( parse_state ) );
1566 using cur_json_class_t =
1567 daw::traits::nth_element<N + 2, JsonClasses...>;
1568 return construct_value<T, Constructor>(
1570 parse_value<cur_json_class_t,
1572 cur_json_class_t::expected_type>( parse_state ) );
1575 DAW_ASSUME( idx == N + 3 );
1576 using cur_json_class_t =
1577 daw::traits::nth_element<N + 3, JsonClasses...>;
1578 return construct_value<T, Constructor>(
1580 parse_value<cur_json_class_t,
1582 cur_json_class_t::expected_type>( parse_state ) );
1585 }
else if constexpr(
sizeof...( JsonClasses ) == N + 3 ) {
1588 using cur_json_class_t =
1589 daw::traits::nth_element<N + 0, JsonClasses...>;
1590 return construct_value<T, Constructor>(
1592 parse_value<cur_json_class_t,
1594 cur_json_class_t::expected_type>( parse_state ) );
1597 using cur_json_class_t =
1598 daw::traits::nth_element<N + 1, JsonClasses...>;
1599 return construct_value<T, Constructor>(
1601 parse_value<cur_json_class_t,
1603 cur_json_class_t::expected_type>( parse_state ) );
1606 DAW_ASSUME( idx == N + 2 );
1607 using cur_json_class_t =
1608 daw::traits::nth_element<N + 2, JsonClasses...>;
1609 return construct_value<T, Constructor>(
1611 parse_value<cur_json_class_t,
1613 cur_json_class_t::expected_type>( parse_state ) );
1616 }
else if constexpr(
sizeof...( JsonClasses ) == N + 2 ) {
1618 using cur_json_class_t =
1619 daw::traits::nth_element<N + 0, JsonClasses...>;
1620 return construct_value<T, Constructor>(
1622 parse_value<cur_json_class_t,
1624 cur_json_class_t::expected_type>( parse_state ) );
1626 using cur_json_class_t =
1627 daw::traits::nth_element<N + 1, JsonClasses...>;
1628 return construct_value<T, Constructor>(
1630 parse_value<cur_json_class_t,
1632 cur_json_class_t::expected_type>( parse_state ) );
1634 using cur_json_class_t =
1635 daw::traits::nth_element<N + 0, JsonClasses...>;
1636 return construct_value<T, Constructor>(
1638 parse_value<cur_json_class_t,
1640 cur_json_class_t::expected_type>( parse_state ) );