36 if constexpr( not ParseState::minified_document ) {
38 auto first = daw::not_null<char const *>( parse_state.first );
39 auto const last = daw::not_null<char const *>( parse_state.last );
44 if constexpr( ParseState::is_zero_terminated_string ) {
47 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
54 DAW_LIKELY( first < last ) and
55 (
static_cast<unsigned>(
static_cast<unsigned char>( *first ) ) -
60 parse_state.first = first;
83 auto pf = daw::not_null( daw::never_null, parse_state.first );
84 auto pl = daw::not_null( daw::never_null, parse_state.last );
86 json_details::memchr_unchecked<
'"',
87 typename ParseState::exec_tag_t,
88 ParseState::expect_long_strings>( pf,
95 static_assert(
sizeof...( keys ) > 0 );
96 static_assert(
sizeof...( keys ) <= 16 );
98 if( not json_details::use_constexpr_exec_mode<
99 typename ParseState::exec_tag_t>( ) ) {
100 auto pf = daw::not_null<char const *>{ parse_state.first };
101 auto pl = daw::not_null<char const *>{ parse_state.last };
103 json_details::mempbrk<ParseState::is_unchecked_input,
104 typename ParseState::exec_tag_t,
105 ParseState::expect_long_strings,
108 auto first = daw::not_null<char const *>( parse_state.first );
109 auto const last = daw::not_null<char const *>( parse_state.last );
115 if( ParseState::is_zero_terminated_string ) {
117 ErrorReason::UnexpectedEndOfData,
119 while( not parse_policy_details::in<keys...>( *first ) ) {
123 *first !=
'\0', ErrorReason::UnexpectedEndOfData, parse_state );
126 first < last, ErrorReason::UnexpectedEndOfData, parse_state );
127 while( not parse_policy_details::in<keys...>( *first ) ) {
130 first < last, ErrorReason::UnexpectedEndOfData, parse_state );
133 parse_state.first = first;
144 using PrimRight = daw::constant<PrimLeft ==
'{' ?
'}' :
']'>;
145 using SecLeft = daw::constant<PrimLeft ==
'{' ?
'[' :
'{'>;
146 using SecRight = daw::constant<SecLeft::value ==
'{' ?
'}' :
']'>;
149 auto ptr_first = daw::not_null<char const *>( parse_state.first );
150 auto const ptr_last = daw::not_null<char const *>( parse_state.last );
151 if( DAW_UNLIKELY( ptr_first >= ptr_last ) ) {
154 auto result = parse_state;
156 std::uint32_t prime_bracket_count = 1;
157 std::uint32_t second_bracket_count = 0;
159 if( *ptr_first == PrimLeft ) {
162 while( DAW_LIKELY( ptr_first < ptr_last ) ) {
163 switch( *ptr_first ) {
169 ptr_first = json_details::mem_skip_until_end_of_string<
170 ParseState::is_unchecked_input,
171 typename ParseState::exec_tag_t>( ptr_first, ptr_last );
173 ErrorReason::UnexpectedEndOfData,
177 if( DAW_UNLIKELY( ( prime_bracket_count == 1 ) &
178 ( second_bracket_count == 0 ) ) ) {
183 ++prime_bracket_count;
185 case PrimRight::value:
186 --prime_bracket_count;
187 if( prime_bracket_count == 0 ) {
190 ErrorReason::InvalidBracketing,
192 result.last = ptr_first;
193 result.counter = cnt;
194 parse_state.first = ptr_first;
199 ++second_bracket_count;
201 case SecRight::value:
202 --second_bracket_count;
208 ( second_bracket_count == 0 ),
209 ErrorReason::InvalidBracketing,
213 result.last = ptr_first;
214 result.counter = cnt;
215 parse_state.first = ptr_first;
223 using PrimRight = daw::constant<PrimLeft ==
'{' ?
'}' :
']'>;
224 using SecLeft = daw::constant<PrimLeft ==
'{' ?
'[' :
'{'>;
225 using SecRight = daw::constant<SecLeft::value ==
'{' ?
'}' :
']'>;
227 auto result = parse_state;
229 std::uint32_t prime_bracket_count = 1;
230 std::uint32_t second_bracket_count = 0;
231 auto ptr_first = daw::not_null<char const *>( parse_state.first );
232 auto const ptr_last = daw::not_null<char const *>( parse_state.last );
234 if( *ptr_first == PrimLeft ) {
238 switch( *ptr_first ) {
244 ptr_first = json_details::mem_skip_until_end_of_string<
245 ParseState::is_unchecked_input,
246 typename ParseState::exec_tag_t>( ptr_first, ptr_last );
249 if( DAW_UNLIKELY( ( prime_bracket_count == 1 ) &
250 ( second_bracket_count == 0 ) ) ) {
255 ++prime_bracket_count;
257 case PrimRight::value:
258 --prime_bracket_count;
259 if( prime_bracket_count == 0 ) {
263 result.last = ptr_first;
264 result.counter = cnt;
265 parse_state.first = ptr_first;
270 ++second_bracket_count;
272 case SecRight::value:
273 --second_bracket_count;