20 namespace json_details {
23 template<
typename Char>
24 [[nodiscard]]
constexpr Char *input_pointer( Char *origin,
char const *position ) {
25 if constexpr( std::is_const_v<Char> ) {
28 return position ? origin + ( position - origin ) :
nullptr;
32 enum class SkipBracketedType { Array, Class };
35 namespace parse_policy_details {
36 template<
char... keys>
37 [[nodiscard]] DAW_ATTRIB_FLATINLINE
static constexpr bool in(
char c ) {
38 auto const eq = [c](
char k ) {
41 return nsc_or( eq( keys )... );
44 [[nodiscard]] DAW_ATTRIB_FLATINLINE
static constexpr bool
45 at_end_of_item(
char c ) {
46 return static_cast<bool>(
static_cast<unsigned>( c ==
',' ) |
47 static_cast<unsigned>( c ==
'}' ) |
48 static_cast<unsigned>( c ==
']' ) |
49 static_cast<unsigned>( c ==
':' ) |
50 static_cast<unsigned>( c <= 0x20 ) );
53 [[nodiscard]] DAW_ATTRIB_FLATINLINE
static inline constexpr bool
55 return static_cast<unsigned>(
static_cast<unsigned char>( c ) -
56 static_cast<unsigned char>(
'0' ) ) < 10U;
59 template<
typename ParseState>
60 DAW_ATTRIB_FLATINLINE
static inline constexpr void
61 validate_unsigned_first( ParseState
const &parse_state ) {
62 if constexpr( not ParseState::is_unchecked_input ) {
63 switch( parse_state.front( ) ) {
75 if( parse_state.size( ) > 1 ) {
77 ErrorReason::InvalidNumberStart,
82 daw_json_error(
true, ErrorReason::InvalidNumberStart, parse_state );
93 template<
typename ParseState>
94 [[nodiscard]] DAW_ATTRIB_FLATINLINE
static constexpr int
95 validate_signed_first( ParseState &parse_state ) {
97 ErrorReason::UnexpectedEndOfData,
99 if constexpr( ParseState::is_unchecked_input ) {
100 auto const c = parse_state.front( );
102 parse_state.remove_prefix( );
105 if( DAW_LIKELY( c >=
'0' ) and DAW_LIKELY( c <=
'9' ) ) {
110 if( parse_state.front( ) ==
'-' ) {
111 parse_state.remove_prefix( );
115 parse_state.has_more( ) ) and
116 is_number( parse_state.front( ) ),
117 ErrorReason::InvalidNumber,
120 auto const c = parse_state.front( );
121 if( c >=
'1' and c <=
'9' ) {
124 if( DAW_LIKELY( c ==
'0' ) ) {
125 if( parse_state.size( ) > 1 ) {
126 auto const next_dig =
static_cast<unsigned>(
127 static_cast<unsigned char>( *( parse_state.first + 1 ) ) );
128 auto const tst = next_dig -
static_cast<unsigned char>(
'0' );
131 tst >= 10U, ErrorReason::InvalidNumberStart, parse_state );
136 daw_json_error(
true, ErrorReason::InvalidNumberStart, parse_state );
139 [[nodiscard]] DAW_ATTRIB_FLATINLINE
static constexpr bool
140 is_number_start(
char c ) {