29 namespace daw::json::json_details {
32 DAW_ATTRIBUTE_FLATTEN
inline constexpr
void
33 skip_quote_when_literal_as_string( Range &rng ) {
36 ErrorReason::InvalidNumberUnexpectedQuoting, rng );
38 if constexpr( KnownBounds ) {
39 rng.last = std::prev( rng.last );
41 }
else if constexpr( literal_as_string == LiteralAsStringOpt::Maybe ) {
44 if( rng.front( ) ==
'"' ) {
46 if constexpr( KnownBounds ) {
47 rng.last = std::prev( rng.last );
53 template<
typename JsonMember,
bool KnownBounds,
typename Range>
54 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
55 parse_value( ParseTag<JsonParseTypes::Real>, Range &rng ) {
56 using constructor_t =
typename JsonMember::constructor_t;
57 using element_t =
typename JsonMember::base_type;
59 if constexpr( KnownBounds ) {
60 return construct_value<json_result<JsonMember>>(
61 constructor_t{ }, rng, parse_real<element_t, true>( rng ) );
65 if constexpr( JsonMember::literal_as_string !=
66 LiteralAsStringOpt::Never ) {
67 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
70 parse_policy_details::is_number_start( rng.front( ) ),
71 ErrorReason::InvalidNumberStart, rng );
74 auto result = construct_value<json_result<JsonMember>>(
75 constructor_t{ }, rng, parse_real<element_t, false>( rng ) );
76 if constexpr( JsonMember::literal_as_string !=
77 LiteralAsStringOpt::Never ) {
78 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
81 parse_policy_details::at_end_of_item( rng.front( ) ),
82 ErrorReason::InvalidEndOfValue, rng );
87 template<
typename JsonMember,
bool KnownBounds,
typename Range>
88 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
89 parse_value( ParseTag<JsonParseTypes::Signed>, Range &rng ) {
90 using constructor_t =
typename JsonMember::constructor_t;
91 using element_t =
typename JsonMember::base_type;
92 static_assert( daw::is_signed_v<element_t>,
"Expected signed type" );
93 if constexpr( KnownBounds ) {
95 parse_policy_details::is_number_start( rng.front( ) ),
96 ErrorReason::InvalidNumberStart, rng );
100 if constexpr( JsonMember::literal_as_string !=
101 LiteralAsStringOpt::Never ) {
102 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
105 parse_policy_details::is_number_start( rng.front( ) ),
106 ErrorReason::InvalidNumberStart, rng );
109 if( rng.front( ) ==
'-' ) {
110 rng.remove_prefix( );
114 if constexpr( KnownBounds ) {
116 return construct_value<json_result<JsonMember>>(
117 constructor_t{ }, rng,
118 sign * unsigned_parser<element_t, JsonMember::range_check, KnownBounds>(
119 Range::exec_tag, rng ) );
121 auto result = construct_value<json_result<JsonMember>>(
122 constructor_t{ }, rng,
123 sign * unsigned_parser<element_t, JsonMember::range_check, KnownBounds>(
124 Range::exec_tag, rng ) );
125 if constexpr( JsonMember::literal_as_string !=
126 LiteralAsStringOpt::Never ) {
127 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
131 parse_policy_details::at_end_of_item( rng.front( ) ),
132 ErrorReason::InvalidEndOfValue, rng );
137 template<
typename JsonMember,
bool KnownBounds,
typename Range>
138 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
139 parse_value( ParseTag<JsonParseTypes::Unsigned>, Range &rng ) {
140 using constructor_t =
typename JsonMember::constructor_t;
141 using element_t =
typename JsonMember::base_type;
143 if constexpr( KnownBounds ) {
144 if constexpr( JsonMember::literal_as_string !=
145 LiteralAsStringOpt::Never ) {
146 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
149 ErrorReason::InvalidNumber, rng );
150 return construct_value<json_result<JsonMember>>(
151 constructor_t{ }, rng,
152 unsigned_parser<element_t, JsonMember::range_check, KnownBounds>(
153 Range::exec_tag, rng ) );
157 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
159 ErrorReason::InvalidNumber, rng );
160 auto result = construct_value<json_result<JsonMember>>(
161 constructor_t{ }, rng,
162 unsigned_parser<element_t, JsonMember::range_check, KnownBounds>(
163 Range::exec_tag, rng ) );
164 if constexpr( JsonMember::literal_as_string !=
165 LiteralAsStringOpt::Never ) {
166 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
169 parse_policy_details::at_end_of_item( rng.front( ) ),
170 ErrorReason::InvalidEndOfValue, rng );
175 template<
typename JsonMember,
bool KnownBounds,
typename Range>
176 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
177 parse_value( ParseTag<JsonParseTypes::Null>, Range &rng ) {
179 using constructor_t =
typename JsonMember::constructor_t;
180 if constexpr( KnownBounds ) {
181 if( rng.is_null( ) ) {
182 return construct_value<json_result<JsonMember>>( constructor_t{ },
185 return parse_value<JsonMember, true>(
186 ParseTag<JsonMember::base_expected_type>{ }, rng );
187 }
else if constexpr( Range::is_unchecked_input ) {
188 if( not rng.has_more( ) ) {
189 return construct_value<json_result<JsonMember>>( constructor_t{ },
191 }
else if( rng.front( ) ==
'n' ) {
192 rng.remove_prefix( 4 );
193 rng.trim_left_unchecked( );
194 rng.remove_prefix( );
195 return construct_value<json_result<JsonMember>>( constructor_t{ },
198 return parse_value<JsonMember>(
199 ParseTag<JsonMember::base_expected_type>{ }, rng );
201 if( rng.starts_with(
"null" ) ) {
202 rng.remove_prefix( 4 );
204 parse_policy_details::at_end_of_item( rng.front( ) ),
205 ErrorReason::InvalidLiteral, rng );
206 rng.trim_left_checked( );
207 return construct_value<json_result<JsonMember>>( constructor_t{ },
210 return parse_value<JsonMember>(
211 ParseTag<JsonMember::base_expected_type>{ }, rng );
215 template<
typename JsonMember,
bool KnownBounds,
typename Range>
216 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
217 parse_value( ParseTag<JsonParseTypes::Bool>, Range &rng ) {
220 using constructor_t =
typename JsonMember::constructor_t;
222 if constexpr( KnownBounds ) {
224 if constexpr( Range::is_unchecked_input ) {
225 return rng.front( ) ==
't';
227 switch( rng.front( ) ) {
229 return construct_value<json_result<JsonMember>>( constructor_t{ },
232 return construct_value<json_result<JsonMember>>( constructor_t{ },
238 if constexpr( JsonMember::literal_as_string !=
239 LiteralAsStringOpt::Never ) {
240 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
243 if constexpr( Range::is_unchecked_input ) {
244 if( rng.front( ) ==
't' ) {
246 rng.remove_prefix( 4 );
248 rng.remove_prefix( 5 );
251 if( rng.starts_with(
"true" ) ) {
252 rng.remove_prefix( 4 );
254 }
else if( rng.starts_with(
"false" ) ) {
255 rng.remove_prefix( 5 );
260 if constexpr( JsonMember::literal_as_string !=
261 LiteralAsStringOpt::Never ) {
262 skip_quote_when_literal_as_string<JsonMember::literal_as_string>( rng );
266 parse_policy_details::at_end_of_item( rng.front( ) ),
267 ErrorReason::InvalidEndOfValue, rng );
268 return construct_value<json_result<JsonMember>>( constructor_t{ }, rng,
273 template<
typename JsonMember,
bool KnownBounds,
typename Range>
274 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
275 parse_value( ParseTag<JsonParseTypes::StringRaw>, Range &rng ) {
277 using constructor_t =
typename JsonMember::constructor_t;
278 if constexpr( KnownBounds ) {
281 return construct_value<json_result<JsonMember>>( constructor_t{ },
285 return construct_value<json_result<JsonMember>>( constructor_t{ }, rng,
286 rng.first, rng.size( ) );
288 if constexpr( JsonMember::allow_escape_character ==
289 AllowEscapeCharacter::Allow ) {
290 auto const str = skip_string( rng );
293 return construct_value<json_result<JsonMember>>( constructor_t{ },
297 return construct_value<json_result<JsonMember>>(
298 constructor_t{ }, rng, str.first, str.size( ) );
300 rng.remove_prefix( );
302 char const *
const first = rng.first;
303 rng.template move_to_next_of<
'"'>( );
304 char const *
const last = rng.first;
305 rng.remove_prefix( );
307 if( first == last ) {
308 return construct_value<json_result<JsonMember>>( constructor_t{ },
311 return construct_value<json_result<JsonMember>>(
312 constructor_t{ }, rng, first,
313 static_cast<std::size_t
>( last - first ) );
315 return construct_value<json_result<JsonMember>>(
316 constructor_t{ }, rng, first,
317 static_cast<std::size_t
>( last - first ) );
329 template<
typename JsonMember>
330 struct can_parse_to_stdstring_fast
332 can_single_allocation_string<json_result<JsonMember>>,
333 can_single_allocation_string<json_base_type<JsonMember>>> {};
335 template<
typename JsonMember,
bool KnownBounds,
typename Range>
336 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
337 parse_value( ParseTag<JsonParseTypes::StringEscaped>, Range &rng ) {
338 using constructor_t =
typename JsonMember::constructor_t;
339 if constexpr( can_parse_to_stdstring_fast<JsonMember>::value ) {
340 constexpr
bool AllowHighEightbits =
341 JsonMember::eight_bit_mode != EightBitModes::DisallowHigh;
342 auto rng2 = KnownBounds ? rng : skip_string( rng );
344 if( not AllowHighEightbits or needs_slow_path( rng2 ) ) {
346 return parse_string_known_stdstring<AllowHighEightbits, JsonMember,
350 return construct_value<json_result<JsonMember>>(
351 constructor_t{ }, rng, rng2.first,
352 rng2.first +
static_cast<std::ptrdiff_t
>( rng2.size( ) ) );
354 auto rng2 = KnownBounds ? rng : skip_string( rng );
355 constexpr
bool AllowHighEightbits =
356 JsonMember::eight_bit_mode != EightBitModes::DisallowHigh;
357 if( not AllowHighEightbits or needs_slow_path( rng2 ) ) {
359 return parse_string_known_stdstring<AllowHighEightbits,
360 json_result<JsonMember>,
true>(
364 return construct_value<json_result<JsonMember>>(
365 constructor_t{ }, rng, rng2.first,
366 rng2.first +
static_cast<std::ptrdiff_t
>( rng2.size( ) ) );
370 template<
typename JsonMember,
bool KnownBounds,
typename Range>
371 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
372 parse_value( ParseTag<JsonParseTypes::Date>, Range &rng ) {
376 auto str = skip_string( rng );
377 using constructor_t =
typename JsonMember::constructor_t;
378 return construct_value<json_result<JsonMember>>( constructor_t{ }, rng,
379 str.first, str.size( ) );
382 template<
typename JsonMember,
bool KnownBounds,
typename Range>
383 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
384 parse_value( ParseTag<JsonParseTypes::Custom>, Range &rng ) {
386 if( ( ( rng.front( ) !=
'"' ) & ( rng.class_first !=
nullptr ) ) &
387 ( ( rng.first > rng.class_first ) and
388 ( *std::prev( rng.first ) ==
'"' ) ) ) {
389 rng.first = std::prev( rng.first );
391 auto const str = skip_value( rng );
393 using constructor_t =
typename JsonMember::from_converter_t;
394 return construct_value<json_result<JsonMember>>(
395 constructor_t{ }, rng, std::string_view( str.first, str.size( ) ) );
398 template<
typename JsonMember,
bool KnownBounds,
typename Range>
399 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
400 parse_value( ParseTag<JsonParseTypes::Class>, Range &rng ) {
402 using element_t =
typename JsonMember::base_type;
406 if constexpr( is_guaranteed_rvo_v<Range> ) {
410 if constexpr( not KnownBounds ) {
412 daw::on_exit_success( [&] { rng.trim_left_checked( ); } );
413 return json_data_contract_trait_t<element_t>::template parse_to_class<
416 return json_data_contract_trait_t<element_t>::template parse_to_class<
420 if constexpr( KnownBounds ) {
421 return json_data_contract_trait_t<element_t>::template parse_to_class<
424 auto result = json_data_contract_trait_t<
425 element_t>::template parse_to_class<element_t>( rng );
427 rng.trim_left_checked( );
441 template<
typename JsonMember,
bool KnownBounds,
typename Range>
442 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
443 parse_value( ParseTag<JsonParseTypes::KeyValue>, Range &rng ) {
445 static_assert( JsonMember::expected_type == JsonParseTypes::KeyValue,
446 "Expected a json_key_value" );
448 ErrorReason::ExpectedKeyValueToStartWithBrace, rng );
450 rng.remove_prefix( );
452 rng.template move_to_next_of<
'"'>( );
454 using iter_t = json_parse_kv_class_iterator<JsonMember, Range, KnownBounds>;
455 using constructor_t =
typename JsonMember::constructor_t;
456 return construct_value<json_result<JsonMember>>( constructor_t{ }, rng,
457 iter_t( rng ), iter_t( ) );
468 template<
typename JsonMember,
bool KnownBounds,
typename Range>
469 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
470 parse_value( ParseTag<JsonParseTypes::KeyValueArray>, Range &rng ) {
472 static_assert( JsonMember::expected_type == JsonParseTypes::KeyValueArray,
473 "Expected a json_key_value" );
475 ErrorReason::ExpectedKeyValueArrayToStartWithBracket,
478 rng.remove_prefix( );
480 using iter_t = json_parse_kv_array_iterator<JsonMember, Range, KnownBounds>;
481 using constructor_t =
typename JsonMember::constructor_t;
482 return construct_value<json_result<JsonMember>>( constructor_t{ }, rng,
483 iter_t( rng ), iter_t( ) );
486 template<
typename JsonMember,
bool KnownBounds,
typename Range>
487 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
488 parse_value( ParseTag<JsonParseTypes::Array>, Range &rng ) {
491 ErrorReason::InvalidArrayStart, rng );
492 rng.remove_prefix( );
493 rng.trim_left_unchecked( );
496 json_parse_array_iterator<JsonMember, Range, KnownBounds>;
497 return construct_value<json_result<JsonMember>>(
498 typename JsonMember::constructor_t{ }, rng, iterator_t( rng ),
502 template<JsonBaseParseTypes BPT,
typename JsonMembers,
typename Range>
503 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMembers>
504 parse_variant_value( Range &rng ) {
506 using element_t =
typename JsonMembers::json_elements;
507 constexpr std::size_t idx =
508 element_t::base_map[
static_cast<int_fast8_t
>( BPT )];
510 if constexpr( idx < std::tuple_size_v<typename element_t::element_map_t> ) {
512 std::tuple_element_t<idx, typename element_t::element_map_t>;
513 return parse_value<JsonMember>(
514 ParseTag<JsonMember::base_expected_type>{ }, rng );
520 template<
typename JsonMember,
bool KnownBounds,
typename Range>
521 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
522 parse_value( ParseTag<JsonParseTypes::Variant>, Range &rng ) {
524 switch( rng.front( ) ) {
526 return parse_variant_value<JsonBaseParseTypes::Class, JsonMember>( rng );
528 return parse_variant_value<JsonBaseParseTypes::Array, JsonMember>( rng );
531 return parse_variant_value<JsonBaseParseTypes::Bool, JsonMember>( rng );
533 return parse_variant_value<JsonBaseParseTypes::String, JsonMember>( rng );
546 return parse_variant_value<JsonBaseParseTypes::Number, JsonMember>( rng );
548 if constexpr( Range::is_unchecked_input ) {
555 template<
typename Result,
typename TypeList, std::size_t pos = 0,
557 constexpr Result parse_visit( std::size_t idx, Range &rng ) {
559 using JsonMember = std::tuple_element_t<pos, TypeList>;
560 return { parse_value<JsonMember>( ParseTag<JsonMember::expected_type>{ },
563 if constexpr( pos + 1 < std::tuple_size_v<TypeList> ) {
564 return parse_visit<Result, TypeList, pos + 1>( idx, rng );
566 daw_json_error( ErrorReason::MissingMemberNameOrEndOfClass, rng );
570 template<
typename JsonMember,
bool KnownBounds,
typename Range>
571 [[nodiscard, maybe_unused]]
inline constexpr json_result<JsonMember>
572 parse_value( ParseTag<JsonParseTypes::VariantTagged>, Range &rng ) {
574 using tag_member =
typename JsonMember::tag_member;
575 auto [is_found, rng2] = find_range<Range>(
576 daw::string_view( rng.class_first,
static_cast<std::size_t
>(
577 rng.last - rng.class_first ) ),
581 auto index =
typename JsonMember::switcher{ }(
582 parse_value<tag_member>( ParseTag<tag_member::expected_type>{ }, rng2 ) );
584 return parse_visit<json_result<JsonMember>,
585 typename JsonMember::json_elements::element_map_t>(
589 template<
typename JsonMember,
bool KnownBounds,
typename Range>
590 constexpr json_result<JsonMember>
591 parse_value( ParseTag<JsonParseTypes::Unknown>, Range &rng ) {
592 using constructor_t =
typename JsonMember::constructor_t;
593 if constexpr( KnownBounds ) {
594 return construct_value<json_result<JsonMember>>( constructor_t{ }, rng,
595 rng.first, rng.size( ) );
597 auto value_rng = skip_value( rng );
598 return construct_value<json_result<JsonMember>>(
599 constructor_t{ }, rng, value_rng.first, value_rng.size( ) );
603 template<std::size_t N,
typename JsonClass,
bool KnownBounds,
604 typename... JsonClasses,
typename Range>
605 constexpr JsonClass parse_nth_class( std::size_t idx, Range &rng ) {
606 if constexpr(
sizeof...( JsonClasses ) >= N + 8 ) {
609 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
610 ParseTag<JsonParseTypes::Class>{ }, rng );
612 return parse_value<daw::traits::nth_element<N + 1, JsonClasses...>>(
613 ParseTag<JsonParseTypes::Class>{ }, rng );
615 return parse_value<daw::traits::nth_element<N + 2, JsonClasses...>>(
616 ParseTag<JsonParseTypes::Class>{ }, rng );
618 return parse_value<daw::traits::nth_element<N + 3, JsonClasses...>>(
619 ParseTag<JsonParseTypes::Class>{ }, rng );
621 return parse_value<daw::traits::nth_element<N + 4, JsonClasses...>>(
622 ParseTag<JsonParseTypes::Class>{ }, rng );
624 return parse_value<daw::traits::nth_element<N + 5, JsonClasses...>>(
625 ParseTag<JsonParseTypes::Class>{ }, rng );
627 return parse_value<daw::traits::nth_element<N + 6, JsonClasses...>>(
628 ParseTag<JsonParseTypes::Class>{ }, rng );
630 return parse_value<daw::traits::nth_element<N + 7, JsonClasses...>>(
631 ParseTag<JsonParseTypes::Class>{ }, rng );
633 if constexpr(
sizeof...( JsonClasses ) > N + 7 ) {
634 return parse_nth_class<N + 8, JsonClass, KnownBounds, JsonClasses...>(
641 }
else if constexpr(
sizeof...( JsonClasses ) == N + 7 ) {
644 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
645 ParseTag<JsonParseTypes::Class>{ }, rng );
647 return parse_value<daw::traits::nth_element<N + 1, JsonClasses...>>(
648 ParseTag<JsonParseTypes::Class>{ }, rng );
650 return parse_value<daw::traits::nth_element<N + 2, JsonClasses...>>(
651 ParseTag<JsonParseTypes::Class>{ }, rng );
653 return parse_value<daw::traits::nth_element<N + 3, JsonClasses...>>(
654 ParseTag<JsonParseTypes::Class>{ }, rng );
656 return parse_value<daw::traits::nth_element<N + 4, JsonClasses...>>(
657 ParseTag<JsonParseTypes::Class>{ }, rng );
659 return parse_value<daw::traits::nth_element<N + 5, JsonClasses...>>(
660 ParseTag<JsonParseTypes::Class>{ }, rng );
662 return parse_value<daw::traits::nth_element<N + 6, JsonClasses...>>(
663 ParseTag<JsonParseTypes::Class>{ }, rng );
667 }
else if constexpr(
sizeof...( JsonClasses ) == N + 6 ) {
670 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
671 ParseTag<JsonParseTypes::Class>{ }, rng );
673 return parse_value<daw::traits::nth_element<N + 1, JsonClasses...>>(
674 ParseTag<JsonParseTypes::Class>{ }, rng );
676 return parse_value<daw::traits::nth_element<N + 2, JsonClasses...>>(
677 ParseTag<JsonParseTypes::Class>{ }, rng );
679 return parse_value<daw::traits::nth_element<N + 3, JsonClasses...>>(
680 ParseTag<JsonParseTypes::Class>{ }, rng );
682 return parse_value<daw::traits::nth_element<N + 4, JsonClasses...>>(
683 ParseTag<JsonParseTypes::Class>{ }, rng );
685 return parse_value<daw::traits::nth_element<N + 5, JsonClasses...>>(
686 ParseTag<JsonParseTypes::Class>{ }, rng );
690 }
else if constexpr(
sizeof...( JsonClasses ) == N + 5 ) {
693 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
694 ParseTag<JsonParseTypes::Class>{ }, rng );
696 return parse_value<daw::traits::nth_element<N + 1, JsonClasses...>>(
697 ParseTag<JsonParseTypes::Class>{ }, rng );
699 return parse_value<daw::traits::nth_element<N + 2, JsonClasses...>>(
700 ParseTag<JsonParseTypes::Class>{ }, rng );
702 return parse_value<daw::traits::nth_element<N + 3, JsonClasses...>>(
703 ParseTag<JsonParseTypes::Class>{ }, rng );
705 return parse_value<daw::traits::nth_element<N + 4, JsonClasses...>>(
706 ParseTag<JsonParseTypes::Class>{ }, rng );
710 }
else if constexpr(
sizeof...( JsonClasses ) == N + 4 ) {
713 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
714 ParseTag<JsonParseTypes::Class>{ }, rng );
716 return parse_value<daw::traits::nth_element<N + 1, JsonClasses...>>(
717 ParseTag<JsonParseTypes::Class>{ }, rng );
719 return parse_value<daw::traits::nth_element<N + 2, JsonClasses...>>(
720 ParseTag<JsonParseTypes::Class>{ }, rng );
722 return parse_value<daw::traits::nth_element<N + 3, JsonClasses...>>(
723 ParseTag<JsonParseTypes::Class>{ }, rng );
727 }
else if constexpr(
sizeof...( JsonClasses ) == N + 3 ) {
730 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
731 ParseTag<JsonParseTypes::Class>{ }, rng );
733 return parse_value<daw::traits::nth_element<N + 1, JsonClasses...>>(
734 ParseTag<JsonParseTypes::Class>{ }, rng );
736 return parse_value<daw::traits::nth_element<N + 2, JsonClasses...>>(
737 ParseTag<JsonParseTypes::Class>{ }, rng );
741 }
else if constexpr(
sizeof...( JsonClasses ) == N + 2 ) {
743 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
744 ParseTag<JsonParseTypes::Class>{ }, rng );
746 return parse_value<daw::traits::nth_element<N + 1, JsonClasses...>>(
747 ParseTag<JsonParseTypes::Class>{ }, rng );
750 return parse_value<daw::traits::nth_element<N + 0, JsonClasses...>>(
751 ParseTag<JsonParseTypes::Class>{ }, rng );