 |
DAW JSON Link
|
Go to the documentation of this file.
18 #include <daw/cpp_17.h>
19 #include <daw/daw_hide.h>
25 #include <type_traits>
28 namespace json_details {
29 template<
typename Alloc,
bool >
30 class AllocatorWrapperBase {
34 AllocatorWrapperBase( Alloc &alloc ) noexcept
35 : allocator_ptr( &alloc ) {}
37 Alloc &get_allocator( )
const {
38 return *allocator_ptr;
42 template<
typename Alloc>
43 class AllocatorWrapperBase<Alloc, true > {
44 static constexpr Alloc allocator{ };
47 constexpr AllocatorWrapperBase( ) =
default;
48 constexpr AllocatorWrapperBase( Alloc & ) noexcept {}
50 Alloc &get_allocator( )
const {
55 template<
typename Alloc>
56 struct AllocatorWrapper
57 : AllocatorWrapperBase<Alloc, std::is_empty_v<Alloc>> {
59 AllocatorWrapper( Alloc &alloc ) noexcept
60 : AllocatorWrapperBase<Alloc, std::is_empty_v<Alloc>>( alloc ) {}
62 static constexpr
bool has_allocator =
true;
63 using allocator_type = Alloc;
66 using allocator_type_as =
67 typename std::allocator_traits<Alloc>::template rebind_alloc<T>;
70 auto get_allocator_for( )
const {
71 return static_cast<allocator_type_as<T>
>( this->get_allocator( ) );
75 struct NoAllocator {};
77 class AllocatorWrapper<NoAllocator> {
79 constexpr AllocatorWrapper( ) noexcept = default;
80 static constexpr
bool has_allocator = false;
82 using allocator_type = std::allocator<
char>;
85 using allocator_type_as = std::allocator<T>;
88 auto get_allocator_for( )
const {
89 return std::allocator<T>( );
104 template<
bool IsUncheckedInput,
typename CommentPolicy,
typename ExecMode,
105 bool AllowEscapedNames,
106 typename Allocator = json_details::NoAllocator>
138 : json_details::AllocatorWrapper<Allocator>( alloc )
153 : json_details::AllocatorWrapper<Allocator>( alloc )
171 result.class_first = cf;
174 result.class_last = cl;
179 template<
typename Alloc>
182 AllowEscapedNames, Alloc>;
184 template<
typename Alloc>
188 return { f, l, cf, cl, alloc };
191 template<
typename Alloc>
194 AllowEscapedNames, Alloc>
197 if constexpr( std::is_same_v<Alloc, json_details::NoAllocator> ) {
201 p.get_allocator( ) );
202 result.counter = p.counter;
207 template<
typename Alloc>
208 inline constexpr with_allocator_type<Alloc>
218 AllowEscapedNames, json_details::NoAllocator>;
235 template<
typename Alloc>
236 static inline constexpr with_allocator_type<Alloc>
238 return { f, l, f, l, alloc };
248 return { f, l, cf, cl };
251 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
iterator
256 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
iterator
261 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
iterator end( )
const {
265 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
bool empty( )
const {
269 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
bool
274 template<std::
size_t N>
275 inline constexpr
bool starts_with(
char const ( &rhs )[N] )
const {
276 if(
size( ) < ( N - 1 ) ) {
280 for( std::size_t n = 0; n < ( N - 1 ); ++n ) {
281 result = result & (
first[n] == rhs[n] );
291 first =
reinterpret_cast<char const *
>( std::memchr(
294 while( *
first != c ) {
305 first =
reinterpret_cast<char const *
>( std::memchr(
319 move_to_next_of_unchecked<c>( );
321 move_to_next_of_checked<c>( );
325 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
char front( )
const {
329 [[nodiscard]]
inline constexpr std::size_t
size( )
const {
330 return static_cast<std::size_t
>(
last -
first );
333 [[nodiscard]]
inline constexpr
bool is_null( )
const {
334 return first ==
nullptr;
341 DAW_ATTRIBUTE_FLATTEN
inline constexpr
void remove_prefix( std::size_t n ) {
342 first +=
static_cast<std::ptrdiff_t
>( n );
351 return CommentPolicy::trim_left_checked( *
this );
355 return CommentPolicy::trim_left_unchecked( *
this );
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 ) ) {
367 while( ( f < l ) and ( (
static_cast<unsigned char>( *f ) > 0x20 ) &
368 not CommentPolicy::is_literal_end( *f ) ) ) {
376 return CommentPolicy::is_literal_end( *
first );
379 DAW_ATTRIBUTE_FLATTEN [[nodiscard]]
inline constexpr
bool
383 return static_cast<unsigned char>( *first ) <= 0x20U;
386 DAW_ATTRIBUTE_FLATTEN [[nodiscard]]
inline constexpr
bool
388 return static_cast<unsigned char>( *first ) <= 0x20U;
409 ( ( *
first ==
'e' ) bitor ( *
first ==
'E' ) );
422 if( *
first ==
',' ) {
428 template<
char EndChar = '\0'>
432 if( *
first ==
',' ) {
437 if( ( not at_first ) & (
first <
last ) ) {
438 if( *
first ==
',' ) {
442 if constexpr( EndChar !=
'\0' ) {
444 ErrorReason::ExpectedTokenNotFound, *
this );
472 return parse_policy_details::in<
'"',
'}'>( *first );
476 return parse_policy_details::in<',', '}', ']'>( *
first );
479 template<
char PrimLeft,
char PrimRight,
char SecLeft,
char SecRight>
480 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
Range
483 PrimLeft, PrimRight, SecLeft, SecRight>( *this );
486 template<
char PrimLeft,
char PrimRight,
char SecLeft,
char SecRight>
487 [[nodiscard]] DAW_ATTRIBUTE_FLATTEN
inline constexpr
Range
490 PrimLeft, PrimRight, SecLeft, SecRight>( *this );
516 template<
typename ExecTag,
typename Allocator = json_details::NoAllocator>
520 template<
typename ExecTag,
typename Allocator = json_details::NoAllocator>
530 template<
typename ExecTag,
typename Allocator = json_details::NoAllocator>
535 template<
typename ExecTag,
typename Allocator = json_details::NoAllocator>
550 template<
typename ExecTag,
typename Allocator = json_details::NoAllocator>
559 template<
typename ExecTag,
typename Allocator = json_details::NoAllocator>
563 namespace json_details {
569 template<
typename ParsePolicy>
570 inline constexpr
bool is_guaranteed_rvo_v =
571 ParsePolicy::exec_tag_t::always_rvo;
constexpr void set_class_position()
Definition: daw_json_parse_policy.h:345
constexpr void move_to_end_of_literal()
Definition: daw_json_parse_policy.h:358
static constexpr without_allocator_type without_allocator(BasicParsePolicy p)
Definition: daw_json_parse_policy.h:221
constexpr BasicParsePolicy(iterator f, iterator l)
Definition: daw_json_parse_policy.h:130
constexpr bool starts_with(char const (&rhs)[N]) const
Definition: daw_json_parse_policy.h:275
constexpr bool is_opening_brace_checked() const
Definition: daw_json_parse_policy.h:395
constexpr void trim_left()
Definition: daw_json_parse_policy.h:412
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:196
constexpr Range skip_array()
Definition: daw_json_parse_policy.h:501
Definition: daw_json_event_parser.h:17
ExecMode exec_tag_t
Definition: daw_json_parse_policy.h:110
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:206
char const * iterator
Definition: daw_json_parse_policy.h:108
iterator class_first
Definition: daw_json_parse_policy.h:123
constexpr void trim_left_checked()
Definition: daw_json_parse_policy.h:350
constexpr bool is_opening_bracket_checked() const
Definition: daw_json_parse_policy.h:391
constexpr bool is_at_next_class_member() const
Definition: daw_json_parse_policy.h:471
constexpr void clean_tail_unchecked()
Definition: daw_json_parse_policy.h:420
constexpr DAW_ATTRIBUTE_FLATTEN bool has_more() const
Definition: daw_json_parse_policy.h:270
constexpr bool is_exponent_checked() const
Definition: daw_json_parse_policy.h:407
constexpr BasicParsePolicy()=default
constexpr DAW_ATTRIBUTE_FLATTEN void move_to_next_of()
Definition: daw_json_parse_policy.h:317
Definition: daw_json_exec_modes.h:14
constexpr DAW_ATTRIBUTE_FLATTEN void move_to_next_of_checked()
Definition: daw_json_parse_policy.h:301
constexpr std::size_t size() const
Definition: daw_json_parse_policy.h:329
constexpr void move_to_next_class_member()
Definition: daw_json_parse_policy.h:467
constexpr DAW_ATTRIBUTE_FLATTEN void move_to_next_of_unchecked()
Definition: daw_json_parse_policy.h:287
constexpr without_allocator_type without_allocator() const
Definition: daw_json_parse_policy.h:228
constexpr DAW_ATTRIBUTE_FLATTEN void clean_tail()
Definition: daw_json_parse_policy.h:459
iterator first
Definition: daw_json_parse_policy.h:121
constexpr bool is_closing_brace_checked() const
Definition: daw_json_parse_policy.h:399
constexpr BasicParsePolicy copy(iterator f=iterator{ }, iterator l=iterator{ }, iterator cf=iterator{ }, iterator cl=iterator{ }) const
Definition: daw_json_parse_policy.h:159
constexpr auto with_allocator(BasicParsePolicy< IsUncheckedInput, CommentPolicy, ExecMode, AllowEscapedNames, Alloc > p) const
Definition: daw_json_parse_policy.h:193
constexpr void clean_tail_checked()
Definition: daw_json_parse_policy.h:451
constexpr DAW_ATTRIBUTE_FLATTEN Range skip_bracketed_item_checked()
Definition: daw_json_parse_policy.h:481
std::size_t counter
Definition: daw_json_parse_policy.h:125
constexpr DAW_ATTRIBUTE_FLATTEN bool empty() const
Definition: daw_json_parse_policy.h:265
constexpr bool is_quotes_checked() const
Definition: daw_json_parse_policy.h:403
static constexpr without_allocator_type without_allocator(iterator f, iterator l, iterator cf, iterator cl)
Definition: daw_json_parse_policy.h:247
constexpr bool is_null() const
Definition: daw_json_parse_policy.h:333
constexpr Range skip_class()
Definition: daw_json_parse_policy.h:493
constexpr void clean_end_of_value(bool at_first)
Definition: daw_json_parse_policy.h:429
constexpr DAW_ATTRIBUTE_FLATTEN void remove_prefix(std::size_t n)
Definition: daw_json_parse_policy.h:341
iterator class_last
Definition: daw_json_parse_policy.h:124
constexpr DAW_ATTRIBUTE_FLATTEN bool is_space_unchecked() const
Definition: daw_json_parse_policy.h:387
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
constexpr BasicParsePolicy(iterator f, iterator l, Allocator &alloc)
Definition: daw_json_parse_policy.h:136
static constexpr bool is_unchecked_input
Definition: daw_json_parse_policy.h:109
constexpr DAW_ATTRIBUTE_FLATTEN iterator end() const
Definition: daw_json_parse_policy.h:261
constexpr bool is_literal_end() const
Definition: daw_json_parse_policy.h:375
static constexpr without_allocator_type without_allocator(iterator f, iterator l)
Definition: daw_json_parse_policy.h:242
static constexpr bool force_name_equal_check
Definition: daw_json_parse_policy.h:113
constexpr BasicParsePolicy(iterator f, iterator l, iterator cf, iterator cl)
Definition: daw_json_parse_policy.h:144
constexpr void trim_left_unchecked()
Definition: daw_json_parse_policy.h:354
char CharT
Definition: daw_json_parse_policy.h:114
constexpr DAW_ATTRIBUTE_FLATTEN Range skip_bracketed_item_unchecked()
Definition: daw_json_parse_policy.h:488
#define DAW_JSON_LIKELY(Bool)
Definition: daw_json_assert.h:34
static constexpr with_allocator_type< Alloc > with_allocator(iterator f, iterator l, Alloc &alloc)
Definition: daw_json_parse_policy.h:237
constexpr DAW_ATTRIBUTE_FLATTEN iterator begin() const
Definition: daw_json_parse_policy.h:257
constexpr BasicParsePolicy(iterator f, iterator l, iterator cf, iterator cl, Allocator &alloc)
Definition: daw_json_parse_policy.h:151
static constexpr bool allow_escaped_names
Definition: daw_json_parse_policy.h:112
iterator last
Definition: daw_json_parse_policy.h:122
constexpr DAW_ATTRIBUTE_FLATTEN bool is_space_checked() const
Definition: daw_json_parse_policy.h:380
constexpr bool is_at_token_after_value() const
Definition: daw_json_parse_policy.h:475
BasicParsePolicy< IsUncheckedInput, CommentPolicy, ExecMode, AllowEscapedNames, json_details::NoAllocator > without_allocator_type
Definition: daw_json_parse_policy.h:218
constexpr with_allocator_type< Alloc > with_allocator(Alloc &alloc) const
Definition: daw_json_parse_policy.h:209
BasicParsePolicy Range
Definition: daw_json_parse_policy.h:126
Definition: daw_json_parse_policy.h:107
constexpr DAW_ATTRIBUTE_FLATTEN iterator data() const
Definition: daw_json_parse_policy.h:252
constexpr DAW_ATTRIBUTE_FLATTEN void remove_prefix()
Definition: daw_json_parse_policy.h:337
static constexpr exec_tag_t exec_tag
Definition: daw_json_parse_policy.h:111
constexpr DAW_ATTRIBUTE_FLATTEN char front() const
Definition: daw_json_parse_policy.h:325