19 #include <daw/daw_move.h>
24 #include <string_view>
33 template<
typename ParseState>
34 class basic_json_value;
40 template<
typename ParseState>
42 std::optional<std::string_view>
name;
46 template<std::
size_t Idx,
typename ParseState>
47 constexpr decltype(
auto )
49 static_assert( Idx < 2 );
50 if constexpr( Idx == 0 ) {
57 template<std::
size_t Idx,
typename ParseState>
59 static_assert( Idx < 2 );
60 if constexpr( Idx == 0 ) {
67 template<std::
size_t Idx,
typename ParseState>
68 constexpr decltype(
auto )
70 static_assert( Idx < 2 );
71 if constexpr( Idx == 0 ) {
81 template<
typename ParseState>
82 class tuple_element<0,
daw::json::basic_json_pair<ParseState>> {
84 using type = std::optional<std::string_view>;
87 template<
typename ParseState>
88 class tuple_element<1,
daw::json::basic_json_pair<ParseState>> {
93 template<
typename ParseState>
94 class tuple_size<
daw::json::basic_json_pair<ParseState>>
95 :
public std::integral_constant<std::size_t, 2> {};
104 template<
typename ParseState>
117 ParseState m_state{ };
131 [[nodiscard]] constexpr std::optional<std::string_view>
name( )
const {
137 return std::string_view( std::data( result ), std::size( result ) );
147 return ParseState( m_state );
160 return { { }, ParseState( m_state.first, m_state.last ) };
164 return { std::string_view( std::data(
name ), std::size(
name ) ),
188 m_state.move_next_member_or_end( );
208 return *m_state.class_first ==
'[';
216 return *m_state.class_first ==
'{';
223 [[nodiscard]] constexpr
bool good( )
const {
224 if( not m_state.has_more( ) or m_state.is_null( ) ) {
227 switch( m_state.front( ) ) {
257 [[nodiscard]] constexpr
explicit operator bool( )
const {
270 [[nodiscard]] constexpr
bool
274 return m_state.first == rhs.m_state.first;
278 return not rhs.
good( );
286 [[nodiscard]] constexpr
bool
292 template<
typename ParseState>
295 using CharT =
typename ParseState::CharT;
306 template<
typename ParseState>
315 template<
typename ParseState>
317 ParseState m_parse_state{ };
320 using CharT =
typename ParseState::CharT;
333 m_parse_state.trim_left( );
340 std::enable_if_t<json_details::is_string_view_like_v<String>,
341 std::nullptr_t> =
nullptr>
343 : m_parse_state( std::data( sv ),
daw::data_end( sv ) ) {}
349 : m_parse_state( first, first + static_cast<std::ptrdiff_t>( sz ) ) {}
355 : m_parse_state( first, last ) {}
362 return m_parse_state;
372 ParseState( m_parse_state.first, m_parse_state.last );
392 if( not m_parse_state.has_more( ) ) {
395 switch( m_parse_state.front( ) ) {
415 if constexpr( not ParseState::is_unchecked_input ) {
416 if( m_parse_state.starts_with(
"true" ) ) {
424 if constexpr( not ParseState::is_unchecked_input ) {
425 if( m_parse_state.starts_with(
"false" ) ) {
434 ErrorReason::InvalidNull, m_parse_state );
451 return { std::data( result ), std::size( result ) };
468 template<
typename Allocator = std::allocator<
char>,
469 typename Traits = std::
char_traits<
char>>
470 [[nodiscard]] std::basic_string<char, Traits, Allocator>
471 get_string( Allocator
const &alloc = std::allocator<char>( ) )
const {
478 return { std::data( result ), std::size( result ), alloc };
485 [[nodiscard]] constexpr
bool is_null( )
const {
486 return ( m_parse_state.starts_with(
"null" ) );
494 return m_parse_state.is_opening_brace_checked( );
502 return m_parse_state.is_opening_bracket_checked( );
510 if( not m_parse_state.has_more( ) ) {
513 switch( m_parse_state.front( ) ) {
535 [[nodiscard]]
inline constexpr
bool is_string( )
const {
536 return m_parse_state.is_quotes_checked( );
543 [[nodiscard]] constexpr
bool is_bool( )
const {
544 if( not m_parse_state.has_more( ) ) {
547 switch( m_parse_state.front( ) ) {
549 if constexpr( not ParseState::is_unchecked_input ) {
550 return m_parse_state ==
"true";
555 if constexpr( not ParseState::is_unchecked_input ) {
556 return m_parse_state ==
"false";
573 template<
typename NewParseState>
574 explicit inline constexpr
577 NewParseState( m_parse_state.first, m_parse_state.last );
578 new_range.class_first = m_parse_state.class_first;
579 new_range.class_last = m_parse_state.class_last;
584 namespace json_details {
586 inline constexpr
bool is_string_view_like_v<basic_json_value<T>> =
false;
Definition: daw_json_value.h:316
constexpr ParseState get_raw_state() const
Definition: daw_json_value.h:361
constexpr basic_json_value(String &&sv)
Definition: daw_json_value.h:342
constexpr std::string_view get_string_view() const
Definition: daw_json_value.h:444
constexpr basic_json_value(ParseState parse_state)
Definition: daw_json_value.h:330
std::ptrdiff_t difference_type
Definition: daw_json_value.h:324
JsonBaseParseTypes type() const
Definition: daw_json_value.h:391
constexpr bool is_bool() const
Definition: daw_json_value.h:543
std::basic_string< char, Traits, Allocator > get_string(Allocator const &alloc=std::allocator< char >()) const
Definition: daw_json_value.h:471
std::size_t size_type
Definition: daw_json_value.h:323
constexpr bool is_null() const
Definition: daw_json_value.h:485
typename ParseState::CharT CharT
Definition: daw_json_value.h:320
constexpr basic_json_value(CharT *first, std::size_t sz)
Definition: daw_json_value.h:348
constexpr iterator begin() const
Definition: daw_json_value.h:370
constexpr iterator end() const
Definition: daw_json_value.h:382
constexpr bool is_string() const
Definition: daw_json_value.h:535
constexpr bool is_unknown() const
Definition: daw_json_value.h:569
constexpr bool is_number() const
Definition: daw_json_value.h:509
constexpr ParseState get_state() const
Definition: daw_json_value.h:454
constexpr basic_json_value(CharT *first, CharT *last)
Definition: daw_json_value.h:354
constexpr bool is_array() const
Definition: daw_json_value.h:501
constexpr bool is_class() const
Definition: daw_json_value.h:493
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
ParseState & parse_state
Definition: daw_json_parse_class.h:201
constexpr DAW_ATTRIB_FLATTEN daw::string_view parse_name(ParseState &parse_state)
Definition: daw_json_parse_name.h:128
constexpr ParseState skip_value(ParseState &parse_state)
Definition: daw_json_skip.h:298
basic_json_value_iterator_range(basic_json_value_iterator< ParseState >, basic_json_value_iterator< ParseState >) -> basic_json_value_iterator_range< ParseState >
DAW_ATTRIB_NOINLINE void daw_json_error(ErrorReason reason)
Definition: daw_json_assert.h:39
JsonBaseParseTypes
Definition: daw_json_enums.h:40
constexpr decltype(auto) get(basic_json_pair< ParseState > const &parse_state)
Definition: daw_json_value.h:48
Definition: daw_from_json.h:22
Definition: daw_from_json.h:22
Definition: daw_json_value.h:41
std::optional< std::string_view > name
Definition: daw_json_value.h:42
basic_json_value< ParseState > value
Definition: daw_json_value.h:43
Definition: daw_json_value.h:293
iterator last
Definition: daw_json_value.h:297
iterator first
Definition: daw_json_value.h:296
typename ParseState::CharT CharT
Definition: daw_json_value.h:295
constexpr iterator end()
Definition: daw_json_value.h:302
constexpr iterator begin()
Definition: daw_json_value.h:299
Definition: daw_json_value.h:105
std::string_view key_type
Definition: daw_json_value.h:106
constexpr bool operator!=(basic_json_value_iterator< ParseState > const &rhs) const
Definition: daw_json_value.h:287
std::ptrdiff_t difference_type
Definition: daw_json_value.h:113
constexpr basic_json_value_iterator()=default
constexpr basic_json_value_iterator operator++(int)
Definition: daw_json_value.h:197
constexpr ParseState const & get_raw_state() const
Definition: daw_json_value.h:261
constexpr std::optional< std::string_view > name() const
Definition: daw_json_value.h:131
constexpr bool is_array() const
Definition: daw_json_value.h:207
constexpr basic_json_pair< ParseState > operator*()
Definition: daw_json_value.h:158
constexpr bool good() const
Definition: daw_json_value.h:223
basic_json_pair< ParseState > value_type
Definition: daw_json_value.h:110
constexpr basic_json_value_iterator & operator++()
Definition: daw_json_value.h:182
std::forward_iterator_tag iterator_category
Definition: daw_json_value.h:114
constexpr basic_json_value< ParseState > value() const
Definition: daw_json_value.h:145
constexpr bool is_class() const
Definition: daw_json_value.h:215
constexpr pointer operator->()
Definition: daw_json_value.h:174
constexpr bool operator==(basic_json_value_iterator< ParseState > const &rhs) const
Definition: daw_json_value.h:271
Definition: daw_json_arrow_proxy.h:16
#define DAW_JSON_VER
Definition: version.h:11