16 #include <daw/daw_cxmath.h>
17 #include <daw/daw_move.h>
18 #include <daw/daw_scope_guard.h>
19 #include <daw/daw_traits.h>
20 #include <daw/daw_utility.h>
28 #include <string_view>
29 #include <type_traits>
34 template<
typename CharT,
typename ParseState>
35 struct op_star_cleanup {
40 DAW_SG_CXDTOR
inline ~op_star_cleanup( ) noexcept( false ) {
41 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
42 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
46 if( std::uncaught_exceptions( ) == 0 ) {
49 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
61 template<
typename JsonElement,
64 using CharT =
typename ParsePolicy::CharT;
66 template<
typename String>
67 static inline constexpr ParsePolicy
68 get_range(
String &&data, std::string_view member_path ) {
70 std::is_convertible_v<decltype( std::data( data ) ), CharT *>,
71 "Attempt to assign a const char * to a char *" );
73 auto [is_found, result] = json_details::find_range<ParsePolicy>(
75 { std::data( member_path ), std::size( member_path ) } );
77 daw_json_assert( result.front( ) ==
'[', ErrorReason::InvalidArrayStart,
85 static_assert( traits::not_same<element_type, void>::value,
86 "Unknown JsonElement type." );
95 using ParseState = ParsePolicy;
96 ParseState m_state = ParseState( );
101 mutable CharT *m_can_skip =
nullptr;
109 daw::remove_cvref_t<String>>::value,
110 std::nullptr_t> =
nullptr>
112 : m_state( ParsePolicy( std::data( jd ),
daw::data_end( jd ) ) ) {
116 "String requires being able to call std::data/std::size. char const "
117 "* are not able to do this, pass a string_view for char const * to "
118 "ensure you are aware of the strlen cost" );
121 std::is_convertible_v<decltype( std::data( jd ) ), CharT *> );
122 m_state.trim_left( );
124 ErrorReason::InvalidArrayStart, m_state );
126 m_state.remove_prefix( );
127 m_state.trim_left( );
133 daw::remove_cvref_t<String>>::value,
134 std::nullptr_t> =
nullptr>
136 String &&jd, std::string_view start_path )
137 : m_state( get_range( DAW_FWD2(
String, jd ), start_path ) ) {
141 "String requires being able to call std::data/std::size. char const "
142 "* are not able to do this, pass a string_view for char const * to "
143 "ensure you are aware of the strlen cost" );
146 std::is_convertible_v<decltype( std::data( jd ) ), CharT *>,
147 "Attempt to assign a const char * to a char *" );
149 m_state.trim_left( );
151 ErrorReason::InvalidArrayStart, m_state );
153 m_state.remove_prefix( );
154 m_state.trim_left( );
164 ErrorReason::UnexpectedEndOfData, m_state );
168 if constexpr( json_details::is_guaranteed_rvo_v<ParsePolicy> ) {
169 auto const run_after_parse =
171 (void)run_after_parse;
172 return json_details::parse_value<element_type>(
175 auto result = json_details::parse_value<element_type>(
200 ErrorReason::UnexpectedEndOfData, m_state );
205 (void)json_details::skip_known_value<element_type>( m_state );
207 m_state.move_next_member_or_end( );
225 [[nodiscard]]
inline constexpr
bool good( )
const {
226 return not m_state.is_null( ) and m_state.has_more( ) and
227 m_state.front( ) !=
']';
234 [[nodiscard]]
explicit inline constexpr
operator bool( )
const {
243 [[nodiscard]]
inline constexpr
bool
251 return ( m_state.first == rhs.m_state.first );
259 [[nodiscard]]
inline constexpr
bool
262 return static_cast<bool>( rhs );
267 return m_state.first != rhs.m_state.first;
276 template<
typename JsonElement,
280 using CharT =
typename ParsePolicy::CharT;
292 daw::remove_cvref_t<String>>::value,
293 std::nullptr_t> =
nullptr>
295 : m_first( DAW_FWD2(
String, jd ) ) {
297 std::is_convertible_v<decltype( std::data( jd ) ),
CharT *> );
303 daw::remove_cvref_t<String>>::value,
304 std::nullptr_t> =
nullptr>
306 std::string_view start_path )
307 : m_first( DAW_FWD2(
String, jd ), start_path ) {
309 std::is_convertible_v<decltype( std::data( jd ) ),
CharT *>,
310 "Attempt to assign a const char * to a char *" );
331 [[nodiscard]]
inline constexpr
bool empty( )
const {
332 return m_first == m_last;
Definition: daw_json_iterator.h:63
typename element_type::parse_to_t value_type
Definition: daw_json_iterator.h:87
std::ptrdiff_t difference_type
Definition: daw_json_iterator.h:90
constexpr json_array_iterator(String &&jd, std::string_view start_path)
Definition: daw_json_iterator.h:135
constexpr json_array_iterator operator++(int) &
Definition: daw_json_iterator.h:215
constexpr value_type operator*() const
Definition: daw_json_iterator.h:162
constexpr json_array_iterator()=default
constexpr json_array_iterator(String &&jd)
Definition: daw_json_iterator.h:111
constexpr json_array_iterator & operator++()
Definition: daw_json_iterator.h:198
typename json_details::json_deduced_type< JsonElement >::without_name element_type
Definition: daw_json_iterator.h:84
value_type reference
Definition: daw_json_iterator.h:88
constexpr bool good() const
Definition: daw_json_iterator.h:225
constexpr bool operator==(json_array_iterator const &rhs) const
Definition: daw_json_iterator.h:244
constexpr bool operator!=(json_array_iterator const &rhs) const
Definition: daw_json_iterator.h:260
pointer operator->() const
Definition: daw_json_iterator.h:190
std::input_iterator_tag iterator_category
Definition: daw_json_iterator.h:92
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:178
CharT *& m_can_skip
Definition: daw_json_iterator.h:36
ParseState & tmp
Definition: daw_json_iterator.h:37
typename json_type_deducer< T, has_json_data_contract_trait_v< T >, json_details::is_a_json_type_v< T >, has_json_link_quick_map_v< T >, is_container_v< T > >::type json_deduced_type
Definition: daw_json_parse_common.h:931
constexpr bool is_string_view_like_v
Definition: daw_json_traits.h:499
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_enums.h:106
BasicParsePolicy<> NoCommentSkippingPolicyChecked
Definition: daw_json_parse_policy.h:540
Definition: daw_from_json.h:22
Definition: daw_from_json.h:22
Definition: daw_json_parse_policy.h:47
Definition: daw_json_iterator.h:278
constexpr bool empty() const
Definition: daw_json_iterator.h:331
typename ParsePolicy::CharT CharT
Definition: daw_json_iterator.h:280
constexpr json_array_range(String &&jd)
Definition: daw_json_iterator.h:294
constexpr iterator end()
Definition: daw_json_iterator.h:323
constexpr json_array_range(String &&jd, std::string_view start_path)
Definition: daw_json_iterator.h:305
constexpr json_array_range()=default
json_array_iterator< JsonElement, ParsePolicy > iterator
Definition: daw_json_iterator.h:279
constexpr iterator begin()
Definition: daw_json_iterator.h:316
Definition: daw_json_arrow_proxy.h:16
#define DAW_JSON_VER
Definition: version.h:11