11 #include "../daw_json_exception.h"
20 #include <daw/daw_fwd_pack_apply.h>
21 #include <daw/daw_likely.h>
22 #include <daw/daw_traits.h>
27 #include <type_traits>
31 namespace json_details {
32 namespace pocm_details {
40 template<
bool Nullable,
typename ParseState>
41 DAW_ATTRIB_INLINE
inline constexpr
void
43 std::size_t ¤t_position,
44 std::size_t desired_position ) {
47 ErrorReason::OutOfOrderOrderedMembers,
49 constexpr
bool skip_check_end =
50 ParseState::is_unchecked_input and
Nullable;
51 while( ( current_position < desired_position ) &
52 ( skip_check_end or
parse_state.front( ) !=
']' ) ) {
57 ErrorReason::UnexpectedEndOfData,
71 template<
typename JsonMember,
typename ParseState>
72 [[nodiscard]] constexpr json_result<JsonMember>
74 std::size_t &member_index,
84 if constexpr( is_an_ordered_member_v<JsonMember> ) {
85 pocm_details::maybe_skip_members<is_json_nullable_v<json_member_t>>(
86 parse_state, member_index, JsonMember::member_index );
96 if constexpr( is_json_nullable_v<json_member_t> ) {
97 using constructor_t =
typename json_member_t::constructor_t;
106 return parse_value<without_name<json_member_t>>(
120 template<std::size_t member_position,
typename JsonMember,
122 typename ParseState, std::size_t N,
typename CharT,
bool B>
123 [[nodiscard]] constexpr json_result<JsonMember>
129 ErrorReason::MissingMemberNameOrEndOfClass,
132 auto [loc, known] = find_class_member<member_position, must_exist>(
133 parse_state, locations, is_json_nullable_v<JsonMember>,
138 if constexpr( NeedsClassPositions ) {
141 if constexpr( is_guaranteed_rvo_v<ParseState> ) {
142 auto const after_parse = daw::on_scope_exit( [&] {
146 return parse_value<without_name<JsonMember>>(
149 auto result = parse_value<without_name<JsonMember>>(
156 return parse_value<without_name<JsonMember>>(
161 if( loc.is_null( ) ) {
162 if constexpr( is_json_nullable_v<JsonMember> ) {
163 return parse_value<without_name<JsonMember>,
true>(
167 std::data( JsonMember::name ),
168 std::size( JsonMember::name ) ) ),
174 return parse_value<without_name<JsonMember>,
true>(
179 template<
bool IsExactClass,
typename ParseState>
180 DAW_ATTRIB_INLINE
inline constexpr
void
181 class_cleanup_now( ParseState &
parse_state ) noexcept(
false ) {
187 if constexpr( IsExactClass ) {
199 template<
bool AllMembersMustExist,
typename ParseState>
200 struct class_cleanup {
205 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
206 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
207 class_cleanup_now<AllMembersMustExist>(
parse_state );
210 if( std::uncaught_exceptions( ) == 0 ) {
211 class_cleanup_now<AllMembersMustExist>(
parse_state );
213 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
223 #if not defined( _MSC_VER ) or defined( __clang__ )
224 template<
typename ParseState,
typename... JsonMembers>
225 inline constexpr
auto
235 template<
typename JsonClass,
typename... JsonMembers,
typename ParseState,
237 [[nodiscard]] constexpr json_result<JsonClass>
240 using T =
typename JsonClass::base_type;
241 using Constructor =
typename JsonClass::constructor_t;
242 static_assert( has_json_data_contract_trait_v<T>,
"Unexpected type" );
244 json_details::all_json_members_must_exist_v<T, ParseState>
261 if constexpr(
sizeof...( JsonMembers ) == 0 ) {
264 json_details::all_json_members_must_exist_v<T, ParseState>>(
269 constexpr
bool NeedClassPositions =
270 ( ( JsonMembers::must_be_class_member or ... ) );
272 #if defined( _MSC_VER ) and not defined( __clang__ )
273 auto known_locations =
276 auto known_locations = known_locations_v<ParseState, JsonMembers...>;
279 if constexpr( is_guaranteed_rvo_v<ParseState> ) {
280 auto const run_after_parse = class_cleanup<
281 json_details::all_json_members_must_exist_v<T, ParseState>,
283 (void)run_after_parse;
289 if constexpr( force_aggregate_construction_v<T> ) {
292 must_exist, NeedClassPositions>(
295 return construct_value_tp<T, Constructor>(
299 must_exist, NeedClassPositions>(
303 if constexpr( force_aggregate_construction_v<T> ) {
306 must_exist, NeedClassPositions>(
310 json_details::all_json_members_must_exist_v<T, ParseState>>(
314 auto result = construct_value_tp<T, Constructor>(
318 must_exist, NeedClassPositions>(
322 json_details::all_json_members_must_exist_v<T, ParseState>>(
334 template<
typename JsonClass,
typename... JsonMembers,
typename ParseState>
335 [[nodiscard]]
static constexpr json_result<JsonClass>
339 using T =
typename JsonClass::base_type;
340 using Constructor =
typename JsonClass::constructor_t;
341 static_assert( has_json_data_contract_trait_v<T>,
"Unexpected type" );
343 std::is_invocable<Constructor,
344 typename JsonMembers::parse_to_t...>::value,
345 "Supplied types cannot be used for construction of this type" );
354 size_t current_idx = 0;
356 if constexpr( is_guaranteed_rvo_v<ParseState> ) {
358 json_details::all_json_members_must_exist_v<T, ParseState>,
360 (void)run_after_parse;
361 if constexpr( force_aggregate_construction_v<T> ) {
363 template_arg<JsonMembers>, current_idx,
parse_state )... };
365 return construct_value_tp<T, Constructor>(
368 template_arg<JsonMembers>, current_idx,
parse_state )... } );
372 if constexpr( force_aggregate_construction_v<T> ) {
374 template_arg<JsonMembers>, current_idx,
parse_state )... };
376 return construct_value_tp<T, Constructor>(
379 template_arg<JsonMembers>, current_idx,
parse_state )... } );
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:189
ParseState & parse_state
Definition: daw_json_parse_class.h:201
#define CPP20CONSTEXPR
Definition: daw_json_parse_common.h:40
constexpr DAW_ATTRIB_INLINE void maybe_skip_members(ParseState &parse_state, std::size_t ¤t_position, std::size_t desired_position)
Definition: daw_json_parse_class.h:42
constexpr DAW_ATTRIB_FLATINLINE auto make_locations_info()
Definition: daw_json_location_info.h:160
constexpr ParseState skip_value(ParseState &parse_state)
Definition: daw_json_skip.h:298
constexpr json_result< JsonMember > parse_class_member(ParseState &parse_state, locations_info_t< N, CharT, B > &locations)
Definition: daw_json_parse_class.h:124
std::bool_constant< daw::is_detected_v< json_type_t, T > > is_a_json_type
Definition: daw_json_traits.h:426
typename daw::detected_or_t< T, ordered_member_subtype_test, T > ordered_member_subtype_t
Definition: daw_json_parse_common.h:54
constexpr bool all_json_members_must_exist_v
Definition: daw_json_traits.h:606
static constexpr json_result< JsonClass > parse_ordered_json_class(template_params< JsonClass, JsonMembers... >, ParseState &parse_state)
Definition: daw_json_parse_class.h:336
AllMembersMustExist
Definition: daw_json_location_info.h:198
static constexpr DAW_ATTRIB_FLATINLINE auto construct_value(template_params< Value, Constructor >, ParseState &parse_state, Args &&...args)
Definition: daw_json_parse_common.h:63
typename JsonMember::parse_to_t json_result
Definition: daw_json_parse_common.h:205
constexpr json_result< JsonMember > parse_ordered_class_member(template_param< JsonMember >, std::size_t &member_index, ParseState &parse_state)
Definition: daw_json_parse_class.h:73
constexpr json_result< JsonClass > parse_json_class(ParseState &parse_state, std::index_sequence< Is... >)
Definition: daw_json_parse_class.h:238
std::integral_constant< JsonParseTypes, v > ParseTag
Definition: daw_json_enums.h:106
DAW_ATTRIB_NOINLINE void daw_json_error(ErrorReason reason)
Definition: daw_json_assert.h:39
Definition: daw_from_json.h:22
Definition: daw_json_location_info.h:98
Definition: daw_json_parse_value.h:852
#define DAW_JSON_VER
Definition: version.h:11