 |
DAW JSON Link
|
Go to the documentation of this file.
14 #include <daw/daw_algorithm.h>
15 #include <daw/daw_array.h>
16 #include <daw/daw_bounded_string.h>
17 #include <daw/daw_cxmath.h>
18 #include <daw/daw_exception.h>
19 #include <daw/daw_parser_helper_sv.h>
20 #include <daw/daw_scope_guard.h>
21 #include <daw/daw_traits.h>
22 #include <daw/daw_utility.h>
23 #include <daw/iterator/daw_back_inserter.h>
31 #include <string_view>
42 template<
typename JsonElement,
46 template<
typename String>
47 static inline constexpr ParsePolicy
48 get_range( String &&data, std::string_view member_path ) {
49 auto [is_found, result] = json_details::find_range<ParsePolicy>(
50 std::forward<String>( data ),
51 { member_path.data( ), member_path.size( ) } );
53 daw_json_assert( result.front( ) ==
'[', ErrorReason::InvalidArrayStart,
60 json_details::unnamed_default_type_mapping<JsonElement>;
61 static_assert( not std::is_same_v<element_type, void>,
62 "Unknown JsonElement type." );
65 using pointer = json_details::arrow_proxy<value_type>;
71 using Range = ParsePolicy;
77 mutable char const *m_can_skip =
nullptr;
82 template<
typename String,
83 daw::enable_when_t<not std::is_same_v<
87 ParsePolicy( std::data( jd ), std::data( jd ) + std::size( jd ) ) ) {
90 daw::traits::is_string_view_like_v<daw::remove_cvref_t<String>>,
91 "StringRaw must be like a string_view" );
94 ErrorReason::InvalidArrayStart, m_state );
100 template<
typename String,
101 daw::enable_when_t<not std::is_same_v<
104 std::string_view start_path )
105 : m_state( get_range( std::forward<String>( jd ), start_path ) ) {
108 daw::traits::is_string_view_like_v<daw::remove_cvref_t<String>>,
109 "StringRaw must be like a string_view" );
112 ErrorReason::InvalidArrayStart, m_state );
125 ErrorReason::UnexpectedEndOfData, m_state );
129 if constexpr( json_details::is_guaranteed_rvo_v<ParsePolicy> ) {
130 auto const ae = daw::on_exit_success( [&] { m_can_skip = tmp.first; } );
131 return json_details::parse_value<element_type>(
134 auto result = json_details::parse_value<element_type>(
137 m_can_skip = tmp.
first;
159 ErrorReason::UnexpectedEndOfData, m_state );
161 m_state.
first = m_can_skip;
162 m_can_skip =
nullptr;
164 (void)json_details::skip_known_value<element_type>( m_state );
184 [[nodiscard]]
inline constexpr
bool good( )
const {
186 m_state.
front( ) !=
']';
193 [[nodiscard]]
explicit inline constexpr
operator bool( )
const {
202 [[nodiscard]]
inline constexpr
bool
210 return ( m_state.
first == rhs.m_state.first );
218 [[nodiscard]]
inline constexpr
bool
221 return static_cast<bool>( rhs );
226 return m_state.
first != rhs.m_state.first;
235 template<
typename JsonElement,
247 template<
typename String,
248 daw::enable_when_t<not std::is_same_v<
251 : m_first( std::forward<String>( jd ) ) {}
253 template<
typename String,
254 daw::enable_when_t<not std::is_same_v<
257 std::string_view start_path )
258 : m_first( std::forward<String>( jd ), start_path ) {}
278 [[nodiscard]]
inline constexpr
bool empty( )
const {
279 return m_first == m_last;
Definition: daw_json_iterator.h:237
constexpr void trim_left()
Definition: daw_json_parse_policy.h:412
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:196
Definition: daw_json_event_parser.h:17
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:206
typename element_type::parse_to_t value_type
Definition: daw_json_iterator.h:63
json_details::unnamed_default_type_mapping< JsonElement > element_type
Definition: daw_json_iterator.h:60
value_type reference
Definition: daw_json_iterator.h:64
constexpr bool is_opening_bracket_checked() const
Definition: daw_json_parse_policy.h:391
constexpr DAW_ATTRIBUTE_FLATTEN bool has_more() const
Definition: daw_json_parse_policy.h:270
constexpr value_type operator*() const
Definition: daw_json_iterator.h:123
json_array_iterator< JsonElement, ParsePolicy > iterator
Definition: daw_json_iterator.h:238
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 good() const
Definition: daw_json_iterator.h:184
constexpr json_array_iterator()=default
constexpr bool is_null() const
Definition: daw_json_parse_policy.h:333
constexpr iterator end()
Definition: daw_json_iterator.h:270
std::ptrdiff_t difference_type
Definition: daw_json_iterator.h:66
constexpr json_array_range(String &&jd, std::string_view start_path)
Definition: daw_json_iterator.h:256
constexpr iterator begin()
Definition: daw_json_iterator.h:263
constexpr json_array_range()=default
pointer operator->() const
Definition: daw_json_iterator.h:149
BasicParsePolicy< false, NoCommentSkippingPolicy, default_exec_tag, false > NoCommentSkippingPolicyChecked
Definition: daw_json_parse_policy.h:511
Definition: daw_json_iterator.h:44
constexpr bool empty() const
Definition: daw_json_iterator.h:278
json_details::arrow_proxy< value_type > pointer
Definition: daw_json_iterator.h:65
constexpr json_array_iterator(String &&jd)
Definition: daw_json_iterator.h:85
constexpr bool operator==(json_array_iterator const &rhs) const
Definition: daw_json_iterator.h:203
std::input_iterator_tag iterator_category
Definition: daw_json_iterator.h:68
constexpr json_array_iterator(String &&jd, std::string_view start_path)
Definition: daw_json_iterator.h:103
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_parse_common.h:495
constexpr json_array_range(String &&jd)
Definition: daw_json_iterator.h:250
constexpr json_array_iterator operator++(int)
Definition: daw_json_iterator.h:174
constexpr json_array_iterator & operator++()
Definition: daw_json_iterator.h:157
Definition: daw_json_parse_policy.h:107
constexpr DAW_ATTRIBUTE_FLATTEN void remove_prefix()
Definition: daw_json_parse_policy.h:337
constexpr DAW_ATTRIBUTE_FLATTEN char front() const
Definition: daw_json_parse_policy.h:325
constexpr bool operator!=(json_array_iterator const &rhs) const
Definition: daw_json_iterator.h:219