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 
15 namespace 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  // Cannot be a digit
85  daw_json_assert( dig - static_cast<unsigned char>( '0' ) >= 10U,
86  ErrorReason::InvalidNumberStart, parse_state );
87  }
88  break;
89  case '1':
90  case '2':
91  case '3':
92  case '4':
93  case '5':
94  case '6':
95  case '7':
96  case '8':
97  case '9':
98  return 1;
99  default:
100  daw_json_error( ErrorReason::InvalidNumberStart, parse_state );
101  }
102  return 1;
103  }
104 
105  [[nodiscard]] DAW_ATTRIB_FLATINLINE inline constexpr bool
106  is_number_start( char c ) {
107  switch( c ) {
108  case '0': // TODO: CONFORMANCE We are accepting starting with zero for
109  // now
110  case '1':
111  case '2':
112  case '3':
113  case '4':
114  case '5':
115  case '6':
116  case '7':
117  case '8':
118  case '9':
119  case '-':
120  return true;
121  }
122  return false;
123  }
124  } // namespace parse_policy_details
125  } // namespace DAW_JSON_VER
126 } // namespace daw::json
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:178
ParseState & parse_state
Definition: daw_json_parse_class.h:201
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:106
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
Definition: version.h:11