36 if constexpr( not ParseState::minified_document ) {
39 daw::not_null<typename ParseState::iterator>( parse_state.first );
40 auto const last = daw::not_null<char const *>( parse_state.last );
45 if constexpr( ParseState::is_zero_terminated_string ) {
48 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
55 DAW_LIKELY( first < last ) and
56 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
61 parse_state.first = json_details::input_pointer( parse_state.first, first.get( ) );
68 if constexpr( not ParseState::minified_document ) {
69 auto first = daw::not_null<typename ParseState::iterator>(
70 daw::never_null, parse_state.first );
72 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
77 parse_state.first = json_details::input_pointer( parse_state.first, first.get( ) );
84 auto pf = daw::not_null<char const *>( daw::never_null, parse_state.first );
85 auto pl = daw::not_null<char const *>( daw::never_null, parse_state.last );
87 json_details::memchr_unchecked<
'"',
88 typename ParseState::exec_tag_t,
89 ParseState::expect_long_strings>( pf,
91 parse_state.first = json_details::input_pointer( parse_state.first, position.get( ) );
97 static_assert(
sizeof...( keys ) > 0 );
98 static_assert(
sizeof...( keys ) <= 16 );
100 if( not json_details::use_constexpr_exec_mode<
101 typename ParseState::exec_tag_t>( ) ) {
102 auto pf = daw::not_null<char const *>{ parse_state.first };
103 auto pl = daw::not_null<char const *>{ parse_state.last };
104 auto const position =
105 json_details::mempbrk<ParseState::is_unchecked_input,
106 typename ParseState::exec_tag_t,
107 ParseState::expect_long_strings,
109 parse_state.first = json_details::input_pointer( parse_state.first, position.get( ) );
111 auto first = daw::not_null<char const *>( parse_state.first );
112 auto const last = daw::not_null<char const *>( parse_state.last );
118 if( ParseState::is_zero_terminated_string ) {
120 ErrorReason::UnexpectedEndOfData,
122 while( not parse_policy_details::in<keys...>( *first ) ) {
126 *first !=
'\0', ErrorReason::UnexpectedEndOfData, parse_state );
129 first < last, ErrorReason::UnexpectedEndOfData, parse_state );
130 while( not parse_policy_details::in<keys...>( *first ) ) {
133 first < last, ErrorReason::UnexpectedEndOfData, parse_state );
136 parse_state.first = json_details::input_pointer( parse_state.first, first.get( ) );
148 DAW_CPP23_STATIC_LOCAL
constexpr char PrimLeft =
149 BracketedType == json_details::SkipBracketedType::Class ?
'{' :
'[';
150 using PrimRight = daw::constant<PrimLeft ==
'{' ?
'}' :
']'>;
151 using SecLeft = daw::constant<PrimLeft ==
'{' ?
'[' :
'{'>;
152 using SecRight = daw::constant<SecLeft::value ==
'{' ?
'}' :
']'>;
155 auto ptr_first = daw::not_null<char const *>( parse_state.first );
156 auto const ptr_last = daw::not_null<char const *>( parse_state.last );
157 if( DAW_UNLIKELY( ptr_first >= ptr_last ) ) {
160 auto result = parse_state;
162 std::uint32_t prime_bracket_count = 1;
163 std::uint32_t second_bracket_count = 0;
165 if( *ptr_first == PrimLeft ) {
168 while( DAW_LIKELY( ptr_first < ptr_last ) ) {
169 switch( *ptr_first ) {
175 ptr_first = json_details::mem_skip_until_end_of_string<
176 ParseState::is_unchecked_input,
177 typename ParseState::exec_tag_t>( ptr_first, ptr_last );
179 ErrorReason::UnexpectedEndOfData,
183 if( DAW_UNLIKELY( ( prime_bracket_count == 1 ) &
184 ( second_bracket_count == 0 ) ) ) {
189 ++prime_bracket_count;
191 case PrimRight::value:
192 --prime_bracket_count;
193 if( prime_bracket_count == 0 ) {
196 ErrorReason::InvalidBracketing,
198 result.last = json_details::input_pointer( result.first, ptr_first.get( ) );
199 result.counter = cnt;
200 parse_state.first = json_details::input_pointer( parse_state.first, ptr_first.get( ) );
205 ++second_bracket_count;
207 case SecRight::value:
208 --second_bracket_count;
214 ( second_bracket_count == 0 ),
215 ErrorReason::InvalidBracketing,
219 result.last = json_details::input_pointer( result.first, ptr_first.get( ) );
220 result.counter = cnt;
221 parse_state.first = json_details::input_pointer( parse_state.first, ptr_first.get( ) );
229 DAW_CPP23_STATIC_LOCAL
constexpr char PrimLeft =
230 BracketedType == json_details::SkipBracketedType::Class ?
'{' :
'[';
232 using PrimRight = daw::constant<PrimLeft ==
'{' ?
'}' :
']'>;
233 using SecLeft = daw::constant<PrimLeft ==
'{' ?
'[' :
'{'>;
234 using SecRight = daw::constant<SecLeft::value ==
'{' ?
'}' :
']'>;
236 auto result = parse_state;
238 std::uint32_t prime_bracket_count = 1;
239 std::uint32_t second_bracket_count = 0;
240 auto ptr_first = daw::not_null<char const *>( parse_state.first );
241 auto const ptr_last = daw::not_null<char const *>( parse_state.last );
243 if( *ptr_first == PrimLeft ) {
247 switch( *ptr_first ) {
253 ptr_first = json_details::mem_skip_until_end_of_string<
254 ParseState::is_unchecked_input,
255 typename ParseState::exec_tag_t>( ptr_first, ptr_last );
258 if( DAW_UNLIKELY( ( prime_bracket_count == 1 ) &
259 ( second_bracket_count == 0 ) ) ) {
264 ++prime_bracket_count;
266 case PrimRight::value:
267 --prime_bracket_count;
268 if( prime_bracket_count == 0 ) {
272 result.last = json_details::input_pointer( result.first, ptr_first.get( ) );
273 result.counter = cnt;
274 parse_state.first = json_details::input_pointer( parse_state.first, ptr_first.get( ) );
279 ++second_bracket_count;
281 case SecRight::value:
282 --second_bracket_count;