15#include <daw/cpp_17.h>
16#include <daw/daw_fwd_pack_apply.h>
17#include <daw/daw_move.h>
18#include <daw/daw_scope_guard.h>
19#include <daw/daw_traits.h>
25#include <unordered_map>
34 namespace json_details {
37 decltype(
static_cast<bool>( std::declval<T>( ) ) );
41 daw::is_detected_v<has_op_bool_test, T>;
48 daw::is_detected_v<has_op_star_test, T>;
55 daw::is_detected_v<has_empty_member_test, T>;
59 has_op_bool_v<T> or has_empty_member_v<T>;
63 -> std::enable_if_t<is_readable_v<T>,
bool> {
65 if constexpr( has_op_bool_v<T> ) {
66 return static_cast<bool>( v );
67 }
else if constexpr( has_empty_member_v<T> ) {
68 return not v.empty( );
73 template<
typename Constructor,
typename... Args>
76 template<
typename Constructor,
typename... Args>
80 template<
bool Nullable,
typename Constructor,
typename... Args>
85 std::is_invocable_v<Constructor, Args...>,
87 std::is_invocable_v<Constructor>,
88 std::invoke_result<Constructor>,
89 traits::identity<nullable_constructor_cannot_be_invoked<Constructor>>
94 std::is_invocable_v<Constructor, Args...>,
95 std::invoke_result<Constructor, Args...>,
102 namespace json_details {
103 template<
typename JsonMember>
106 template<
typename JsonMember, JSONNAMETYPE NewName,
bool Cond>
108 Cond,
typename JsonMember::template with_name<NewName>, JsonMember>;
110 template<
typename JsonMember, JSONNAMETYPE NewName>
126 template<
typename T,
typename =
void>
141 namespace json_details {
148 daw::is_detected_v<json_map_alias_test, T>;
158 template<
typename JsonMember>
161 template<
typename JsonMember>
163 daw::is_detected_v<switcher_t, JsonMember>;
175 daw::is_detected<json_details::force_aggregate_construction_test, T>,
176 daw::is_detected<json_details::force_aggregate_construction_test2, T>>>;
182 namespace json_details {
187 template<
typename... Ts>
190 template<
typename... Ts>
200 [[nodiscard]] DAW_ATTRIB_INLINE
inline constexpr T operator( )( )
const {
206 std::enable_if_t<std::conjunction_v<std::is_constructible<T, Args...>,
208 std::nullptr_t> =
nullptr>
209 [[nodiscard]] DAW_ATTRIB_INLINE
inline constexpr T
210 operator( )( Args &&...args )
const {
212 return T( DAW_FWD2( Args, args )... );
217 typename std::enable_if_t<
218 std::conjunction_v<daw::not_trait<std::is_constructible<T, Args...>>,
220 daw::traits::is_list_constructible<T, Args...>>,
221 std::nullptr_t> =
nullptr>
222 [[nodiscard]] DAW_ATTRIB_INLINE
inline constexpr T
223 operator( )( Args &&...args )
const
224 noexcept(
noexcept( T{ DAW_FWD2( Args, args )... } ) ) {
226 return T{ DAW_FWD2( Args, args )... };
230 template<
typename,
typename =
void>
240 namespace json_details {
244 template<
typename... Ts>
249 template<
typename Iterator>
250 struct construct_array_cleanup {
254 DAW_SG_CXDTOR
inline ~construct_array_cleanup( ) noexcept( false ) {
255#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
256 if( DAW_IS_CONSTANT_EVALUATED( ) ) {
260 if( std::uncaught_exceptions( ) == 0 ) {
263#if defined( DAW_HAS_CONSTEXPR_SCOPE_GUARD )
270 template<
typename T, std::
size_t Sz>
271 struct default_constructor<std::array<T, Sz>> {
272 DAW_ATTRIB_INLINE
constexpr std::array<T, Sz> operator( )( )
const
273 noexcept(
noexcept( std::array<T, Sz>{ } ) ) {
277 DAW_ATTRIB_INLINE
constexpr std::array<T, Sz> &&
278 operator( )( std::array<T, Sz> &&v )
const noexcept {
279 return DAW_MOVE( v );
282 template<
typename Iterator, std::size_t... Is>
283 DAW_ATTRIB_INLINE
static constexpr std::array<T, Sz>
284 construct_array( Iterator first, Iterator last,
285 std::index_sequence<Is...> ) {
286 auto const get_result = [&]( std::size_t ) {
287 if( first != last ) {
288 if constexpr( std::is_move_constructible_v<T> ) {
289 auto result = *first;
293 auto const run_after_parse = construct_array_cleanup{ first };
294 (void)run_after_parse;
300 return std::array<T, Sz>{ get_result( Is )... };
303 template<
typename Iterator>
304 DAW_ATTRIB_INLINE
constexpr std::array<T, Sz>
305 operator( )( Iterator first, Iterator last )
const {
306 return construct_array( first, last, std::make_index_sequence<Sz>{ } );
310 template<
typename T,
typename Alloc>
311 struct default_constructor<std::vector<T, Alloc>> {
313 DAW_ATTRIB_INLINE
inline std::vector<T, Alloc> operator( )( )
const
314 noexcept(
noexcept( std::vector<T, Alloc>( ) ) ) {
318 DAW_ATTRIB_INLINE
inline std::vector<T, Alloc> &&
319 operator( )( std::vector<T, Alloc> &&v )
const
320 noexcept(
noexcept( std::vector<T, Alloc>( v ) ) ) {
321 return DAW_MOVE( v );
324 template<
typename Iterator>
325 DAW_ATTRIB_INLINE
inline std::vector<T, Alloc>
326 operator( )( Iterator first, Iterator last,
327 Alloc
const &alloc = Alloc{ } )
const {
328 if constexpr( std::is_same_v<std::random_access_iterator_tag,
329 typename std::iterator_traits<
330 Iterator>::iterator_category> or
331 not json_details::is_std_allocator<Alloc>::value ) {
332 return std::vector<T, Alloc>( first, last, alloc );
334 constexpr auto reserve_amount = 4096U / (
sizeof( T ) * 8U );
335 auto result = std::vector<T, Alloc>( alloc );
337 result.reserve( reserve_amount );
338 result.assign( first, last );
355 using value_type = T;
357 [[nodiscard]] DAW_ATTRIB_INLINE
constexpr std::optional<T>
358 operator( )( )
const noexcept {
359 return std::optional<T>( );
362 template<
typename... Args>
363 [[nodiscard]] DAW_ATTRIB_INLINE
inline constexpr auto
364 operator( )( Args &&...args )
const
365 noexcept( std::is_nothrow_constructible<
366 std::optional<T>, std::in_place_t, Args...>::value )
368 ( (
sizeof...( Args ) > 0 ) and
369 std::is_constructible<T, std::in_place_t, Args...>::value ),
372 return std::optional<T>( std::in_place, DAW_FWD2( Args, args )... );
375 template<
typename... Args>
376 [[nodiscard]] DAW_ATTRIB_INLINE
inline constexpr auto
377 operator( )( Args &&...args )
const noexcept(
378 std::conjunction<traits::is_nothrow_list_constructible<T, Args...>,
379 std::is_nothrow_move_constructible<T>>::value )
381 ( (
sizeof...( Args ) > 0 ) and
382 not std::is_constructible<T, std::in_place_t, Args...>::value and
383 traits::is_list_constructible<T, Args...>::value ),
386 return std::optional<T>( T{ DAW_FWD2( Args, args )... } );
390 template<
typename T,
typename Deleter>
391 struct nullable_constructor<std::unique_ptr<T, Deleter>> {
392 using value_type = T;
394 DAW_ATTRIB_INLINE
inline constexpr std::unique_ptr<T, Deleter>
395 operator( )( )
const noexcept {
396 return std::unique_ptr<T, Deleter>{ };
399 template<
typename... Args>
400 [[nodiscard]] DAW_ATTRIB_INLINE
inline auto
401 operator( )( Args &&...args )
const
402 noexcept( std::is_nothrow_constructible<T, Args...>::value )
403 -> std::enable_if_t<(
sizeof...( Args ) > 0 and
404 std::is_constructible<T, Args...>::value ),
405 std::unique_ptr<T, Deleter>> {
407 return std::unique_ptr<T, Deleter>(
408 new T( DAW_FWD2( Args, args )... ) );
411 template<
typename... Args>
412 [[nodiscard]] DAW_ATTRIB_INLINE
inline auto
413 operator( )( Args &&...args )
const
414 noexcept( traits::is_nothrow_list_constructible<T, Args...>::value )
416 ( (
sizeof...( Args ) > 0 ) and
417 not std::is_constructible<T, Args...>::value and
418 traits::is_list_constructible<T, Args...>::value ),
419 std::unique_ptr<T, Deleter>> {
421 return std::unique_ptr<T, Deleter>(
422 new T{ DAW_FWD2( Args, args )... } );
436 template<
typename Char,
typename CharTrait,
typename Allocator>
438 std::basic_string<Char, CharTrait, Allocator>> : std::true_type {};
440 namespace json_details {
446 std::bool_constant<daw::is_detected_v<json_type_t, T>>;
453 static_assert( is_a_json_type_v<T> );
468 typename T::i_am_a_json_tagged_variant;
472 daw::is_detected<is_a_json_tagged_variant_test, T>;
478 template<
typename T,
bool,
bool>
485 decltype(
decltype( std::declval<
496 T, daw::is_detected<json_data_contract_trait_t, T>::value,
497 daw::is_detected<has_json_data_constract_constructor_test, T>::value>;
514 template<
typename T,
typename Default>
516 daw::detected_or_t<Default, json_class_constructor_t_impl, T>;
518 namespace is_string_like_impl {
527 daw::is_detected<is_string_like_impl::has_data_test, T>,
528 daw::is_detected<is_string_like_impl::has_size_test, T>>;
534 static_assert( is_string_view_like_v<std::string_view> );
545 template<
typename CharT,
typename Traits,
typename Alloc>
553 namespace json_details {
554 template<
typename ParsePolicy, auto Option>
556 typename ParsePolicy::template SetPolicyOptions<Option>;
558 template<
typename ParsePolicy,
typename String, auto Option>
560 is_zero_terminated_string_v<daw::remove_cvref_t<String>>,
563 template<
typename String>
565 not std::is_const_v<std::remove_pointer_t<std::remove_reference_t<
566 decltype( std::data( std::declval<String &&>( ) ) )>>>;
568 template<
typename String>
570 json_details::is_mutable_string_v<String>;
572 template<
typename String>
575 template<
typename String>
577 not is_rvalue_string<String> and
578 std::is_const_v<std::remove_reference_t<String>>;
580 template<
typename ParsePolicy,
typename String,
auto OptionMutable,
581 auto OptionImmutable>
583 ParsePolicy::allow_temporarily_mutating_buffer,
584 std::conditional_t<is_mutable_string_v<String>,
588 (is_rvalue_string<String> and is_mutable_string_v<String>),
610 namespace json_details {
639 namespace json_details {
640 template<
typename T,
typename ParseState>
642 not ignore_unknown_members_v<T> and
643 ( is_exact_class_mapping_v<T> or
644 ParseState::use_exact_mappings_by_default );
646 template<JsonNullable ClassNullability, JsonNullable DependentNullability>
666 : std::disjunction<std::is_pointer<T>,
667 json_details::has_element_type<T>> {};
671 template<
typename Tuple>
674 template<
typename... Ts>
676 using type = std::tuple<Ts...>;
678 static constexpr std::size_t size =
sizeof...( Ts );
680 template<std::
size_t Idx>
681 using element_t = std::tuple_element_t<Idx, type>;
683 template<std::
size_t Idx,
typename Tuple>
684 static constexpr decltype( auto )
get( Tuple &&tp ) {
685 return std::get<Idx>( DAW_FWD( tp ) );
689 template<
typename... Ts>
691 using type = daw::fwd_pack<Ts...>;
693 static constexpr std::size_t size =
sizeof...( Ts );
695 template<std::
size_t Idx>
696 using element_t =
typename daw::tuple_element<Idx, type>::type;
698 template<std::
size_t Idx,
typename Tuple>
699 static constexpr decltype( auto )
get( Tuple &&tp ) {
700 return DAW_FWD( tp ).template get<Idx>( );
704 namespace json_details {
711 using is_tuple = daw::is_detected<json_details::tuple_test, T>;
716 namespace deref_t_impl {
731 using type = std::remove_cv_t<T>;
736 using type = std::remove_cv_t<T>;
740 struct deref_type_impl<std::optional<T>> {
741 using type = std::remove_cv_t<T>;
749 daw::not_trait<std::is_same<dereferenced_t<T>,
755 namespace unwrapped_impl {
761 template<
typename T, JsonNullable Nullable>
763 typename std::conditional_t<is_nullable_json_value_v<Nullable>,
Iterator & it
Definition: daw_json_traits.h:251
DAW_TYPEOF(*std::declval< T >()) deref_type_detect
Definition: daw_json_traits.h:721
void unable_to_dereference
Definition: daw_json_traits.h:718
decltype(std::data(std::declval< T >())) has_data_test
Definition: daw_json_traits.h:520
decltype(std::size(std::declval< T >())) has_size_test
Definition: daw_json_traits.h:523
std::conditional_t< is_dereferenceable_v< T >, dereferenced_t< T >, T > unwrapped_t_impl
Definition: daw_json_traits.h:758
daw::is_detected< element_type_t, T > has_element_type
Definition: daw_json_traits.h:656
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:98
constexpr bool is_mutable_string
Definition: daw_json_traits.h:569
constexpr bool is_a_json_tagged_variant_v
Definition: daw_json_traits.h:475
constexpr bool is_dereferenceable_v
Definition: daw_json_traits.h:753
decltype(static_cast< bool >(std::declval< T >())) has_op_bool_test
Definition: daw_json_traits.h:37
copy_name_when< JsonMember, NewName, is_no_name_v< JsonMember > > copy_name_when_noname
Definition: daw_json_traits.h:112
typename json_data_contract< T >::exact_class_mapping has_exact_mapping_trait_in_class_map
Definition: daw_json_traits.h:613
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:590
typename deref_t_impl::deref_type_impl< T >::type dereferenced_t
Definition: daw_json_traits.h:745
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:528
typename JsonMember::without_name without_name
Definition: daw_json_traits.h:104
daw::is_detected< is_a_json_tagged_variant_test, T > is_a_json_tagged_variant
Definition: daw_json_traits.h:472
typename tuple_elements_pack< T >::type tuple_test
Definition: daw_json_traits.h:706
typename T::i_am_an_ordered_member ordered_member_t
Definition: daw_json_traits.h:457
constexpr bool is_mutable_string_v
Definition: daw_json_traits.h:564
constexpr bool is_json_map_alias_v
Definition: daw_json_traits.h:147
typename json_data_contract< T >::force_aggregate_construction force_aggregate_construction_test
Definition: daw_json_traits.h:152
std::bool_constant< daw::is_detected_v< json_type_t, T > > is_a_json_type
Definition: daw_json_traits.h:446
constexpr bool is_tuple_v
Definition: daw_json_traits.h:714
constexpr auto has_value(T const &v) -> std::enable_if_t< is_readable_v< T >, bool >
Definition: daw_json_traits.h:62
constexpr bool all_json_members_must_exist_v
Definition: daw_json_traits.h:641
typename T::i_am_a_json_type json_type_t
Definition: daw_json_traits.h:442
constexpr bool has_op_star_v
Definition: daw_json_traits.h:47
constexpr bool has_empty_member_v
Definition: daw_json_traits.h:54
constexpr bool is_an_ordered_member_v
Definition: daw_json_traits.h:463
decltype(T::force_aggregate_construction) force_aggregate_construction_test2
Definition: daw_json_traits.h:156
daw::not_trait< std::is_same< dereferenced_t< T >, deref_t_impl::unable_to_dereference< T > > > is_dereferenceable
Definition: daw_json_traits.h:750
constexpr bool is_ref_string
Definition: daw_json_traits.h:576
constexpr bool has_op_bool_v
Definition: daw_json_traits.h:40
typename ParsePolicy::template SetPolicyOptions< Option > apply_policy_option_t
Definition: daw_json_traits.h:556
constexpr bool has_switcher_v
Definition: daw_json_traits.h:162
typename JsonMember::switcher switcher_t
Definition: daw_json_traits.h:159
typename T::element_type element_type_t
Definition: daw_json_traits.h:653
daw::is_detected< ordered_member_t, T > is_an_ordered_member
Definition: daw_json_traits.h:460
constexpr bool is_readable_v
Definition: daw_json_traits.h:58
daw::is_detected< json_details::tuple_test, T > is_tuple
Detect if T follows the tuple protocol.
Definition: daw_json_traits.h:711
typename json_data_contract< T >::constructor json_class_constructor_t_impl
Definition: daw_json_traits.h:512
decltype(decltype(std::declval< json_data_contract_trait_t< T > >)::constructor) has_json_data_constract_constructor_test
Definition: daw_json_traits.h:486
std::conditional_t< Cond, typename JsonMember::template with_name< NewName >, JsonMember > copy_name_when
Definition: daw_json_traits.h:108
decltype(*std::declval< T >()) has_op_star_test
Definition: daw_json_traits.h:44
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:561
decltype(std::declval< T >().empty()) has_empty_member_test
Definition: daw_json_traits.h:51
typename std::conditional_t< is_nullable_json_value_v< Nullable >, unwrapped_impl::unwrapped_t_impl< T >, T > unwrapped_t
Definition: daw_json_traits.h:764
typename json_data_contract_trait_t< T >::i_am_a_json_map_alias json_map_alias_test
Definition: daw_json_traits.h:144
typename json_data_contract_constructor< T >::type json_data_contract_constructor_t
Definition: daw_json_traits.h:501
constexpr bool is_a_json_type_v
Definition: daw_json_traits.h:449
typename T::i_am_a_json_tagged_variant is_a_json_tagged_variant_test
Definition: daw_json_traits.h:468
constexpr bool is_string_view_like_v
Definition: daw_json_traits.h:531
typename json_data_contract< T >::ignore_unknown_members has_ignore_unknown_members_trait_in_class_map
Definition: daw_json_traits.h:617
daw::detected_or_t< Default, json_class_constructor_t_impl, T > json_class_constructor_t
Definition: daw_json_traits.h:516
constexpr bool is_rvalue_string
Definition: daw_json_traits.h:573
constexpr bool is_nullability_compatable_v
Definition: daw_json_traits.h:647
constexpr bool is_empty_pack_v
Definition: daw_json_traits.h:191
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:139
constexpr decltype(auto) get(basic_json_pair< ParseState > const &parse_state)
Definition: daw_json_value.h:49
typename json_data_contract< T >::type json_data_contract_trait_t
Definition: daw_json_traits.h:135
constexpr bool ignore_unknown_members_v
Definition: daw_json_traits.h:621
constexpr bool is_exact_class_mapping_v
Definition: daw_json_traits.h:634
constexpr bool is_zero_terminated_string_v
Definition: daw_json_traits.h:550
std::bool_constant<(sizeof...(Ts)==0)> is_empty_pack
Definition: daw_json_traits.h:188
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:176
constexpr bool is_default_constructor_v
Definition: daw_json_traits.h:237
constexpr bool force_aggregate_construction_v
Definition: daw_json_traits.h:179
Definition: daw_from_json.h:22
Definition: daw_from_json.h:22
Definition: daw_json_traits.h:434
Definition: daw_json_traits.h:199
Definition: daw_json_traits.h:608
Definition: daw_json_traits.h:231
Definition: daw_json_traits.h:601
Definition: daw_json_traits.h:667
Definition: daw_json_traits.h:543
Definition: daw_json_traits.h:127
Definition: daw_json_traits.h:77
std::remove_cv_t< T > type
Definition: daw_json_traits.h:731
Definition: daw_json_traits.h:724
daw::detected_or_t< unable_to_dereference< T >, deref_type_detect, T > type
Definition: daw_json_traits.h:726
Definition: daw_json_traits.h:452
Definition: daw_json_traits.h:242
typename json_data_contract_trait_t< T >::constructor type
Definition: daw_json_traits.h:490
Definition: daw_json_traits.h:479
Definition: daw_json_traits.h:74
Definition: daw_json_traits.h:119
Definition: daw_json_traits.h:351
daw::fwd_pack< Ts... > type
Definition: daw_json_traits.h:691
static constexpr decltype(auto) get(Tuple &&tp)
Definition: daw_json_traits.h:699
typename daw::tuple_element< Idx, type >::type element_t
Definition: daw_json_traits.h:696
Allow tuple like types to be used in json_tuple.
Definition: daw_json_traits.h:672
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16