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( );
88 typename JsonElement,
typename Container,
typename WritableType,
89 auto... PolicyFlags DAW_ENABLEIF2( concepts::is_writable_output_type_v<
90 daw::remove_cvref_t<WritableType>> )>
92 concepts::is_writable_output_type_v<daw::remove_cvref_t<WritableType>> )
93 constexpr
daw::rvalue_to_value_t<WritableType> to_json_array(
94 Container const &c, WritableType &&it,
95 options::output_flags_t<PolicyFlags...> ) {
97 daw::traits::is_container_like_v<daw::remove_cvref_t<Container>>,
98 "Supplied container must support begin( )/end( )" );
99 using output_t = daw::rvalue_to_value_t<WritableType>;
101 if constexpr( std::is_pointer_v<daw::remove_cvref_t<output_t>> ) {
105 if constexpr( is_serialization_policy_v<
106 daw::remove_cvref_t<WritableType>> ) {
107 if constexpr(
sizeof...( PolicyFlags ) == 0 ) {
110 return serialization_policy<
typename output_t::iterator_type,
111 json_details::serialization::set_bits(
112 output_t::policy_flags( ),
113 PolicyFlags... )>( it.get( ) );
116 return serialization_policy<
117 daw::remove_cvref_t<WritableType>,
118 options::output_flags_t<PolicyFlags...>::value>( it );
122 out_it.add_indent( );
125 auto first = std::begin( c );
126 auto last = std::end( c );
127 bool const has_elements = first != last;
128 while( first != last ) {
129 (void)[&out_it](
auto &&v ) {
130 using v_type = DAW_TYPEOF( v );
131 using JsonMember =
typename daw::conditional_t<
132 std::is_same_v<JsonElement, use_default>,
133 json_details::ident_trait<json_details::json_deduced_type, v_type>,
134 json_details::ident_trait<json_details::json_deduced_type,
140 missing_json_data_contract_for_or_unknown_type<JsonElement>>,
141 "Unable to detect unnamed mapping" );
143 out_it.next_member( );
145 out_it = json_details::member_to_string<JsonMember>( out_it, v );
149 if( first != last ) {
154 out_it.del_indent( );
156 out_it.output_newline( );
159 return out_it.get( );
162 template<
typename JsonElement,
typename Container,
auto... PolicyFlags>
163 DAW_CPP20_CX_ALLOC std::string
165 options::output_flags_t<PolicyFlags...> flgs ) {
166 static_assert( not std::is_same_v<std::string, JsonElement> );
167 auto result = std::string{ };
168 result.reserve( 4096 );
170 result.shrink_to_fit( );