19#include <daw/daw_consteval.h>
20#include <daw/daw_move.h>
34 template<
typename... Policies>
36 static_assert( json_details::are_option_flags<Policies...>,
37 "Only registered policy types are allowed" );
38 auto result = json_details::serialization::default_policy_flag;
39 if constexpr(
sizeof...( Policies ) > 0 ) {
41 ( json_details::serialization::set_bits_for( policies ) | ... );
45 namespace json_details {
47 DAW_ATTRIB_INLINE
constexpr daw::string_view as_sv( T
const &value ) {
48 if constexpr( std::is_same_v<char, DAW_TYPEOF( value )> ) {
49 return daw::string_view( &value, 1 );
51 return daw::string_view( value );
56 template<
typename WritableType,
58 json_details::serialization::default_policy_flag>
61 concepts::is_writable_output_type_v<WritableType>,
62 "Output type does not have a writeable_output_trait specialization" );
70 std::size_t indentation_level = 0;
72 DAW_ATTRIB_INLINE
constexpr WritableType
const &
get( )
const {
76 DAW_ATTRIB_INLINE
constexpr WritableType &
get( ) {
81 WritableType & writable DAW_LIFETIME_BOUND )
82 : m_writable(
std::addressof( writable ) ) {}
84 static constexpr options::SerializationFormat serialization_format =
85 json_details::serialization::get_bits_for<options::SerializationFormat>(
88 static constexpr options::IndentationType indentation_type =
89 json_details::serialization::get_bits_for<options::IndentationType>(
92 static constexpr options::RestrictedStringOutput
93 restricted_string_output = json_details::serialization::get_bits_for<
94 options::RestrictedStringOutput>( PolicyFlags );
96 static constexpr options::NewLineDelimiter newline_delimiter =
97 json_details::serialization::get_bits_for<options::NewLineDelimiter>(
100 static constexpr options::OutputTrailingComma output_trailing_comma =
101 json_details::serialization::get_bits_for<options::OutputTrailingComma>(
105 if constexpr( serialization_format !=
106 options::SerializationFormat::Minified ) {
112 if constexpr( serialization_format !=
113 options::SerializationFormat::Minified ) {
119 if constexpr( serialization_format !=
120 options::SerializationFormat::Minified ) {
121 DAW_CPP23_STATIC_LOCAL
constexpr std::string_view indent =
122 json_details::serialization::generate_indent<serialization_format,
124 if( not indent.empty( ) ) {
125 for( std::size_t n = 0; n < indentation_level; ++n ) {
132 static constexpr std::string_view newline =
133 newline_delimiter == options::NewLineDelimiter::n ?
"\n" :
"\r\n";
136 if constexpr( serialization_format !=
137 options::SerializationFormat::Minified ) {
142 static constexpr daw::string_view space =
143 serialization_format != options::SerializationFormat::Minified
152 template<
typename ContiguousCharRange,
typename... ContiguousCharRanges>
153 DAW_ATTRIB_FLATINLINE
constexpr void
154 write( ContiguousCharRange
const &chr,
155 ContiguousCharRanges
const &...chrs ) {
158 json_details::as_sv( chr ),
159 json_details::as_sv( chrs )... );
165 daw::string_view( first,
static_cast<std::size_t
>( last - first ) ) );
168 DAW_ATTRIB_FLATINLINE
constexpr void put(
char c ) {
190 template<
typename,
typename...>
193 template<
typename OutputIterator, json_options_t PolicyFlags>
std::uint32_t json_options_t
constexpr bool is_serialization_policy_v
constexpr json_options_t serialize_options(Policies... policies)
constexpr WritableOutput & put_output(WritableOutput &out, CharT c)
constexpr WritableOutput & write_output(WritableOutput &out, StringViews const &...svs)
Customization point traits.
DAW_ATTRIB_INLINE constexpr serialization_policy(WritableType &writable DAW_LIFETIME_BOUND)
DAW_ATTRIB_INLINE constexpr void del_indent()
DAW_ATTRIB_INLINE constexpr WritableType & get()
DAW_ATTRIB_INLINE constexpr serialization_policy operator++(int) &
WritableType * m_writable
DAW_ATTRIB_INLINE constexpr serialization_policy & operator*()
void i_am_a_serialization_policy
DAW_ATTRIB_INLINE constexpr void output_newline()
DAW_ATTRIB_INLINE constexpr serialization_policy & operator=(char c)
constexpr void write(ContiguousCharRange const &chr, ContiguousCharRanges const &...chrs)
DAW_ATTRIB_INLINE constexpr WritableType const & get() const
static DAW_ATTRIB_INLINE DAW_CONSTEVAL json_options_t policy_flags()
DAW_ATTRIB_INLINE constexpr void copy_buffer(char const *first, char const *last)
constexpr void put(char c)
DAW_ATTRIB_INLINE constexpr void next_member()
DAW_ATTRIB_INLINE constexpr serialization_policy & operator++()
DAW_ATTRIB_INLINE constexpr void add_indent()
DAW_ATTRIB_INLINE constexpr void output_indent()
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.