28 namespace json_details {
29 template<
typename output_t,
auto... PolicyFlags,
typename WritableType>
30 DAW_ATTRIB_INLINE
constexpr auto apply_policy_flags( WritableType &&it ) {
32 daw::remove_cvref_t<WritableType>> ) {
33 if constexpr(
sizeof...( PolicyFlags ) == 0 ) {
37 json_details::serialization::set_bits(
38 output_t::policy_flags( ),
39 PolicyFlags... )>( it.get( ) );
43 daw::remove_cvref_t<WritableType>,
44 options::output_flags_t<PolicyFlags...>::value>( it );
50 typename JsonClass,
typename Value,
typename WritableType,
51 auto... PolicyFlags DAW_ENABLEIF2( concepts::is_writable_output_type_v<
52 daw::remove_cvref_t<WritableType>> )>
54 concepts::is_writable_output_type_v<daw::remove_cvref_t<WritableType>> )
55 constexpr
daw::rvalue_to_value_t<WritableType> to_json(
56 Value const &value, WritableType &&it,
57 options::output_flags_t<PolicyFlags...> ) {
59 using json_class_t =
typename daw::conditional_t<
60 std::is_same_v<use_default, JsonClass>,
61 json_details::ident_trait<json_details::json_deduced_type, Value>,
62 json_details::ident_trait<json_details::json_deduced_type,
65 using output_t = daw::rvalue_to_value_t<WritableType>;
66 if constexpr( std::is_pointer_v<daw::remove_cvref_t<WritableType>> ) {
70 json_details::apply_policy_flags<output_t, PolicyFlags...>( it );
72 return json_details::member_to_string<json_class_t>( out_it, value )
76 template<
typename JsonClass,
typename Value,
auto... PolicyFlags>
77 DAW_CPP20_CX_ALLOC std::string
79 options::output_flags_t<PolicyFlags...> flgs ) {
80 std::string result{ };
81 result.reserve( 4096 );
82 (void)
to_json( value, result, flgs );
83 result.shrink_to_fit( );
87 namespace json_details {
88 template<
auto... PolicyFlags,
typename WritableType>
89 constexpr auto make_output_iterator( WritableType &&it ) {
90 using output_t = daw::rvalue_to_value_t<WritableType>;
92 if constexpr( std::is_pointer_v<daw::remove_cvref_t<output_t>> ) {
95 if constexpr( is_serialization_policy_v<
96 daw::remove_cvref_t<WritableType>> ) {
97 if constexpr(
sizeof...( PolicyFlags ) == 0 ) {
100 return serialization_policy<
typename output_t::iterator_type,
101 json_details::serialization::set_bits(
102 output_t::policy_flags( ),
103 PolicyFlags... )>( it.get( ) );
106 return serialization_policy<
107 daw::remove_cvref_t<WritableType>,
108 options::output_flags_t<PolicyFlags...>::value>( it );
114 typename JsonElement,
typename Container,
typename WritableType,
115 auto... PolicyFlags DAW_ENABLEIF2( concepts::is_writable_output_type_v<
116 daw::remove_cvref_t<WritableType>> )>
118 concepts::is_writable_output_type_v<daw::remove_cvref_t<WritableType>> )
119 constexpr
daw::rvalue_to_value_t<WritableType> to_json_array(
120 Container const &c, WritableType &&it,
121 options::output_flags_t<PolicyFlags...> ) {
123 daw::traits::is_container_like_v<daw::remove_cvref_t<Container>>,
124 "Supplied container must support begin( )/end( )" );
127 json_details::make_output_iterator<PolicyFlags...>( DAW_FWD( it ) );
129 out_it.add_indent( );
132 auto first = std::begin( c );
133 auto last = std::end( c );
134 bool const has_elements = first != last;
135 while( first != last ) {
136 (void)[&out_it](
auto &&v ) {
137 using v_type = DAW_TYPEOF( v );
138 using JsonMember =
typename daw::conditional_t<
139 std::is_same_v<JsonElement, use_default>,
140 json_details::ident_trait<json_details::json_deduced_type, v_type>,
141 json_details::ident_trait<json_details::json_deduced_type,
147 missing_json_data_contract_for_or_unknown_type<JsonElement>>,
148 "Unable to detect unnamed mapping" );
150 out_it.next_member( );
152 out_it = json_details::member_to_string<JsonMember>( out_it, v );
156 if( first != last ) {
161 out_it.del_indent( );
163 out_it.output_newline( );
166 return out_it.get( );
169 template<
typename JsonElement,
typename Container,
auto... PolicyFlags>
170 DAW_CPP20_CX_ALLOC std::string
172 options::output_flags_t<PolicyFlags...> flgs ) {
173 static_assert( not std::is_same_v<std::string, JsonElement> );
174 auto result = std::string{ };
175 result.reserve( 4096 );
177 result.shrink_to_fit( );