16#include <daw/daw_move.h>
28 namespace json_details {
40 constexpr explicit operator bool( )
const {
45 namespace hnd_checks {
47 template<
typename Handler,
typename ParseState>
49 decltype( std::declval<Handler>( ).handle_on_value(
52 template<
typename Handler,
typename ParseState>
58 template<
typename Handler,
typename ParseState>
60 decltype( std::declval<Handler>( ).handle_on_array_start(
63 template<
typename Handler,
typename ParseState>
69 template<
typename Handler>
71 decltype( std::declval<Handler>( ).handle_on_array_end( ) );
73 template<
typename Handler>
75 daw::is_detected<has_on_array_end_handler_detect, Handler>::value;
78 template<
typename Handler,
typename ParseState>
80 decltype( std::declval<Handler>( ).handle_on_class_start(
83 template<
typename Handler,
typename ParseState>
89 template<
typename Handler>
91 decltype( std::declval<Handler>( ).handle_on_class_end( ) );
93 template<
typename Handler>
95 daw::is_detected<has_on_class_end_handler_detect, Handler>::value;
98 template<
typename Handler,
typename ParseState>
100 decltype( std::declval<Handler>( ).handle_on_number(
103 template<
typename Handler,
typename ParseState>
108 template<
typename Handler>
110 decltype( std::declval<Handler>( ).handle_on_number( 0.0 ) );
112 template<
typename Handler>
114 daw::is_detected<has_on_number_handler_detect_dbl, Handler>::value;
117 template<
typename Handler,
typename ParseState>
119 decltype( std::declval<Handler>( ).handle_on_bool(
122 template<
typename Handler,
typename ParseState>
127 template<
typename Handler>
129 decltype( std::declval<Handler>( ).handle_on_bool(
true ) );
131 template<
typename Handler>
133 daw::is_detected<has_on_bool_handler_detect_bl, Handler>::value;
136 template<
typename Handler,
typename ParseState>
138 decltype( std::declval<Handler>( ).handle_on_string(
141 template<
typename Handler,
typename ParseState>
146 template<
typename Handler>
148 decltype( std::declval<Handler>( ).handle_on_string(
149 std::declval<std::string>( ) ) );
151 template<
typename Handler>
153 daw::is_detected<has_on_string_handler_detect_str, Handler>::value;
156 template<
typename Handler,
typename ParseState>
158 decltype( std::declval<Handler>( ).handle_on_null(
161 template<
typename Handler,
typename ParseState>
166 template<
typename Handler>
168 decltype( std::declval<Handler>( ).handle_on_null( ) );
170 template<
typename Handler>
172 daw::is_detected<has_on_null_handler_detect, Handler>::value;
175 template<
typename Handler,
typename ParseState>
177 decltype( std::declval<Handler>( ).handle_on_error(
180 template<
typename Handler,
typename ParseState>
187 constexpr daw::remove_cvref_t<T>
as_copy( T &&value ) {
191 template<
typename Handler,
typename ParseState>
192 inline constexpr handler_result_holder
196 return handler.handle_on_value( DAW_MOVE( p ) );
203 template<
typename Handler,
typename ParseState>
204 inline constexpr handler_result_holder
209 return handler.handle_on_array_start( DAW_MOVE( jv ) );
216 template<
typename Handler>
217 inline constexpr handler_result_holder
219 if constexpr( hnd_checks::has_on_array_end_handler_v<Handler> ) {
220 return handler.handle_on_array_end( );
226 template<
typename Handler,
typename ParseState>
227 inline constexpr handler_result_holder
232 return handler.handle_on_class_start( DAW_MOVE( jv ) );
239 template<
typename Handler>
240 inline constexpr handler_result_holder
242 if constexpr( hnd_checks::has_on_class_end_handler_v<Handler> ) {
243 return handler.handle_on_class_end( );
249 template<
typename Handler,
typename ParseState>
250 inline constexpr handler_result_holder
254 return handler.handle_on_number(
as_copy( jv ) );
257 return handler.handle_on_number( from_json<double>( jv ) );
264 template<
typename Handler,
typename ParseState>
265 inline constexpr handler_result_holder
269 return handler.handle_on_bool(
as_copy( jv ) );
270 }
else if constexpr( hnd_checks::has_on_bool_handler_bl_v<Handler> ) {
271 return handler.handle_on_bool( from_json<bool>( jv ) );
278 template<
typename Handler,
typename ParseState>
279 inline constexpr handler_result_holder
283 return handler.handle_on_string(
as_copy( jv ) );
286 return handler.handle_on_string( jv.
get_string( ) );
293 template<
typename Handler,
typename ParseState>
294 inline constexpr handler_result_holder
298 return handler.handle_on_null(
as_copy( jv ) );
299 }
else if constexpr( hnd_checks::has_on_null_handler_v<Handler> ) {
300 return handler.handle_on_null( );
306 template<
typename Handler,
typename ParseState>
307 inline constexpr handler_result_holder
311 return handler.handle_on_error( DAW_MOVE( jv ) );
321 template<
typename ParseState>
325 std::pair<iterator, iterator>
value;
328 template<
typename StackValue>
330 std::vector<StackValue> m_stack{ };
341 m_stack.push_back( DAW_MOVE( v ) );
345 return m_stack.back( );
357 return m_stack.empty( );
365 inline constexpr void
367 Handler &&handler ) {
372 auto parent_stack = StackContainerPolicy( );
373 long long class_depth = 0;
374 long long array_depth = 0;
376 auto const move_to_last = [&]( ) {
377 parent_stack.back( ).value.first = parent_stack.back( ).value.second;
380 auto const process_value = [&]( json_value_t p ) {
383 switch( result.value ) {
385 parent_stack.clear( );
396 switch( jv.type( ) ) {
400 switch( result.value ) {
402 parent_stack.clear( );
410 parent_stack.push_back(
412 std::pair<iterator, iterator>( jv.begin( ), jv.end( ) ) } );
417 switch( result.value ) {
419 parent_stack.clear( );
427 parent_stack.push_back(
429 std::pair<iterator, iterator>( jv.begin( ), jv.end( ) ) } );
433 switch( result.value ) {
435 parent_stack.clear( );
446 switch( result.value ) {
448 parent_stack.clear( );
459 switch( result.value ) {
461 parent_stack.clear( );
472 switch( result.value ) {
474 parent_stack.clear( );
486 switch( result.value ) {
488 parent_stack.clear( );
500 auto const process_range = [&]( stack_value_t v ) {
501 if( v.value.first != v.value.second ) {
502 auto jv = *v.value.first;
504 parent_stack.push_back( DAW_MOVE( v ) );
505 process_value( DAW_MOVE( jv ) );
510 ( class_depth > 0 ) &
511 ( v.value.first.get_raw_state( ).has_more( ) and
512 v.value.first.get_raw_state( ).front( ) ==
'}' ),
513 ErrorReason::InvalidEndOfValue );
516 switch( result.value ) {
518 parent_stack.clear( );
527 ( array_depth > 0 ) &
528 ( v.value.first.get_raw_state( ).has_more( ) and
529 v.value.first.get_raw_state( ).front( ) ==
']' ),
530 ErrorReason::InvalidEndOfValue );
533 switch( result.value ) {
535 parent_stack.clear( );
546 process_value( { std::nullopt, DAW_MOVE( jvalue ) } );
548 while( not parent_stack.empty( ) ) {
549 auto v = DAW_MOVE( parent_stack.back( ) );
550 parent_stack.pop_back( );
554 ErrorReason::InvalidEndOfValue );
560 Handler &&handler ) {
562 DAW_FWD2( Handler, handler ) );
Definition: daw_json_event_parser.h:329
CPP20CONSTEXPR DefaultJsonEventParserStackPolicy()=default
std::size_t size_type
Definition: daw_json_event_parser.h:335
StackValue & reference
Definition: daw_json_event_parser.h:334
std::ptrdiff_t difference_type
Definition: daw_json_event_parser.h:336
CPP20CONSTEXPR void push_back(value_type &&v)
Definition: daw_json_event_parser.h:340
CPP20CONSTEXPR bool empty() const
Definition: daw_json_event_parser.h:356
CPP20CONSTEXPR void clear()
Definition: daw_json_event_parser.h:348
CPP20CONSTEXPR void pop_back()
Definition: daw_json_event_parser.h:352
CPP20CONSTEXPR reference back()
Definition: daw_json_event_parser.h:344
StackValue value_type
Definition: daw_json_event_parser.h:333
Definition: daw_json_value.h:320
std::basic_string< char, Traits, Allocator > get_string(Allocator const &alloc=std::allocator< char >()) const
Definition: daw_json_value.h:479
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:190
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:179
#define CPP20CONSTEXPR
Definition: daw_json_parse_value.h:40
decltype(std::declval< Handler >().handle_on_class_end()) has_on_class_end_handler_detect
Definition: daw_json_event_parser.h:91
constexpr bool has_on_array_end_handler_v
Definition: daw_json_event_parser.h:74
decltype(std::declval< Handler >().handle_on_error(std::declval< basic_json_value< ParseState > >())) has_on_error_handler_detect
Definition: daw_json_event_parser.h:178
constexpr bool has_on_bool_handler_jv_v
Definition: daw_json_event_parser.h:123
constexpr bool has_on_number_handler_jv_v
Definition: daw_json_event_parser.h:104
decltype(std::declval< Handler >().handle_on_null(std::declval< basic_json_value< ParseState > >())) has_on_null_handler_detect_jv
Definition: daw_json_event_parser.h:159
decltype(std::declval< Handler >().handle_on_number(0.0)) has_on_number_handler_detect_dbl
Definition: daw_json_event_parser.h:110
decltype(std::declval< Handler >().handle_on_bool(true)) has_on_bool_handler_detect_bl
Definition: daw_json_event_parser.h:129
constexpr bool has_on_null_handler_jv_v
Definition: daw_json_event_parser.h:162
decltype(std::declval< Handler >().handle_on_array_end()) has_on_array_end_handler_detect
Definition: daw_json_event_parser.h:71
decltype(std::declval< Handler >().handle_on_array_start(std::declval< basic_json_value< ParseState > >())) has_on_array_start_handler_detect
Definition: daw_json_event_parser.h:61
decltype(std::declval< Handler >().handle_on_class_start(std::declval< basic_json_value< ParseState > >())) has_on_class_start_handler_detect
Definition: daw_json_event_parser.h:81
constexpr bool has_on_string_handler_str_v
Definition: daw_json_event_parser.h:152
constexpr bool has_on_error_handler_v
Definition: daw_json_event_parser.h:181
decltype(std::declval< Handler >().handle_on_string(std::declval< basic_json_value< ParseState > >())) has_on_string_handler_detect_jv
Definition: daw_json_event_parser.h:139
decltype(std::declval< Handler >().handle_on_value(std::declval< basic_json_pair< ParseState > >())) has_on_value_handler_detect
Definition: daw_json_event_parser.h:50
decltype(std::declval< Handler >().handle_on_number(std::declval< basic_json_value< ParseState > >())) has_on_number_handler_detect_jv
Definition: daw_json_event_parser.h:101
constexpr bool has_on_bool_handler_bl_v
Definition: daw_json_event_parser.h:132
constexpr bool has_on_string_handler_jv_v
Definition: daw_json_event_parser.h:142
constexpr bool has_on_number_handler_dbl_v
Definition: daw_json_event_parser.h:113
decltype(std::declval< Handler >().handle_on_string(std::declval< std::string >())) has_on_string_handler_detect_str
Definition: daw_json_event_parser.h:149
constexpr bool has_on_value_handler_v
Definition: daw_json_event_parser.h:53
constexpr bool has_on_class_end_handler_v
Definition: daw_json_event_parser.h:94
decltype(std::declval< Handler >().handle_on_null()) has_on_null_handler_detect
Definition: daw_json_event_parser.h:168
constexpr bool has_on_null_handler_v
Definition: daw_json_event_parser.h:171
decltype(std::declval< Handler >().handle_on_bool(std::declval< basic_json_value< ParseState > >())) has_on_bool_handler_detect_jv
Definition: daw_json_event_parser.h:120
constexpr bool has_on_array_start_handler_v
Definition: daw_json_event_parser.h:64
constexpr bool has_on_class_start_handler_v
Definition: daw_json_event_parser.h:84
constexpr handler_result_holder handle_on_null(Handler &&handler, basic_json_value< ParseState > &jv)
Definition: daw_json_event_parser.h:295
constexpr daw::remove_cvref_t< T > as_copy(T &&value)
Definition: daw_json_event_parser.h:187
constexpr handler_result_holder handle_on_array_end(Handler &&handler)
Definition: daw_json_event_parser.h:218
constexpr handler_result_holder handle_on_error(Handler &&handler, basic_json_value< ParseState > jv)
Definition: daw_json_event_parser.h:308
constexpr handler_result_holder handle_on_string(Handler &&handler, basic_json_value< ParseState > &jv)
Definition: daw_json_event_parser.h:280
constexpr handler_result_holder handle_on_class_start(Handler &&handler, basic_json_value< ParseState > jv)
Definition: daw_json_event_parser.h:228
constexpr handler_result_holder handle_on_bool(Handler &&handler, basic_json_value< ParseState > jv)
Definition: daw_json_event_parser.h:266
constexpr handler_result_holder handle_on_class_end(Handler &&handler)
Definition: daw_json_event_parser.h:241
constexpr handler_result_holder handle_on_value(Handler &&handler, basic_json_pair< ParseState > p)
Definition: daw_json_event_parser.h:193
constexpr handler_result_holder handle_on_number(Handler &&handler, basic_json_value< ParseState > &jv)
Definition: daw_json_event_parser.h:251
constexpr handler_result_holder handle_on_array_start(Handler &&handler, basic_json_value< ParseState > jv)
Definition: daw_json_event_parser.h:205
json_parse_handler_result
Definition: daw_json_event_parser.h:27
@ Complete
Definition: daw_json_event_parser.h:27
@ SkipClassArray
Definition: daw_json_event_parser.h:27
@ Continue
Definition: daw_json_event_parser.h:27
StackParseStateType
Definition: daw_json_event_parser.h:319
constexpr void json_event_parser(basic_json_value< ParseState > jvalue, Handler &&handler)
Definition: daw_json_event_parser.h:366
BasicParsePolicy<> NoCommentSkippingPolicyChecked
Definition: daw_json_parse_policy.h:550
Definition: daw_from_json.h:22
Definition: daw_json_event_parser.h:322
std::pair< iterator, iterator > value
Definition: daw_json_event_parser.h:325
StackParseStateType type
Definition: daw_json_event_parser.h:324
Definition: daw_json_value.h:42
Definition: daw_json_value.h:106
Definition: daw_json_event_parser.h:29
constexpr handler_result_holder(bool b)
Definition: daw_json_event_parser.h:34
constexpr handler_result_holder()=default
constexpr handler_result_holder(json_parse_handler_result r)
Definition: daw_json_event_parser.h:37
json_parse_handler_result value
Definition: daw_json_event_parser.h:30
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16