DAW JSON Link
daw_json_parse_policy_policy_details.h
Go to the documentation of this file.
1// Copyright (c) Darrell Wright
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
5//
6// Official repository: https://github.com/beached/daw_json_link
7//
8
9#pragma once
10
11#include "version.h"
12
13#include <daw/daw_attributes.h>
14
15namespace daw::json {
16 inline namespace DAW_JSON_VER {
17 namespace parse_policy_details {
18 template<char... keys>
19 [[nodiscard]] DAW_ATTRIB_FLATINLINE inline constexpr bool in( char c ) {
20 auto const eq = [c]( char k ) { return c == k; };
21 return ( eq( keys ) | ... );
22 }
23
24 [[nodiscard]] DAW_ATTRIB_FLATINLINE inline constexpr bool
25 at_end_of_item( char c ) {
26 return static_cast<bool>( static_cast<unsigned>( c == ',' ) |
27 static_cast<unsigned>( c == '}' ) |
28 static_cast<unsigned>( c == ']' ) |
29 static_cast<unsigned>( c == ':' ) |
30 static_cast<unsigned>( c <= 0x20 ) );
31 }
32
33 [[nodiscard]] DAW_ATTRIB_FLATINLINE inline constexpr bool
34 is_number( char c ) {
35 return static_cast<unsigned>( static_cast<unsigned char>( c ) -
36 static_cast<unsigned char>( '0' ) ) < 10U;
37 }
38
39 template<typename ParseState>
40 DAW_ATTRIB_FLATINLINE inline constexpr void
41 validate_unsigned_first( ParseState const &parse_state ) {
42 if constexpr( not ParseState::is_unchecked_input ) {
43 switch( parse_state.front( ) ) {
44 case '1':
45 case '2':
46 case '3':
47 case '4':
48 case '5':
49 case '6':
50 case '7':
51 case '8':
52 case '9':
53 return;
54 case '0':
55 if( parse_state.size( ) > 1 ) {
56 daw_json_assert( is_number( *( parse_state.first + 1 ) ),
57 ErrorReason::InvalidNumberStart, parse_state );
58 }
59 return;
60 default:
61 daw_json_error( ErrorReason::InvalidNumberStart, parse_state );
62 }
63 }
64 }
65
66 /***
67 * Validate that this is a valid number start(e.g. not leading zero when
68 * not zero)
69 * @return sign value
70 */
71 template<typename ParseState>
72 [[nodiscard]] DAW_ATTRIB_FLATINLINE inline constexpr int
74 daw_json_assert( parse_state.has_more( ),
75 ErrorReason::UnexpectedEndOfData, parse_state );
76 switch( parse_state.front( ) ) {
77 case '-':
78 parse_state.remove_prefix( );
79 return -1;
80 case '0':
81 if( parse_state.size( ) > 1 ) {
82 auto const dig = static_cast<unsigned>(
83 static_cast<unsigned char>( *( parse_state.first + 1 ) ) );
84 auto const tst = dig - static_cast<unsigned char>( '0' );
85 // Cannot be a digit
86 daw_json_assert( tst >= 10U, ErrorReason::InvalidNumberStart,
88 }
89 break;
90 case '1':
91 case '2':
92 case '3':
93 case '4':
94 case '5':
95 case '6':
96 case '7':
97 case '8':
98 case '9':
99 return 1;
100 default:
101 daw_json_error( ErrorReason::InvalidNumberStart, parse_state );
102 }
103 return 1;
104 }
105
106 [[nodiscard]] DAW_ATTRIB_FLATINLINE inline constexpr bool
107 is_number_start( char c ) {
108 switch( c ) {
109 case '0': // TODO: CONFORMANCE We are accepting starting with zero for
110 // now
111 case '1':
112 case '2':
113 case '3':
114 case '4':
115 case '5':
116 case '6':
117 case '7':
118 case '8':
119 case '9':
120 case '-':
121 return true;
122 }
123 return false;
124 }
125 } // namespace parse_policy_details
126 } // namespace DAW_JSON_VER
127} // namespace daw::json
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:179
ParseState & parse_state
Definition: daw_json_parse_class.h:182
constexpr DAW_ATTRIB_FLATINLINE int validate_signed_first(ParseState &parse_state)
Definition: daw_json_parse_policy_policy_details.h:73
constexpr DAW_ATTRIB_FLATINLINE bool is_number(char c)
Definition: daw_json_parse_policy_policy_details.h:34
constexpr DAW_ATTRIB_FLATINLINE void validate_unsigned_first(ParseState const &parse_state)
Definition: daw_json_parse_policy_policy_details.h:41
constexpr DAW_ATTRIB_FLATINLINE bool at_end_of_item(char c)
Definition: daw_json_parse_policy_policy_details.h:25
constexpr DAW_ATTRIB_FLATINLINE bool is_number_start(char c)
Definition: daw_json_parse_policy_policy_details.h:107
constexpr DAW_ATTRIB_FLATINLINE bool in(char c)
Definition: daw_json_parse_policy_policy_details.h:19
DAW_ATTRIB_NOINLINE void daw_json_error(ErrorReason reason)
Definition: daw_json_assert.h:39
Definition: daw_from_json.h:22
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16