13 #include <daw/cpp_17.h>
14 #include <daw/daw_fwd_pack_apply.h>
15 #include <daw/daw_move.h>
16 #include <daw/daw_scope_guard.h>
17 #include <daw/daw_traits.h>
23 #include <unordered_map>
32 namespace json_details {
35 decltype(
static_cast<bool>( std::declval<T>( ) ) );
39 daw::is_detected_v<has_op_bool_test, T>;
46 daw::is_detected_v<has_op_star_test, T>;
53 daw::is_detected_v<has_empty_member_test, T>;
57 has_op_bool_v<T> or has_empty_member_v<T>;
61 -> std::enable_if_t<is_readable_v<T>,
bool> {
63 if constexpr( has_op_bool_v<T> ) {
64 return static_cast<bool>( v );
65 }
else if constexpr( has_empty_member_v<T> ) {
66 return not v.empty( );
71 template<
typename Constructor,
typename... Args>
74 template<
typename Constructor,
typename... Args>
78 template<
bool Nullable,
typename Constructor,
typename... Args>
83 std::is_invocable_v<Constructor, Args...>,
85 std::is_invocable_v<Constructor>,
86 std::invoke_result<Constructor>,
87 traits::identity<nullable_constructor_cannot_be_invoked<Constructor>>
92 std::is_invocable_v<Constructor, Args...>,
93 std::invoke_result<Constructor, Args...>,
100 namespace json_details {
101 template<
typename JsonMember>
104 template<
typename JsonMember, JSONNAMETYPE NewName,
bool Cond>
106 Cond,
typename JsonMember::template with_name<NewName>, JsonMember>;
108 template<
typename JsonMember, JSONNAMETYPE NewName>
124 template<
typename T,
typename =
void>
139 namespace json_details {
146 daw::is_detected_v<json_map_alias_test, T>;
156 template<
typename JsonMember>
159 template<
typename JsonMember>
161 daw::is_detected_v<switcher_t, JsonMember>;
173 daw::is_detected<json_details::force_aggregate_construction_test, T>,
174 daw::is_detected<json_details::force_aggregate_construction_test2, T>>>;
180 namespace json_details {
191 [[nodiscard]] DAW_ATTRIB_FLATINLINE
inline constexpr T
192 operator( )( )
const {
196 template<
typename... Args,
197 std::enable_if_t<( std::is_constructible<T, Args...>::value and
198 sizeof...( Args ) > 0 ),
199 std::nullptr_t> =
nullptr>
200 [[nodiscard]] DAW_ATTRIB_FLATINLINE
inline constexpr T
201 operator( )( Args &&...args )
const {
203 return T( DAW_FWD2( Args, args )... );
206 template<
typename... Args,
207 typename std::enable_if_t<
209 daw::not_trait<std::is_constructible<T, Args...>>,
210 daw::traits::is_list_constructible<T, Args...>>::value,
211 std::nullptr_t> =
nullptr>
212 [[nodiscard]] DAW_ATTRIB_FLATINLINE
inline constexpr T
213 operator( )( Args &&...args )
const
214 noexcept( noexcept( T{ DAW_FWD2( Args, args )... } ) ) {
216 return T{ DAW_FWD2( Args, args )... };
220 namespace json_details {
224 template<
typename... Ts>
229 template<
typename Iterator>
230 struct construct_array_cleanup {
234 DAW_SG_CXDTOR
inline ~construct_array_cleanup( ) noexcept( false ) {
235 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
236 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
240 if( std::uncaught_exceptions( ) == 0 ) {
243 #if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
250 template<
typename T, std::
size_t Sz>
251 struct default_constructor<std::array<T, Sz>> {
252 DAW_ATTRIB_FLATINLINE constexpr std::array<T, Sz> operator( )( )
const
253 noexcept( noexcept( std::array<T, Sz>{ } ) ) {
257 DAW_ATTRIB_FLATINLINE constexpr std::array<T, Sz> &&
258 operator( )( std::array<T, Sz> &&v )
const noexcept {
259 return DAW_MOVE( v );
262 template<
typename Iterator, std::size_t... Is>
263 DAW_ATTRIB_FLATINLINE
static constexpr std::array<T, Sz>
264 construct_array( Iterator first, Iterator last,
265 std::index_sequence<Is...> ) {
266 auto const get_result = [&]( std::size_t ) {
267 if( first != last ) {
268 if constexpr( std::is_move_constructible_v<T> ) {
269 auto result = *first;
273 auto const run_after_parse = construct_array_cleanup{ first };
274 (void)run_after_parse;
280 return std::array<T, Sz>{ get_result( Is )... };
283 template<
typename Iterator>
284 DAW_ATTRIB_FLATINLINE constexpr std::array<T, Sz>
285 operator( )( Iterator first, Iterator last )
const {
286 return construct_array( first, last, std::make_index_sequence<Sz>{ } );
290 template<
typename T,
typename Alloc>
291 struct default_constructor<std::vector<T, Alloc>> {
293 DAW_ATTRIB_FLATINLINE
inline std::vector<T, Alloc> operator( )( )
const
294 noexcept( noexcept( std::vector<T, Alloc>( ) ) ) {
298 DAW_ATTRIB_FLATINLINE
inline std::vector<T, Alloc> &&
299 operator( )( std::vector<T, Alloc> &&v )
const
300 noexcept( noexcept( std::vector<T, Alloc>( v ) ) ) {
301 return DAW_MOVE( v );
304 template<
typename Iterator>
305 DAW_ATTRIB_FLATINLINE
inline std::vector<T, Alloc>
306 operator( )( Iterator first, Iterator last,
307 Alloc
const &alloc = Alloc{ } )
const {
308 if constexpr( std::is_same_v<std::random_access_iterator_tag,
309 typename std::iterator_traits<
310 Iterator>::iterator_category> or
311 not json_details::is_std_allocator<Alloc>::value ) {
312 return std::vector<T, Alloc>( first, last, alloc );
314 constexpr
auto reserve_amount = 4096U / (
sizeof( T ) * 8U );
315 auto result = std::vector<T, Alloc>( alloc );
317 result.reserve( reserve_amount );
318 result.assign( first, last );
335 using value_type = T;
337 [[nodiscard]] DAW_ATTRIB_FLATINLINE constexpr std::optional<T>
338 operator( )( )
const noexcept {
339 return std::optional<T>( );
342 template<
typename... Args>
343 [[nodiscard]] DAW_ATTRIB_FLATINLINE
inline constexpr
auto
344 operator( )( Args &&...args )
const
345 noexcept( std::is_nothrow_constructible<
346 std::optional<T>, std::in_place_t, Args...>::value )
348 ( (
sizeof...( Args ) > 0 ) and
349 std::is_constructible<T, std::in_place_t, Args...>::value ),
352 return std::optional<T>( std::in_place, DAW_FWD2( Args, args )... );
355 template<
typename... Args>
356 [[nodiscard]] DAW_ATTRIB_FLATINLINE
inline constexpr
auto
357 operator( )( Args &&...args )
const noexcept(
358 std::conjunction<traits::is_nothrow_list_constructible<T, Args...>,
359 std::is_nothrow_move_constructible<T>>::value )
361 ( (
sizeof...( Args ) > 0 ) and
362 not std::is_constructible<T, std::in_place_t, Args...>::value and
363 traits::is_list_constructible<T, Args...>::value ),
366 return std::optional<T>( T{ DAW_FWD2( Args, args )... } );
370 template<
typename T,
typename Deleter>
371 struct nullable_constructor<std::unique_ptr<T, Deleter>> {
372 using value_type = T;
374 DAW_ATTRIB_FLATINLINE
inline constexpr std::unique_ptr<T, Deleter>
375 operator( )( )
const noexcept {
376 return std::unique_ptr<T, Deleter>{ };
379 template<
typename... Args>
380 [[nodiscard]] DAW_ATTRIB_FLATINLINE
inline auto
381 operator( )( Args &&...args )
const
382 noexcept( std::is_nothrow_constructible<T, Args...>::value )
383 -> std::enable_if_t<(
sizeof...( Args ) > 0 and
384 std::is_constructible<T, Args...>::value ),
385 std::unique_ptr<T, Deleter>> {
387 return std::unique_ptr<T, Deleter>(
388 new T( DAW_FWD2( Args, args )... ) );
391 template<
typename... Args>
392 [[nodiscard]] DAW_ATTRIB_FLATINLINE
inline auto
393 operator( )( Args &&...args )
const
394 noexcept( traits::is_nothrow_list_constructible<T, Args...>::value )
396 ( (
sizeof...( Args ) > 0 ) and
397 not std::is_constructible<T, Args...>::value and
398 traits::is_list_constructible<T, Args...>::value ),
399 std::unique_ptr<T, Deleter>> {
401 return std::unique_ptr<T, Deleter>(
402 new T{ DAW_FWD2( Args, args )... } );
416 template<
typename Char,
typename CharTrait,
typename Allocator>
418 std::basic_string<Char, CharTrait, Allocator>> : std::true_type {};
420 namespace json_details {
426 std::bool_constant<daw::is_detected_v<json_type_t, T>>;
433 static_assert( is_a_json_type_v<T> );
441 daw::is_detected_v<ordered_member_t, T>;
445 typename T::i_am_a_json_tagged_variant;
449 daw::is_detected<is_a_json_tagged_variant_test, T>;
455 template<
typename T,
bool,
bool>
462 decltype( decltype( std::declval<
473 T, daw::is_detected<json_data_contract_trait_t, T>::value,
474 daw::is_detected<has_json_data_constract_constructor_test, T>::value>;
480 template<
typename T,
typename Default>
482 daw::is_detected<json_data_contract_constructor_t, T>::value,
484 daw::traits::identity<Default>>::type;
486 namespace is_string_like_impl {
495 daw::is_detected<is_string_like_impl::has_data_test, T>,
496 daw::is_detected<is_string_like_impl::has_size_test, T>>;
502 static_assert( is_string_view_like_v<std::string_view> );
513 template<
typename CharT,
typename Traits,
typename Alloc>
514 inline constexpr
bool
515 is_zero_terminated_string_v<std::basic_string<CharT, Traits, Alloc>> =
518 namespace json_details {
519 template<
typename ParsePolicy, auto Option>
521 typename ParsePolicy::template SetPolicyOptions<Option>;
523 template<
typename ParsePolicy,
typename String, auto Option>
525 is_zero_terminated_string_v<daw::remove_cvref_t<String>>,
528 template<
typename String>
530 not std::is_const_v<std::remove_pointer_t<std::remove_reference_t<
531 decltype( std::data( std::declval<String &&>( ) ) )>>>;
533 template<
typename String>
535 json_details::is_mutable_string_v<String>;
537 template<
typename String>
540 template<
typename String>
542 not is_rvalue_string<String> and
543 std::is_const_v<std::remove_reference_t<String>>;
545 template<
typename ParsePolicy,
typename String,
auto OptionMutable,
546 auto OptionImmutable>
548 ParsePolicy::allow_temporarily_mutating_buffer,
549 std::conditional_t<is_mutable_string_v<String>,
553 (is_rvalue_string<String> and is_mutable_string_v<String>),
575 namespace json_details {
604 namespace json_details {
605 template<
typename T,
typename ParseState>
607 not ignore_unknown_members_v<T> and
608 ( is_exact_class_mapping_v<T> or
609 ParseState::use_exact_mappings_by_default );
611 template<JsonNullable ClassNullability, JsonNullable DependentNullability>
631 : std::disjunction<std::is_pointer<T>,
632 json_details::has_element_type<T>> {};
637 template<
typename Tuple>
640 template<
typename... Ts>
642 using type = std::tuple<Ts...>;
644 static constexpr std::size_t size =
sizeof...( Ts );
646 template<std::
size_t Idx>
647 using element_t = std::tuple_element_t<Idx, type>;
649 template<std::
size_t Idx,
typename Tuple>
650 static constexpr decltype(
auto )
get( Tuple &&tp ) {
651 return std::get<Idx>( DAW_FWD( tp ) );
655 template<
typename... Ts>
657 using type = daw::fwd_pack<Ts...>;
659 static constexpr std::size_t size =
sizeof...( Ts );
661 template<std::
size_t Idx>
662 using element_t =
typename daw::tuple_element<Idx, type>::type;
664 template<std::
size_t Idx,
typename Tuple>
665 static constexpr decltype(
auto )
get( Tuple &&tp ) {
666 return DAW_FWD( tp ).template get<Idx>( );
670 namespace json_details {
677 using is_tuple = daw::is_detected<json_details::tuple_test, T>;
Iterator & it
Definition: daw_json_traits.h:231
decltype(std::data(std::declval< T >())) has_data_test
Definition: daw_json_traits.h:488
decltype(std::size(std::declval< T >())) has_size_test
Definition: daw_json_traits.h:491
daw::is_detected< element_type_t, T > has_element_type
Definition: daw_json_traits.h:621
std::conditional_t< Nullable, std::conditional_t< std::is_invocable_v< Constructor, Args... >, std::conditional_t< std::is_invocable_v< Constructor >, std::invoke_result< Constructor >, traits::identity< nullable_constructor_cannot_be_invoked< Constructor > > >, traits::identity< nullable_constructor_cannot_be_invoked< Constructor, Args... > > >, std::conditional_t< std::is_invocable_v< Constructor, Args... >, std::invoke_result< Constructor, Args... >, traits::identity< constructor_cannot_be_invoked< Constructor, Args... > > > > construction_result
Definition: daw_json_traits.h:96
constexpr bool is_mutable_string
Definition: daw_json_traits.h:534
constexpr bool is_a_json_tagged_variant_v
Definition: daw_json_traits.h:452
decltype(static_cast< bool >(std::declval< T >())) has_op_bool_test
Definition: daw_json_traits.h:35
typename json_data_contract< T >::exact_class_mapping has_exact_mapping_trait_in_class_map
Definition: daw_json_traits.h:578
std::conditional_t< ParsePolicy::allow_temporarily_mutating_buffer, std::conditional_t< is_mutable_string_v< String >, apply_policy_option_t< ParsePolicy, OptionMutable >, apply_policy_option_t< ParsePolicy, OptionImmutable > >, std::conditional_t<(is_rvalue_string< String > and is_mutable_string_v< String >), apply_policy_option_t< ParsePolicy, OptionMutable >, apply_policy_option_t< ParsePolicy, OptionImmutable > >> apply_mutable_policy
Definition: daw_json_traits.h:555
std::conjunction< daw::is_detected< is_string_like_impl::has_data_test, T >, daw::is_detected< is_string_like_impl::has_size_test, T > > is_string_view_like
Definition: daw_json_traits.h:496
typename JsonMember::without_name without_name
Definition: daw_json_traits.h:102
daw::is_detected< is_a_json_tagged_variant_test, T > is_a_json_tagged_variant
Definition: daw_json_traits.h:449
typename tuple_elements_pack< T >::type tuple_test
Definition: daw_json_traits.h:672
typename T::i_am_an_ordered_member ordered_member_t
Definition: daw_json_traits.h:437
constexpr bool is_mutable_string_v
Definition: daw_json_traits.h:529
constexpr bool is_json_map_alias_v
Definition: daw_json_traits.h:145
typename json_data_contract< T >::force_aggregate_construction force_aggregate_construction_test
Definition: daw_json_traits.h:150
std::bool_constant< daw::is_detected_v< json_type_t, T > > is_a_json_type
Definition: daw_json_traits.h:426
constexpr bool is_tuple_v
Definition: daw_json_traits.h:680
typename std::conditional_t< daw::is_detected< json_data_contract_constructor_t, T >::value, json_data_contract_constructor< T >, daw::traits::identity< Default > >::type json_class_constructor_t
Definition: daw_json_traits.h:484
constexpr auto has_value(T const &v) -> std::enable_if_t< is_readable_v< T >, bool >
Definition: daw_json_traits.h:60
constexpr bool all_json_members_must_exist_v
Definition: daw_json_traits.h:606
typename T::i_am_a_json_type json_type_t
Definition: daw_json_traits.h:422
constexpr bool has_op_star_v
Definition: daw_json_traits.h:45
constexpr bool has_empty_member_v
Definition: daw_json_traits.h:52
constexpr bool is_an_ordered_member_v
Definition: daw_json_traits.h:440
decltype(T::force_aggregate_construction) force_aggregate_construction_test2
Definition: daw_json_traits.h:154
copy_name_when< JsonMember, NewName, JsonMember::name==no_name > copy_name_when_noname
Definition: daw_json_traits.h:110
constexpr bool is_ref_string
Definition: daw_json_traits.h:541
constexpr bool has_op_bool_v
Definition: daw_json_traits.h:38
typename ParsePolicy::template SetPolicyOptions< Option > apply_policy_option_t
Definition: daw_json_traits.h:521
constexpr bool has_switcher_v
Definition: daw_json_traits.h:160
typename JsonMember::switcher switcher_t
Definition: daw_json_traits.h:157
typename T::element_type element_type_t
Definition: daw_json_traits.h:618
constexpr bool is_readable_v
Definition: daw_json_traits.h:56
daw::is_detected< json_details::tuple_test, T > is_tuple
Detect if T follows the tuple protocol.
Definition: daw_json_traits.h:677
decltype(decltype(std::declval< json_data_contract_trait_t< T > >)::constructor) has_json_data_constract_constructor_test
Definition: daw_json_traits.h:463
std::conditional_t< Cond, typename JsonMember::template with_name< NewName >, JsonMember > copy_name_when
Definition: daw_json_traits.h:106
decltype(*std::declval< T >()) has_op_star_test
Definition: daw_json_traits.h:42
std::conditional_t< is_zero_terminated_string_v< daw::remove_cvref_t< String > >, apply_policy_option_t< ParsePolicy, Option >, ParsePolicy > apply_zstring_policy_option_t
Definition: daw_json_traits.h:526
decltype(std::declval< T >().empty()) has_empty_member_test
Definition: daw_json_traits.h:49
typename json_data_contract_trait_t< T >::i_am_a_json_map_alias json_map_alias_test
Definition: daw_json_traits.h:142
typename json_data_contract_constructor< T >::type json_data_contract_constructor_t
Definition: daw_json_traits.h:478
constexpr bool is_a_json_type_v
Definition: daw_json_traits.h:429
typename T::i_am_a_json_tagged_variant is_a_json_tagged_variant_test
Definition: daw_json_traits.h:445
constexpr bool is_string_view_like_v
Definition: daw_json_traits.h:499
typename json_data_contract< T >::ignore_unknown_members has_ignore_unknown_members_trait_in_class_map
Definition: daw_json_traits.h:582
constexpr bool is_rvalue_string
Definition: daw_json_traits.h:538
constexpr bool is_nullability_compatable_v
Definition: daw_json_traits.h:612
typename json_data_contract_trait_t< T >::i_am_a_json_member_list test_valid_json_data_contract_trait_t
Definition: daw_json_traits.h:137
typename json_data_contract< T >::type json_data_contract_trait_t
Definition: daw_json_traits.h:133
constexpr bool ignore_unknown_members_v
Definition: daw_json_traits.h:586
constexpr bool is_exact_class_mapping_v
Definition: daw_json_traits.h:599
constexpr bool is_zero_terminated_string_v
Definition: daw_json_traits.h:511
std::bool_constant< std::disjunction_v< daw::is_detected< json_details::force_aggregate_construction_test, T >, daw::is_detected< json_details::force_aggregate_construction_test2, T > >> force_aggregate_construction
Definition: daw_json_traits.h:174
constexpr bool force_aggregate_construction_v
Definition: daw_json_traits.h:177
constexpr decltype(auto) get(basic_json_pair< ParseState > const &parse_state)
Definition: daw_json_value.h:48
Definition: daw_from_json.h:22
Definition: daw_from_json.h:22
Definition: daw_json_traits.h:414
Definition: daw_json_traits.h:190
Definition: daw_json_traits.h:573
Definition: daw_json_traits.h:566
Definition: daw_json_traits.h:632
Definition: daw_json_traits.h:125
Definition: daw_json_traits.h:75
Definition: daw_json_traits.h:432
Definition: daw_json_traits.h:222
typename json_data_contract_trait_t< T >::constructor type
Definition: daw_json_traits.h:467
Definition: daw_json_traits.h:456
Definition: daw_json_traits.h:72
Definition: daw_json_traits.h:117
Definition: daw_json_traits.h:331
daw::fwd_pack< Ts... > type
Definition: daw_json_traits.h:657
typename daw::tuple_element< Idx, type >::type element_t
Definition: daw_json_traits.h:662
Allow tuple like types to be used in json_tuple.
Definition: daw_json_traits.h:638
#define DAW_JSON_VER
Definition: version.h:11