36 if constexpr( not ParseState::minified_document ) {
38 auto first = parse_state.first;
39 auto const last = parse_state.last;
42 ErrorReason::InvalidNull );
47 if constexpr( ParseState::is_zero_terminated_string ) {
50 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
57 DAW_LIKELY( first < last ) and
58 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
63 parse_state.first = first;
70 if constexpr( not ParseState::minified_document ) {
71 auto first = parse_state.first;
75 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
80 parse_state.first = first;
87 auto pf = daw::not_null<char const *>( daw::never_null, parse_state.first );
88 auto pl = daw::not_null<char const *>( daw::never_null, parse_state.last );
90 json_details::memchr_unchecked<
'"',
91 typename ParseState::exec_tag_t,
92 ParseState::expect_long_strings>( pf,
94 parse_state.first = json_details::input_pointer( parse_state.first, position.get( ) );
100 static_assert(
sizeof...( keys ) > 0 );
101 static_assert(
sizeof...( keys ) <= 16 );
103 if( not json_details::use_constexpr_exec_mode<
104 typename ParseState::exec_tag_t>( ) ) {
105 auto pf = daw::not_null<char const *>{ parse_state.first };
106 auto pl = daw::not_null<char const *>{ parse_state.last };
107 auto const position =
108 json_details::mempbrk<ParseState::is_unchecked_input,
109 typename ParseState::exec_tag_t,
110 ParseState::expect_long_strings,
112 parse_state.first = json_details::input_pointer( parse_state.first, position.get( ) );
114 auto first = daw::not_null<char const *>( parse_state.first );
115 auto const last = daw::not_null<char const *>( parse_state.last );
121 if( ParseState::is_zero_terminated_string ) {
123 ErrorReason::UnexpectedEndOfData,
125 while( not parse_policy_details::in<keys...>( *first ) ) {
129 *first !=
'\0', ErrorReason::UnexpectedEndOfData, parse_state );
132 first < last, ErrorReason::UnexpectedEndOfData, parse_state );
133 while( not parse_policy_details::in<keys...>( *first ) ) {
136 first < last, ErrorReason::UnexpectedEndOfData, parse_state );
139 parse_state.first = json_details::input_pointer( parse_state.first, first.get( ) );
151 DAW_CPP23_STATIC_LOCAL
constexpr char PrimLeft =
152 BracketedType == json_details::SkipBracketedType::Class ?
'{' :
'[';
153 using PrimRight = daw::constant<PrimLeft ==
'{' ?
'}' :
']'>;
154 using SecLeft = daw::constant<PrimLeft ==
'{' ?
'[' :
'{'>;
155 using SecRight = daw::constant<SecLeft::value ==
'{' ?
'}' :
']'>;
158 char const *ptr_first = parse_state.first;
159 char const *
const ptr_last = parse_state.last;
162 ErrorReason::InvalidNull );
163 if( DAW_UNLIKELY( ptr_first >= ptr_last ) ) {
166 auto result = parse_state;
168 std::uint32_t prime_bracket_count = 1;
169 std::uint32_t second_bracket_count = 0;
171 if( *ptr_first == PrimLeft ) {
174 while( DAW_LIKELY( ptr_first < ptr_last ) ) {
175 switch( *ptr_first ) {
181 ptr_first = json_details::mem_skip_until_end_of_string<
182 ParseState::is_unchecked_input,
183 typename ParseState::exec_tag_t>( ptr_first, ptr_last );
185 ErrorReason::UnexpectedEndOfData,
189 if( DAW_UNLIKELY( ( prime_bracket_count == 1 ) &
190 ( second_bracket_count == 0 ) ) ) {
195 ++prime_bracket_count;
197 case PrimRight::value:
198 --prime_bracket_count;
199 if( prime_bracket_count == 0 ) {
202 ErrorReason::InvalidBracketing,
204 result.last = json_details::input_pointer( result.first, ptr_first );
205 result.counter = cnt;
206 parse_state.first = json_details::input_pointer( parse_state.first, ptr_first );
211 ++second_bracket_count;
213 case SecRight::value:
214 --second_bracket_count;
220 ( second_bracket_count == 0 ),
221 ErrorReason::InvalidBracketing,
225 result.last = json_details::input_pointer( result.first, ptr_first );
226 result.counter = cnt;
227 parse_state.first = json_details::input_pointer( parse_state.first, ptr_first );
235 DAW_CPP23_STATIC_LOCAL
constexpr char PrimLeft =
236 BracketedType == json_details::SkipBracketedType::Class ?
'{' :
'[';
238 using PrimRight = daw::constant<PrimLeft ==
'{' ?
'}' :
']'>;
239 using SecLeft = daw::constant<PrimLeft ==
'{' ?
'[' :
'{'>;
240 using SecRight = daw::constant<SecLeft::value ==
'{' ?
'}' :
']'>;
242 auto result = parse_state;
244 std::uint32_t prime_bracket_count = 1;
245 std::uint32_t second_bracket_count = 0;
246 char const *ptr_first = parse_state.first;
247 char const *
const ptr_last = parse_state.last;
250 ErrorReason::InvalidNull );
252 if( *ptr_first == PrimLeft ) {
256 switch( *ptr_first ) {
262 ptr_first = json_details::mem_skip_until_end_of_string<
263 ParseState::is_unchecked_input,
264 typename ParseState::exec_tag_t>( ptr_first, ptr_last );
267 if( DAW_UNLIKELY( ( prime_bracket_count == 1 ) &
268 ( second_bracket_count == 0 ) ) ) {
273 ++prime_bracket_count;
275 case PrimRight::value:
276 --prime_bracket_count;
277 if( prime_bracket_count == 0 ) {
281 result.last = json_details::input_pointer( result.first, ptr_first );
282 result.counter = cnt;
283 parse_state.first = json_details::input_pointer( parse_state.first, ptr_first );
288 ++second_bracket_count;
290 case SecRight::value:
291 --second_bracket_count;