30 DAW_REQUIRES( writeable_output_details::is_char_sized_character_v<T> or
31 writeable_output_details::is_byte_type_v<T> )
32 struct writable_output_trait<
34 writeable_output_details::is_char_sized_character_v<T> or
35 writeable_output_details::is_byte_type_v<T> )> : std::true_type {
37 template<
typename... StringViews>
38 static constexpr void write( T *&ptr, StringViews
const &...svs ) {
39 static_assert(
sizeof...( StringViews ) > 0 );
41 DAW_CPP23_STATIC_LOCAL
constexpr auto writer =
46 p = writeable_output_details::copy_to_buffer( p, sv );
49 ( (void)writer( ptr, svs ), ... );
52 static constexpr void put( T *&ptr,
char c ) {
54 *ptr =
static_cast<T
>( c );
61 DAW_REQUIRES( writeable_output_details::is_span_like_range_v<
62 T,
typename T::value_type> )
63 struct writable_output_trait<
64 T DAW_ENABLEIF_S( writeable_output_details::is_span_like_range_v<
65 T, typename T::value_type> )> : std::true_type {
66 using CharT =
typename T::value_type;
68 template<
typename... StringViews>
69 static constexpr void write( T &out, StringViews
const &...svs ) {
70 static_assert(
sizeof...( StringViews ) > 0 );
72 daw::json::ErrorReason::OutputError );
73 DAW_CPP23_STATIC_LOCAL
constexpr auto writer =
78 (void)writeable_output_details::copy_to_buffer( s.data( ), sv );
79 s = s.subspan( sv.size( ) );
82 ( (void)writer( out, svs ), ... );
85 static constexpr void put( T &out,
char c ) {
87 daw::json::ErrorReason::OutputError );
88 *out.data( ) =
static_cast<CharT
>( c );
89 if constexpr( writeable_output_details::has_remove_prefix_v<T> ) {
90 out.remove_prefix( 1 );
92 out = out.subspan( 1 );
98 template<
typename Container>
99 DAW_REQUIRES( writeable_output_details::is_string_like_writable_output_v<
100 Container,
typename Container::value_type> )
101 struct writable_output_trait<Container DAW_ENABLEIF_S(
102 writeable_output_details::is_string_like_writable_output_v<
103 Container, typename Container::value_type> )> : std::true_type {
104 using CharT =
typename Container::value_type;
106 template<
typename... StringViews>
107 static constexpr void write( Container &out,
108 StringViews
const &...svs ) {
109 static_assert(
sizeof...( StringViews ) > 0 );
110 auto const start_pos = out.size( );
111 auto const total_size = ( std::size( svs ) + ... );
112 out.resize( start_pos + total_size );
114 DAW_CPP23_STATIC_LOCAL
constexpr auto writer =
119 p = writeable_output_details::copy_to_buffer( p, sv );
122 auto *ptr = out.data( ) + start_pos;
123 ( (void)writer( ptr, svs ), ... );
126 static constexpr void put( Container &out,
char c ) {
127 out.push_back(
static_cast<CharT
>( c ) );
132 static constexpr void reserve( Container &out, std::size_t n ) {
133 if constexpr( writeable_output_details::has_capacity_reserve_v<
135 auto const needed = out.size( ) + n;
136 if( out.capacity( ) < needed ) {
137 auto const doubled = out.capacity( ) * 2;
138 out.reserve( needed < doubled ? doubled : needed );
146 DAW_REQUIRES( writeable_output_details::is_writable_output_iterator_v<T> )
147 struct writable_output_trait<T DAW_ENABLEIF_S(
148 writeable_output_details::is_writable_output_iterator_v<T> )>
151 template<
typename... StringViews>
152 static constexpr void write( T &it, StringViews
const &...svs ) {
153 static_assert(
sizeof...( StringViews ) > 0 );
155 DAW_CPP23_STATIC_LOCAL
constexpr auto writer =
157 for(
char c : daw::string_view( sv ) ) {
163 ( (void)writer( it, svs ), ... );
166 static constexpr void put( T &it,
char c ) {