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>
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 ) ) ) {
115 traits::is_string_view_like_v<daw::remove_cvref_t<String>>,
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 ) ) {
140 traits::is_string_view_like_v<daw::remove_cvref_t<String>>,
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 );
170 auto const run_after_parse =
172 (void)run_after_parse;
173 return json_details::parse_value<element_type>(
176 auto result = json_details::parse_value<element_type>(
201 ErrorReason::UnexpectedEndOfData, m_state );
206 (void)json_details::skip_known_value<element_type>( m_state );
208 m_state.move_next_member_or_end( );
226 [[nodiscard]]
inline constexpr bool good( )
const {
227 return not m_state.is_null( ) and m_state.has_more( ) and
228 m_state.front( ) !=
']';
235 [[nodiscard]]
explicit inline constexpr operator bool( )
const {
244 [[nodiscard]]
inline constexpr bool
252 return ( m_state.first == rhs.m_state.first );
260 [[nodiscard]]
inline constexpr bool
263 return static_cast<bool>( rhs );
268 return m_state.first != rhs.m_state.first;
277 template<
typename JsonElement,
281 using CharT =
typename ParsePolicy::CharT;
293 daw::remove_cvref_t<String>>::value,
294 std::nullptr_t> =
nullptr>
296 : m_first( DAW_FWD2(
String, jd ) ) {
298 std::is_convertible_v<
decltype( std::data( jd ) ),
CharT *> );
304 daw::remove_cvref_t<String>>::value,
305 std::nullptr_t> =
nullptr>
307 std::string_view start_path )
308 : m_first( DAW_FWD2(
String, jd ), start_path ) {
310 std::is_convertible_v<
decltype( std::data( jd ) ),
CharT *>,
311 "Attempt to assign a const char * to a char *" );
332 [[nodiscard]]
inline constexpr bool empty( )
const {
333 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:216
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
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:226
constexpr bool operator==(json_array_iterator const &rhs) const
Definition: daw_json_iterator.h:245
constexpr bool operator!=(json_array_iterator const &rhs) const
Definition: daw_json_iterator.h:261
constexpr json_array_iterator & operator++()
Definition: daw_json_iterator.h:199
pointer operator->() const
Definition: daw_json_iterator.h:191
std::input_iterator_tag iterator_category
Definition: daw_json_iterator.h:92
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:190
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:179
CharT *& m_can_skip
Definition: daw_json_iterator.h:36
ParseState & tmp
Definition: daw_json_iterator.h:37
typename json_type_deducer< T, is_an_ordered_member_v< 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:953
constexpr bool use_direct_construction_v
Definition: daw_json_parse_common.h:959
daw::constant< v > ParseTag
Definition: daw_json_enums.h:119
BasicParsePolicy<> NoCommentSkippingPolicyChecked
Definition: daw_json_parse_policy.h:550
Definition: daw_from_json.h:22
Definition: daw_from_json.h:22
Definition: daw_json_parse_policy.h:48
Definition: daw_json_iterator.h:279
constexpr bool empty() const
Definition: daw_json_iterator.h:332
typename ParsePolicy::CharT CharT
Definition: daw_json_iterator.h:281
constexpr json_array_range(String &&jd)
Definition: daw_json_iterator.h:295
constexpr iterator end()
Definition: daw_json_iterator.h:324
constexpr json_array_range(String &&jd, std::string_view start_path)
Definition: daw_json_iterator.h:306
constexpr json_array_range()=default
json_array_iterator< JsonElement, ParsePolicy > iterator
Definition: daw_json_iterator.h:280
constexpr iterator begin()
Definition: daw_json_iterator.h:317
Definition: daw_json_arrow_proxy.h:16
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16