DAW JSON Link
daw_json_parse_policy.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 "daw_json_assert.h"
12 #include "daw_json_parse_common.h"
17 
18 #include <daw/cpp_17.h>
19 #include <daw/daw_hide.h>
20 
21 #include <cassert>
22 #include <ciso646>
23 #include <cstddef>
24 #include <iterator>
25 #include <type_traits>
26 
27 namespace daw::json {
28  namespace json_details {
29  template<typename Alloc, bool /*is_empty*/>
30  class AllocatorWrapperBase {
31  Alloc *allocator_ptr;
32 
33  public:
34  AllocatorWrapperBase( Alloc &alloc ) noexcept
35  : allocator_ptr( &alloc ) {}
36 
37  Alloc &get_allocator( ) const {
38  return *allocator_ptr;
39  }
40  };
41 
42  template<typename Alloc>
43  class AllocatorWrapperBase<Alloc, true /*is_empty*/> {
44  static constexpr Alloc allocator{ };
45 
46  public:
47  constexpr AllocatorWrapperBase( ) = default;
48  constexpr AllocatorWrapperBase( Alloc & ) noexcept {}
49 
50  Alloc &get_allocator( ) const {
51  return allocator;
52  }
53  };
54 
55  template<typename Alloc>
56  struct AllocatorWrapper
57  : AllocatorWrapperBase<Alloc, std::is_empty_v<Alloc>> {
58 
59  AllocatorWrapper( Alloc &alloc ) noexcept
60  : AllocatorWrapperBase<Alloc, std::is_empty_v<Alloc>>( alloc ) {}
61 
62  static constexpr bool has_allocator = true;
63  using allocator_type = Alloc;
64 
65  template<typename T>
66  using allocator_type_as =
67  typename std::allocator_traits<Alloc>::template rebind_alloc<T>;
68 
69  template<typename T>
70  auto get_allocator_for( ) const {
71  return static_cast<allocator_type_as<T>>( this->get_allocator( ) );
72  }
73  };
74 
75  struct NoAllocator {};
76  template<>
77  class AllocatorWrapper<NoAllocator> {
78  public:
79  constexpr AllocatorWrapper( ) noexcept = default;
80  static constexpr bool has_allocator = false;
81 
82  using allocator_type = std::allocator<char>;
83 
84  template<typename T>
85  using allocator_type_as = std::allocator<T>;
86 
87  template<typename T>
88  auto get_allocator_for( ) const {
89  return std::allocator<T>( );
90  }
91  };
92  } // namespace json_details
93  /***
94  * Handles the bounds and policy items for parsing execution and comments.
95  * @tparam IsUncheckedInput If true, do not perform all validity checks on
96  * input. This implies that we can trust the source to be perfect
97  * @tparam CommentPolicy The policy that handles skipping whitespace where
98  * comments may or may not be allowed:w
99  * @tparam ExecMode A Policy type for selecting if we must be constexpr, can
100  * use C/C++ runtime only methods, or if SIMD intrinsics are allowed
101  * @tparam AllowEscapedNames Are escapes allowed in member names. When true,
102  * the slower string parser is used
103  */
104  template<bool IsUncheckedInput, typename CommentPolicy, typename ExecMode,
105  bool AllowEscapedNames,
106  typename Allocator = json_details::NoAllocator>
107  struct BasicParsePolicy : json_details::AllocatorWrapper<Allocator> {
108  using iterator = char const *;
109  static constexpr bool is_unchecked_input = IsUncheckedInput;
110  using exec_tag_t = ExecMode;
111  static constexpr exec_tag_t exec_tag = exec_tag_t{ };
112  static constexpr bool allow_escaped_names = AllowEscapedNames;
113  static constexpr bool force_name_equal_check = false;
114  using CharT = char;
115 
116  using as_unchecked = BasicParsePolicy<true, CommentPolicy, exec_tag_t,
117  allow_escaped_names, Allocator>;
118  using as_checked = BasicParsePolicy<false, CommentPolicy, exec_tag_t,
119  allow_escaped_names, Allocator>;
120 
125  std::size_t counter = 0;
127 
128  inline constexpr BasicParsePolicy( ) = default;
129 
130  inline constexpr BasicParsePolicy( iterator f, iterator l )
131  : first( f )
132  , last( l )
133  , class_first( f )
134  , class_last( l ) {}
135 
136  inline constexpr BasicParsePolicy( iterator f, iterator l,
137  Allocator &alloc )
138  : json_details::AllocatorWrapper<Allocator>( alloc )
139  , first( f )
140  , last( l )
141  , class_first( f )
142  , class_last( l ) {}
143 
144  inline constexpr BasicParsePolicy( iterator f, iterator l, iterator cf,
145  iterator cl )
146  : first( f )
147  , last( l )
148  , class_first( cf )
149  , class_last( cl ) {}
150 
151  inline constexpr BasicParsePolicy( iterator f, iterator l, iterator cf,
152  iterator cl, Allocator &alloc )
153  : json_details::AllocatorWrapper<Allocator>( alloc )
154  , first( f )
155  , last( l )
156  , class_first( cf )
157  , class_last( cl ) {}
158 
159  inline constexpr BasicParsePolicy copy( iterator f = iterator{ },
160  iterator l = iterator{ },
161  iterator cf = iterator{ },
162  iterator cl = iterator{ } ) const {
163  BasicParsePolicy result = *this;
164  if( f ) {
165  result.first = f;
166  }
167  if( l ) {
168  result.last = l;
169  }
170  if( cf ) {
171  result.class_first = cf;
172  }
173  if( cl ) {
174  result.class_last = cl;
175  }
176  return result;
177  }
178 
179  template<typename Alloc>
181  BasicParsePolicy<IsUncheckedInput, CommentPolicy, ExecMode,
182  AllowEscapedNames, Alloc>;
183 
184  template<typename Alloc>
185  static inline constexpr with_allocator_type<Alloc>
187  Alloc &alloc ) {
188  return { f, l, cf, cl, alloc };
189  }
190 
191  template<typename Alloc>
192  constexpr auto
193  with_allocator( BasicParsePolicy<IsUncheckedInput, CommentPolicy, ExecMode,
194  AllowEscapedNames, Alloc>
195  p ) const {
196 
197  if constexpr( std::is_same_v<Alloc, json_details::NoAllocator> ) {
198  return *this;
199  } else {
200  auto result = with_allocator( first, last, class_first, class_last,
201  p.get_allocator( ) );
202  result.counter = p.counter;
203  return result;
204  }
205  }
206 
207  template<typename Alloc>
208  inline constexpr with_allocator_type<Alloc>
209  with_allocator( Alloc &alloc ) const {
210  auto result =
212  result.counter = counter;
213  return result;
214  }
215 
217  BasicParsePolicy<IsUncheckedInput, CommentPolicy, ExecMode,
218  AllowEscapedNames, json_details::NoAllocator>;
219 
220  static inline constexpr without_allocator_type
222  auto result =
224  result.counter = p.counter;
225  return result;
226  }
227 
228  inline constexpr without_allocator_type without_allocator( ) const {
229  auto result =
231  result.counter = counter;
232  return result;
233  }
234 
235  template<typename Alloc>
236  static inline constexpr with_allocator_type<Alloc>
237  with_allocator( iterator f, iterator l, Alloc &alloc ) {
238  return { f, l, f, l, alloc };
239  }
240 
241  static inline constexpr without_allocator_type
243  return { f, l };
244  }
245 
246  static inline constexpr without_allocator_type
248  return { f, l, cf, cl };
249  }
250 
251  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr iterator
252  data( ) const {
253  return first;
254  }
255 
256  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr iterator
257  begin( ) const {
258  return first;
259  }
260 
261  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr iterator end( ) const {
262  return last;
263  }
264 
265  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr bool empty( ) const {
266  return first >= last;
267  }
268 
269  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr bool
270  has_more( ) const {
271  return first < last;
272  }
273 
274  template<std::size_t N>
275  inline constexpr bool starts_with( char const ( &rhs )[N] ) const {
276  if( size( ) < ( N - 1 ) ) {
277  return false;
278  }
279  bool result = true;
280  for( std::size_t n = 0; n < ( N - 1 ); ++n ) {
281  result = result & ( first[n] == rhs[n] );
282  }
283  return result;
284  }
285 
286  template<char c>
287  DAW_ATTRIBUTE_FLATTEN inline constexpr void move_to_next_of_unchecked( ) {
288 
289  if constexpr( not std::is_same_v<Range::exec_tag_t,
290  constexpr_exec_tag> ) {
291  first = reinterpret_cast<char const *>( std::memchr(
292  first, c, static_cast<std::size_t>( class_last - first ) ) );
293  } else {
294  while( *first != c ) {
295  ++first;
296  }
297  }
298  }
299 
300  template<char c>
301  DAW_ATTRIBUTE_FLATTEN inline constexpr void move_to_next_of_checked( ) {
302 
303  if constexpr( not std::is_same_v<Range::exec_tag_t,
304  constexpr_exec_tag> ) {
305  first = reinterpret_cast<char const *>( std::memchr(
306  first, c, static_cast<std::size_t>( class_last - first ) ) );
307  daw_json_assert( first != nullptr, json_details::missing_token( c ),
308  *this );
309  } else {
310  while( DAW_JSON_LIKELY( first < last ) and *first != c ) {
311  ++first;
312  }
313  }
314  }
315 
316  template<char c>
317  DAW_ATTRIBUTE_FLATTEN inline constexpr void move_to_next_of( ) {
318  if( is_unchecked_input ) {
319  move_to_next_of_unchecked<c>( );
320  } else {
321  move_to_next_of_checked<c>( );
322  }
323  }
324 
325  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr char front( ) const {
326  return *first;
327  }
328 
329  [[nodiscard]] inline constexpr std::size_t size( ) const {
330  return static_cast<std::size_t>( last - first );
331  }
332 
333  [[nodiscard]] inline constexpr bool is_null( ) const {
334  return first == nullptr;
335  }
336 
337  DAW_ATTRIBUTE_FLATTEN inline constexpr void remove_prefix( ) {
338  ++first;
339  }
340 
341  DAW_ATTRIBUTE_FLATTEN inline constexpr void remove_prefix( std::size_t n ) {
342  first += static_cast<std::ptrdiff_t>( n );
343  }
344 
345  inline constexpr void set_class_position( ) {
346  class_first = first;
347  class_last = last;
348  }
349 
350  inline constexpr void trim_left_checked( ) {
351  return CommentPolicy::trim_left_checked( *this );
352  }
353 
354  inline constexpr void trim_left_unchecked( ) {
355  return CommentPolicy::trim_left_unchecked( *this );
356  }
357 
358  inline constexpr void move_to_end_of_literal( ) {
359  char const *f = first;
360  char const *const l = last;
361  if constexpr( IsUncheckedInput ) {
362  while( ( static_cast<unsigned char>( *f ) > 0x20U ) &
363  not CommentPolicy::is_literal_end( *f ) ) {
364  ++f;
365  }
366  } else {
367  while( ( f < l ) and ( ( static_cast<unsigned char>( *f ) > 0x20 ) &
368  not CommentPolicy::is_literal_end( *f ) ) ) {
369  ++f;
370  }
371  }
372  first = f;
373  }
374 
375  [[nodiscard]] inline constexpr bool is_literal_end( ) const {
376  return CommentPolicy::is_literal_end( *first );
377  }
378 
379  DAW_ATTRIBUTE_FLATTEN [[nodiscard]] inline constexpr bool
380  is_space_checked( ) const {
381  daw_json_assert_weak( has_more( ), ErrorReason::UnexpectedEndOfData,
382  *this );
383  return static_cast<unsigned char>( *first ) <= 0x20U;
384  }
385 
386  DAW_ATTRIBUTE_FLATTEN [[nodiscard]] inline constexpr bool
388  return static_cast<unsigned char>( *first ) <= 0x20U;
389  }
390 
391  [[nodiscard]] inline constexpr bool is_opening_bracket_checked( ) const {
392  return DAW_JSON_LIKELY( first < last ) and *first == '[';
393  }
394 
395  [[nodiscard]] inline constexpr bool is_opening_brace_checked( ) const {
396  return DAW_JSON_LIKELY( first < last ) and *first == '{';
397  }
398 
399  [[nodiscard]] inline constexpr bool is_closing_brace_checked( ) const {
400  return DAW_JSON_LIKELY( first < last ) and *first == '}';
401  }
402 
403  [[nodiscard]] inline constexpr bool is_quotes_checked( ) const {
404  return DAW_JSON_LIKELY( first < last ) and *first == '"';
405  }
406 
407  [[nodiscard]] inline constexpr bool is_exponent_checked( ) const {
408  return DAW_JSON_LIKELY( first < last ) and
409  ( ( *first == 'e' ) bitor ( *first == 'E' ) );
410  }
411 
412  inline constexpr void trim_left( ) {
413  if constexpr( is_unchecked_input ) {
415  } else {
417  }
418  }
419 
420  inline constexpr void clean_tail_unchecked( ) {
422  if( *first == ',' ) {
423  ++first;
425  }
426  }
427 
428  template<char EndChar = '\0'>
429  inline constexpr void clean_end_of_value( bool at_first ) {
430  trim_left( );
431  if constexpr( is_unchecked_input ) {
432  if( *first == ',' ) {
433  ++first;
434  trim_left( );
435  }
436  } else {
437  if( ( not at_first ) & ( first < last ) ) {
438  if( *first == ',' ) {
439  ++first;
440  trim_left( );
441  } else {
442  if constexpr( EndChar != '\0' ) {
443  daw_json_assert( *first == EndChar,
444  ErrorReason::ExpectedTokenNotFound, *this );
445  }
446  }
447  }
448  }
449  }
450 
451  inline constexpr void clean_tail_checked( ) {
453  if( DAW_JSON_LIKELY( first < last ) and *first == ',' ) {
454  ++first;
456  }
457  }
458 
459  DAW_ATTRIBUTE_FLATTEN inline constexpr void clean_tail( ) {
460  if constexpr( is_unchecked_input ) {
462  } else {
464  }
465  }
466 
467  inline constexpr void move_to_next_class_member( ) {
468  CommentPolicy::template move_to_next_of<'"', '}'>( *this );
469  }
470 
471  inline constexpr bool is_at_next_class_member( ) const {
472  return parse_policy_details::in<'"', '}'>( *first );
473  }
474 
475  inline constexpr bool is_at_token_after_value( ) const {
476  return parse_policy_details::in<',', '}', ']'>( *first );
477  }
478 
479  template<char PrimLeft, char PrimRight, char SecLeft, char SecRight>
480  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr Range
482  return CommentPolicy::template skip_bracketed_item_checked<
483  PrimLeft, PrimRight, SecLeft, SecRight>( *this );
484  }
485 
486  template<char PrimLeft, char PrimRight, char SecLeft, char SecRight>
487  [[nodiscard]] DAW_ATTRIBUTE_FLATTEN inline constexpr Range
489  return CommentPolicy::template skip_bracketed_item_unchecked<
490  PrimLeft, PrimRight, SecLeft, SecRight>( *this );
491  }
492 
493  [[nodiscard]] inline constexpr Range skip_class( ) {
494  if constexpr( is_unchecked_input ) {
495  return skip_bracketed_item_unchecked<'{', '}', '[', ']'>( );
496  } else {
497  return skip_bracketed_item_checked<'{', '}', '[', ']'>( );
498  }
499  }
500 
501  [[nodiscard]] inline constexpr Range skip_array( ) {
502  if constexpr( is_unchecked_input ) {
503  return skip_bracketed_item_unchecked<'[', ']', '{', '}'>( );
504  } else {
505  return skip_bracketed_item_checked<'[', ']', '{', '}'>( );
506  }
507  }
508  }; // namespace daw::json
509 
512 
515 
516  template<typename ExecTag, typename Allocator = json_details::NoAllocator>
519 
520  template<typename ExecTag, typename Allocator = json_details::NoAllocator>
523 
526 
529 
530  template<typename ExecTag, typename Allocator = json_details::NoAllocator>
532  BasicParsePolicy<false, HashCommentSkippingPolicy, ExecTag, false,
533  Allocator>;
534 
535  template<typename ExecTag, typename Allocator = json_details::NoAllocator>
537  BasicParsePolicy<true, HashCommentSkippingPolicy, ExecTag, false,
538  Allocator>;
539 
542 
545 
546  /***
547  * Parse using SIMD instructions if available, allow C++ comments and fully
548  * check input
549  */
550  template<typename ExecTag, typename Allocator = json_details::NoAllocator>
552  BasicParsePolicy<false, CppCommentSkippingPolicy, ExecTag, false,
553  Allocator>;
554 
555  /***
556  * Parse using SIMD instructions if available, allow C++ comments and do not
557  * do more than minimum checking
558  */
559  template<typename ExecTag, typename Allocator = json_details::NoAllocator>
562 
563  namespace json_details {
564  /***
565  * We are either not in a constexpr context or we have constexpr dtors. This
566  * is generally used so that we can call cleanup code after parsing the
567  * member
568  */
569  template<typename ParsePolicy>
570  inline constexpr bool is_guaranteed_rvo_v =
571  ParsePolicy::exec_tag_t::always_rvo;
572  } // namespace json_details
573 } // namespace daw::json
daw::json::BasicParsePolicy::set_class_position
constexpr void set_class_position()
Definition: daw_json_parse_policy.h:345
daw::json::HashCommentSkippingPolicy
Definition: daw_json_parse_policy_hash_comments.h:24
daw::json::BasicParsePolicy::move_to_end_of_literal
constexpr void move_to_end_of_literal()
Definition: daw_json_parse_policy.h:358
daw::json::BasicParsePolicy::without_allocator
static constexpr without_allocator_type without_allocator(BasicParsePolicy p)
Definition: daw_json_parse_policy.h:221
daw::json::BasicParsePolicy::BasicParsePolicy
constexpr BasicParsePolicy(iterator f, iterator l)
Definition: daw_json_parse_policy.h:130
daw::json::BasicParsePolicy::starts_with
constexpr bool starts_with(char const (&rhs)[N]) const
Definition: daw_json_parse_policy.h:275
daw::json::BasicParsePolicy::is_opening_brace_checked
constexpr bool is_opening_brace_checked() const
Definition: daw_json_parse_policy.h:395
daw::json::BasicParsePolicy::trim_left
constexpr void trim_left()
Definition: daw_json_parse_policy.h:412
daw_json_assert
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:196
daw::json::BasicParsePolicy::skip_array
constexpr Range skip_array()
Definition: daw_json_parse_policy.h:501
daw::json
Definition: daw_json_event_parser.h:17
daw::json::BasicParsePolicy::exec_tag_t
ExecMode exec_tag_t
Definition: daw_json_parse_policy.h:110
daw_json_assert_weak
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:206
daw_json_parse_policy_hash_comments.h
daw::json::BasicParsePolicy::iterator
char const * iterator
Definition: daw_json_parse_policy.h:108
daw::json::BasicParsePolicy::class_first
iterator class_first
Definition: daw_json_parse_policy.h:123
daw::json::BasicParsePolicy::trim_left_checked
constexpr void trim_left_checked()
Definition: daw_json_parse_policy.h:350
daw::json::BasicParsePolicy::is_opening_bracket_checked
constexpr bool is_opening_bracket_checked() const
Definition: daw_json_parse_policy.h:391
daw::json::BasicParsePolicy::is_at_next_class_member
constexpr bool is_at_next_class_member() const
Definition: daw_json_parse_policy.h:471
daw::json::BasicParsePolicy::clean_tail_unchecked
constexpr void clean_tail_unchecked()
Definition: daw_json_parse_policy.h:420
daw::json::BasicParsePolicy::has_more
constexpr DAW_ATTRIBUTE_FLATTEN bool has_more() const
Definition: daw_json_parse_policy.h:270
daw::json::BasicParsePolicy::is_exponent_checked
constexpr bool is_exponent_checked() const
Definition: daw_json_parse_policy.h:407
daw::json::BasicParsePolicy::BasicParsePolicy
constexpr BasicParsePolicy()=default
daw::json::BasicParsePolicy::move_to_next_of
constexpr DAW_ATTRIBUTE_FLATTEN void move_to_next_of()
Definition: daw_json_parse_policy.h:317
daw::json::constexpr_exec_tag
Definition: daw_json_exec_modes.h:14
daw::json::BasicParsePolicy::move_to_next_of_checked
constexpr DAW_ATTRIBUTE_FLATTEN void move_to_next_of_checked()
Definition: daw_json_parse_policy.h:301
daw::json::BasicParsePolicy::size
constexpr std::size_t size() const
Definition: daw_json_parse_policy.h:329
daw::json::BasicParsePolicy::move_to_next_class_member
constexpr void move_to_next_class_member()
Definition: daw_json_parse_policy.h:467
daw::json::BasicParsePolicy::move_to_next_of_unchecked
constexpr DAW_ATTRIBUTE_FLATTEN void move_to_next_of_unchecked()
Definition: daw_json_parse_policy.h:287
daw::json::BasicParsePolicy::without_allocator
constexpr without_allocator_type without_allocator() const
Definition: daw_json_parse_policy.h:228
daw::json::BasicParsePolicy::clean_tail
constexpr DAW_ATTRIBUTE_FLATTEN void clean_tail()
Definition: daw_json_parse_policy.h:459
daw::json::BasicParsePolicy::first
iterator first
Definition: daw_json_parse_policy.h:121
daw::json::BasicParsePolicy::is_closing_brace_checked
constexpr bool is_closing_brace_checked() const
Definition: daw_json_parse_policy.h:399
daw::json::BasicParsePolicy::copy
constexpr BasicParsePolicy copy(iterator f=iterator{ }, iterator l=iterator{ }, iterator cf=iterator{ }, iterator cl=iterator{ }) const
Definition: daw_json_parse_policy.h:159
daw::json::BasicParsePolicy::with_allocator
constexpr auto with_allocator(BasicParsePolicy< IsUncheckedInput, CommentPolicy, ExecMode, AllowEscapedNames, Alloc > p) const
Definition: daw_json_parse_policy.h:193
daw_json_parse_policy_no_comments.h
daw::json::BasicParsePolicy::clean_tail_checked
constexpr void clean_tail_checked()
Definition: daw_json_parse_policy.h:451
daw::json::BasicParsePolicy::skip_bracketed_item_checked
constexpr DAW_ATTRIBUTE_FLATTEN Range skip_bracketed_item_checked()
Definition: daw_json_parse_policy.h:481
daw::json::BasicParsePolicy::counter
std::size_t counter
Definition: daw_json_parse_policy.h:125
daw::json::BasicParsePolicy::empty
constexpr DAW_ATTRIBUTE_FLATTEN bool empty() const
Definition: daw_json_parse_policy.h:265
daw::json::BasicParsePolicy::is_quotes_checked
constexpr bool is_quotes_checked() const
Definition: daw_json_parse_policy.h:403
daw_json_parse_common.h
daw::json::BasicParsePolicy::without_allocator
static constexpr without_allocator_type without_allocator(iterator f, iterator l, iterator cf, iterator cl)
Definition: daw_json_parse_policy.h:247
daw::json::BasicParsePolicy::is_null
constexpr bool is_null() const
Definition: daw_json_parse_policy.h:333
daw::json::BasicParsePolicy::skip_class
constexpr Range skip_class()
Definition: daw_json_parse_policy.h:493
daw::json::BasicParsePolicy::clean_end_of_value
constexpr void clean_end_of_value(bool at_first)
Definition: daw_json_parse_policy.h:429
daw::json::BasicParsePolicy::remove_prefix
constexpr DAW_ATTRIBUTE_FLATTEN void remove_prefix(std::size_t n)
Definition: daw_json_parse_policy.h:341
daw::json::BasicParsePolicy::class_last
iterator class_last
Definition: daw_json_parse_policy.h:124
daw_json_parse_policy_cpp_comments.h
daw::json::BasicParsePolicy::is_space_unchecked
constexpr DAW_ATTRIBUTE_FLATTEN bool is_space_unchecked() const
Definition: daw_json_parse_policy.h:387
daw::json::BasicParsePolicy::with_allocator
static constexpr with_allocator_type< Alloc > with_allocator(iterator f, iterator l, iterator cf, iterator cl, Alloc &alloc)
Definition: daw_json_parse_policy.h:186
daw::json::BasicParsePolicy::BasicParsePolicy
constexpr BasicParsePolicy(iterator f, iterator l, Allocator &alloc)
Definition: daw_json_parse_policy.h:136
daw::json::BasicParsePolicy::is_unchecked_input
static constexpr bool is_unchecked_input
Definition: daw_json_parse_policy.h:109
daw_json_assert.h
daw::json::BasicParsePolicy::end
constexpr DAW_ATTRIBUTE_FLATTEN iterator end() const
Definition: daw_json_parse_policy.h:261
daw::json::BasicParsePolicy::is_literal_end
constexpr bool is_literal_end() const
Definition: daw_json_parse_policy.h:375
daw::json::BasicParsePolicy::without_allocator
static constexpr without_allocator_type without_allocator(iterator f, iterator l)
Definition: daw_json_parse_policy.h:242
daw::json::BasicParsePolicy::force_name_equal_check
static constexpr bool force_name_equal_check
Definition: daw_json_parse_policy.h:113
daw_json_parse_policy_policy_details.h
daw::json::BasicParsePolicy::BasicParsePolicy
constexpr BasicParsePolicy(iterator f, iterator l, iterator cf, iterator cl)
Definition: daw_json_parse_policy.h:144
daw::json::BasicParsePolicy::trim_left_unchecked
constexpr void trim_left_unchecked()
Definition: daw_json_parse_policy.h:354
daw::json::BasicParsePolicy::CharT
char CharT
Definition: daw_json_parse_policy.h:114
daw::json::BasicParsePolicy::skip_bracketed_item_unchecked
constexpr DAW_ATTRIBUTE_FLATTEN Range skip_bracketed_item_unchecked()
Definition: daw_json_parse_policy.h:488
DAW_JSON_LIKELY
#define DAW_JSON_LIKELY(Bool)
Definition: daw_json_assert.h:34
daw::json::BasicParsePolicy::with_allocator
static constexpr with_allocator_type< Alloc > with_allocator(iterator f, iterator l, Alloc &alloc)
Definition: daw_json_parse_policy.h:237
daw::json::BasicParsePolicy::begin
constexpr DAW_ATTRIBUTE_FLATTEN iterator begin() const
Definition: daw_json_parse_policy.h:257
daw::json::BasicParsePolicy::BasicParsePolicy
constexpr BasicParsePolicy(iterator f, iterator l, iterator cf, iterator cl, Allocator &alloc)
Definition: daw_json_parse_policy.h:151
daw::json::BasicParsePolicy::allow_escaped_names
static constexpr bool allow_escaped_names
Definition: daw_json_parse_policy.h:112
daw::json::BasicParsePolicy::last
iterator last
Definition: daw_json_parse_policy.h:122
daw::json::BasicParsePolicy::is_space_checked
constexpr DAW_ATTRIBUTE_FLATTEN bool is_space_checked() const
Definition: daw_json_parse_policy.h:380
daw::json::BasicParsePolicy::is_at_token_after_value
constexpr bool is_at_token_after_value() const
Definition: daw_json_parse_policy.h:475
daw::json::BasicParsePolicy::without_allocator_type
BasicParsePolicy< IsUncheckedInput, CommentPolicy, ExecMode, AllowEscapedNames, json_details::NoAllocator > without_allocator_type
Definition: daw_json_parse_policy.h:218
daw::json::BasicParsePolicy::with_allocator
constexpr with_allocator_type< Alloc > with_allocator(Alloc &alloc) const
Definition: daw_json_parse_policy.h:209
daw::json::BasicParsePolicy::Range
BasicParsePolicy Range
Definition: daw_json_parse_policy.h:126
daw::json::CppCommentSkippingPolicy
Definition: daw_json_parse_policy_cpp_comments.h:24
daw::json::BasicParsePolicy
Definition: daw_json_parse_policy.h:107
daw::json::BasicParsePolicy::data
constexpr DAW_ATTRIBUTE_FLATTEN iterator data() const
Definition: daw_json_parse_policy.h:252
daw::json::BasicParsePolicy::remove_prefix
constexpr DAW_ATTRIBUTE_FLATTEN void remove_prefix()
Definition: daw_json_parse_policy.h:337
daw::json::BasicParsePolicy::exec_tag
static constexpr exec_tag_t exec_tag
Definition: daw_json_parse_policy.h:111
daw::json::BasicParsePolicy::front
constexpr DAW_ATTRIBUTE_FLATTEN char front() const
Definition: daw_json_parse_policy.h:325