15 #include <daw/cpp_17.h>
16 #include <daw/daw_arith_traits.h>
17 #include <daw/daw_traits.h>
18 #include <daw/daw_utility.h>
39 typename Constructor = default_constructor<T>,
53 template<JSONNAMETYPE Name,
typename T = std::optional<
double>,
54 LiteralAsStringOpt LiteralAsString = LiteralAsStringOpt::Never,
55 typename Constructor = nullable_constructor<T>,
56 JsonRangeCheck RangeCheck = JsonRangeCheck::Never>
85 template<JSONNAMETYPE Name,
typename T = std::optional<
double>,
86 LiteralAsStringOpt LiteralAsString = LiteralAsStringOpt::Never,
87 typename Constructor = nullable_constructor<T>>
113 template<JSONNAMETYPE Name,
typename T = std::optional<
bool>,
114 LiteralAsStringOpt LiteralAsString = LiteralAsStringOpt::Never,
115 typename Constructor = nullable_constructor<T>>
134 template<
JSONNAMETYPE Name,
typename String = std::string,
156 template<JSONNAMETYPE Name,
typename String = std::optional<std::
string>,
157 typename Constructor = nullable_constructor<String>,
158 JsonNullable EmptyStringNull = JsonNullable::Nullable,
159 EightBitModes EightBitMode = EightBitModes::AllowFull,
160 AllowEscapeCharacter AllowEscape = AllowEscapeCharacter::Allow>
162 json_string_raw<Name, String, Constructor, EmptyStringNull, EightBitMode,
177 template<
JSONNAMETYPE Name,
typename String = std::string,
195 template<JSONNAMETYPE Name,
typename String = std::optional<std::
string>,
196 typename Constructor = nullable_constructor<String>,
197 JsonNullable EmptyStringNull = JsonNullable::Never,
198 EightBitModes EightBitMode = EightBitModes::AllowFull>
200 json_string<Name, String, Constructor, EmptyStringNull, EightBitMode,
213 typename T = std::chrono::time_point<std::chrono::system_clock,
214 std::chrono::milliseconds>,
215 typename Constructor =
228 typename T = std::optional<std::chrono::time_point<
229 std::chrono::system_clock, std::chrono::milliseconds>>,
230 typename Constructor =
262 namespace json_details {
274 template<
JSONNAMETYPE Name,
typename JsonElement,
typename Container,
277 struct json_array_detect;
279 namespace vector_detect {
280 struct not_vector {};
281 template<
typename T,
typename... Alloc>
282 [[maybe_unused]]
auto vector_test( daw::tag_t<std::vector<T, Alloc...>> )
286 [[maybe_unused]] not_vector vector_test( daw::tag_t<T> );
290 std::remove_reference_t<decltype( vector_test( daw::tag<T> ) )>;
294 using is_vector = daw::not_trait<
295 std::is_same<vector_detect::detector<T>, vector_detect::not_vector>>;
298 template<
typename Mapped,
bool Found = true>
303 template<JSONNAMETYPE Name,
typename T>
305 if constexpr( std::is_same_v<T, std::string_view> ) {
308 }
else if constexpr( std::is_same_v<T, daw::string_view> ) {
311 }
else if constexpr( std::is_same_v<T, std::string> ) {
313 }
else if constexpr( std::is_same_v<T, bool> ) {
324 decltype( json_link_quick_map<no_name, T>( ) )::value;
329 template<JSONNAMETYPE Name,
typename T>
331 typename decltype( json_link_quick_map<Name, T>( ) )::mapped_type;
333 namespace json_details {
334 template<
typename T, JSONNAMETYPE Name = no_name>
335 using unnamed_default_type_mapping = daw::if_t<
336 json_details::is_a_json_type_v<T>, T,
342 std::disjunction_v<daw::is_arithmetic<T>, std::is_enum<T>>,
344 daw::if_t<std::conjunction_v<cant_deref<T>, is_vector<T>>,
345 json_array_detect<Name, vector_detect::detector<T>, T>,
349 using has_unnamed_default_type_mapping = daw::not_trait<
350 std::is_same<unnamed_default_type_mapping<T>,
358 template<
typename... JsonElements>
362 std::tuple<json_details::unnamed_default_type_mapping<JsonElements>...>;
378 std::vector<
typename json_details::unnamed_default_type_mapping<
379 JsonElement>::parse_to_t>,
396 std::vector<
typename json_details::unnamed_default_type_mapping<
397 JsonElement>::parse_to_t>,
416 template<
JSONNAMETYPE Name,
typename Container,
typename JsonValueType,
435 template<
JSONNAMETYPE Name,
typename Container,
typename JsonValueType,
439 json_key_value<Name, Container, JsonValueType, JsonKeyType, Constructor,
457 template<
JSONNAMETYPE Name,
typename Container,
typename JsonValueType,
458 typename JsonKeyType,
477 template<
JSONNAMETYPE Name,
typename Container,
typename JsonValueType,
478 typename JsonKeyType,
519 namespace json_details {
521 template<JsonBaseParseTypes PT>
522 constexpr std::size_t
523 find_json_element( std::initializer_list<JsonBaseParseTypes> pts ) {
525 for(
auto const &pt : pts ) {
531 return daw::numeric_limits<std::size_t>::max( );
548 template<
JSONNAMETYPE Name,
typename T,
typename JsonElements,
549 typename Constructor = default_constructor<T>,
562 template<
JSONNAMETYPE Name,
typename T,
typename JsonElements,
563 typename Constructor = nullable_constructor<T>>
567 namespace json_details {
569 struct unknown_variant_type {
570 using i_am_tagged_variant_type_list = void;
573 template<
typename... Ts>
574 struct missing_default_type_mapping {
575 using i_am_tagged_variant_type_list = void;
578 template<
typename... Ts>
579 [[maybe_unused]] constexpr std::conditional_t<
580 std::conjunction_v<has_unnamed_default_type_mapping<Ts>...>,
582 missing_default_type_mapping<unnamed_default_type_mapping<Ts>...>>
583 get_variant_type_list( std::variant<Ts...>
const * );
586 using underlying_nullable_type = decltype( *std::declval<T>( ) );
589 using detected_underlying_nullable_type =
590 std::remove_reference_t<daw::detected_t<underlying_nullable_type, T>>;
593 inline constexpr
bool is_nullable_type =
594 daw::is_detected_v<underlying_nullable_type, T>;
597 [[maybe_unused]] constexpr unknown_variant_type<T>
598 get_variant_type_list( T
const * );
600 struct cannot_deduce_variant_element_types {};
602 template<JsonNullable Nullable,
typename Variant>
603 using determine_variant_element_types = std::conditional_t<
604 Nullable == JsonNullable::Never or not is_nullable_type<Variant>,
605 std::remove_reference_t<decltype( get_variant_type_list(
606 std::declval<Variant const *>( ) ) )>,
608 is_nullable_type<Variant>,
609 std::remove_reference_t<decltype( get_variant_type_list(
611 detected_underlying_nullable_type<Variant>
const *>( ) ) )>,
612 cannot_deduce_variant_element_types>>;
630 JSONNAMETYPE Name,
typename T,
typename TagMember,
typename Switcher,
631 typename JsonElements =
632 json_details::determine_variant_element_types<JsonNullable::Never, T>,
633 typename Constructor = default_constructor<T>,
635 struct json_tagged_variant;
652 JSONNAMETYPE Name,
typename T,
typename TagMember,
typename Switcher,
653 typename JsonElements =
654 json_details::determine_variant_element_types<JsonNullable::Nullable, T>,
655 typename Constructor = nullable_constructor<T>>