11#include "../daw_json_exception.h"
20#include <daw/daw_consteval.h>
21#include <daw/daw_constinit.h>
22#include <daw/daw_fwd_pack_apply.h>
23#include <daw/daw_likely.h>
24#include <daw/daw_traits.h>
33 namespace json_details {
47 template<
typename JsonMember,
typename ParseState>
48 [[nodiscard]] DAW_ATTRIB_INLINE
constexpr json_result<JsonMember>
50 std::size_t &member_index,
60 if constexpr( is_an_ordered_member_v<JsonMember> ) {
61 pocm_details::maybe_skip_members<is_json_nullable_v<json_member_t>>(
62 parse_state, member_index, JsonMember::member_index );
72 if constexpr( is_json_nullable_v<json_member_t> ) {
73 using constructor_t =
typename json_member_t::constructor_t;
82 return parse_value<without_name<json_member_t>>(
96 template<std::size_t member_position,
typename JsonMember,
98 typename ParseState, std::size_t N,
typename CharT,
bool B>
99 [[nodiscard]] DAW_ATTRIB_INLINE
constexpr json_result<JsonMember>
105 ErrorReason::MissingMemberNameOrEndOfClass,
108 auto [loc, known] = find_class_member<member_position, must_exist>(
109 parse_state, locations, is_json_nullable_v<JsonMember>,
114 if constexpr( NeedsClassPositions ) {
119 auto const after_parse = daw::on_scope_exit( [&] {
123 return parse_value<without_name<JsonMember>>(
126 auto result = parse_value<without_name<JsonMember>>(
133 return parse_value<without_name<JsonMember>>(
138 if( loc.is_null( ) ) {
139 if constexpr( is_json_nullable_v<JsonMember> ) {
140 return parse_value<without_name<JsonMember>,
true>(
144 std::data( JsonMember::name ),
145 std::size( JsonMember::name ) ) ),
151 return parse_value<without_name<JsonMember>,
true>(
156 template<
bool IsExactClass,
typename ParseState,
typename OldClassPos>
157 DAW_ATTRIB_INLINE
inline constexpr void
166 if constexpr( IsExactClass ) {
180 typename OldClassPos>
181 struct class_cleanup {
187#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
188 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
189 class_cleanup_now<AllMembersMustExist>(
parse_state,
193 if( std::uncaught_exceptions( ) == 0 ) {
194 class_cleanup_now<AllMembersMustExist>(
parse_state,
197#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
204#if not defined( _MSC_VER ) or defined( __clang__ )
205 template<
typename ParseState,
typename... JsonMembers>
206 inline constexpr auto
217 template<
typename JsonClass,
typename... JsonMembers,
typename ParseState,
219 [[nodiscard]]
constexpr json_result<JsonClass>
222 using T =
typename JsonClass::base_type;
223 using Constructor =
typename JsonClass::constructor_t;
224 static_assert( has_json_data_contract_trait_v<T>,
"Unexpected type" );
225 using must_exist = daw::constant<(
226 json_details::all_json_members_must_exist_v<T, ParseState>
240 if constexpr(
sizeof...( JsonMembers ) == 0 ) {
243 json_details::all_json_members_must_exist_v<T, ParseState>>(
246 if constexpr( use_direct_construction_v<ParseState, JsonClass> ) {
253 using NeedClassPositions = std::bool_constant<(
254 ( JsonMembers::must_be_class_member or ... ) )>;
256#if defined( _MSC_VER ) and not defined( __clang__ )
257 auto known_locations =
260 auto known_locations = known_locations_v<ParseState, JsonMembers...>;
263 if constexpr( use_direct_construction_v<ParseState, JsonClass> ) {
264 auto const run_after_parse = class_cleanup<
265 json_details::all_json_members_must_exist_v<T, ParseState>,
268 (void)run_after_parse;
274 if constexpr( force_aggregate_construction_v<T> ) {
276 Is, traits::nth_type<Is, JsonMembers...>, must_exist::value,
277 NeedClassPositions::value>(
parse_state, known_locations )... };
279 return construct_value_tp<T, Constructor>(
281 Is, traits::nth_type<Is, JsonMembers...>,
282 must_exist::value, NeedClassPositions::value>(
286 if constexpr( force_aggregate_construction_v<T> ) {
288 Is, traits::nth_type<Is, JsonMembers...>, must_exist::value,
289 NeedClassPositions::value>(
parse_state, known_locations )... };
292 json_details::all_json_members_must_exist_v<T, ParseState>>(
296 auto result = construct_value_tp<T, Constructor>(
298 Is, traits::nth_type<Is, JsonMembers...>,
299 must_exist::value, NeedClassPositions::value>(
303 json_details::all_json_members_must_exist_v<T, ParseState>>(
315 template<
typename JsonClass,
typename... JsonMembers,
typename ParseState>
316 [[nodiscard]]
static constexpr json_result<JsonClass>
320 using T =
typename JsonClass::base_type;
321 using Constructor =
typename JsonClass::constructor_t;
322 static_assert( has_json_data_contract_trait_v<T>,
"Unexpected type" );
324 std::is_invocable<Constructor,
325 typename JsonMembers::parse_to_t...>::value,
326 "Supplied types cannot be used for construction of this type" );
336 size_t current_idx = 0;
338 if constexpr( use_direct_construction_v<ParseState, JsonClass> ) {
340 json_details::all_json_members_must_exist_v<T, ParseState>,
343 (void)run_after_parse;
344 if constexpr( force_aggregate_construction_v<T> ) {
346 template_arg<JsonMembers>, current_idx,
parse_state )... };
348 return construct_value_tp<T, Constructor>(
351 template_arg<JsonMembers>, current_idx,
parse_state )... } );
355 if constexpr( force_aggregate_construction_v<T> ) {
357 template_arg<JsonMembers>, current_idx,
parse_state )... };
359 return construct_value_tp<T, Constructor>(
362 template_arg<JsonMembers>, current_idx,
parse_state )... } );
#define daw_json_assert_weak(Bool,...)
Definition: daw_json_assert.h:190
OldClassPos const & old_class_pos
Definition: daw_json_parse_class.h:183
ParseState & parse_state
Definition: daw_json_parse_class.h:182
#define CPP20CONSTEXPR
Definition: daw_json_parse_value.h:40
DAW_ATTRIB_FLATINLINE DAW_JSON_MAKE_LOC_INFO_CONSTEVAL auto make_locations_info()
Definition: daw_json_location_info.h:168
constexpr json_result< JsonClass > parse_json_class(ParseState &parse_state, std::index_sequence< Is... >)
Definition: daw_json_parse_class.h:220
typename JsonMember::without_name without_name
Definition: daw_json_traits.h:104
static constexpr json_result< JsonClass > parse_json_tuple_class(template_params< JsonClass, JsonMembers... >, ParseState &parse_state)
Definition: daw_json_parse_class.h:317
std::bool_constant< daw::is_detected_v< json_type_t, T > > is_a_json_type
Definition: daw_json_traits.h:446
typename daw::detected_or_t< T, ordered_member_subtype_test, T > ordered_member_subtype_t
Definition: daw_json_parse_common.h:51
constexpr bool all_json_members_must_exist_v
Definition: daw_json_traits.h:641
constexpr DAW_ATTRIB_INLINE json_result< JsonMember > parse_ordered_class_member(template_param< JsonMember >, std::size_t &member_index, ParseState &parse_state)
Parse a class member in an ordered json class(class as array). These are often referred to as JSON tu...
Definition: daw_json_parse_class.h:49
AllMembersMustExist
Definition: daw_json_location_info.h:206
static constexpr DAW_ATTRIB_FLATINLINE auto construct_value(template_params< Value, Constructor >, ParseState &parse_state, Args &&...args)
Definition: daw_json_parse_common.h:60
typename JsonMember::parse_to_t json_result
Definition: daw_json_parse_common.h:200
constexpr bool use_direct_construction_v
Definition: daw_json_parse_common.h:959
constexpr DAW_ATTRIB_INLINE json_result< JsonMember > parse_class_member(ParseState &parse_state, locations_info_t< N, CharT, B > &locations)
Definition: daw_json_parse_class.h:100
daw::constant< v > ParseTag
Definition: daw_json_enums.h:119
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:99
Definition: daw_json_parse_value.h:968
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16