23 namespace concepts::writeable_output_details {
25 constexpr T *copy_to_buffer( T *buff, daw::string_view source ) {
26 if( DAW_IS_CONSTANT_EVALUATED_COMPAT( ) ) {
27 daw::algorithm::transform_n( source.data( ),
32 return static_cast<T>( c );
35 memcpy( buff, source.data( ), source.size( ) );
37 return buff + source.size( );
41 DAW_CPP20_CONCEPT is_byte_type_v =
42 std::is_same_v<T, std::byte> or std::is_same_v<T, unsigned char>;
45 DAW_CPP20_CONCEPT is_char_sized_character_v =
46 std::is_same_v<T, char>
47#if defined( __cpp_lib_char8_t )
48#if __cpp_lib_char8_t >= 201907L
49 or std::is_same_v<T, char8_t>
54 template<
typename T,
typename CharT>
55 using span_like_range_test =
56 decltype( (void)( std::declval<T &>( ).subspan( 1 ) ),
57 (
void)( std::declval<std::size_t &>( ) =
58 std::declval<T &>( ).size( ) ),
59 (
void)( std::declval<bool &>( ) =
60 std::declval<T &>( ).empty( ) ),
61 (
void)( *std::declval<T &>( ).data( ) =
62 std::declval<CharT>( ) ) );
63 template<
typename T,
typename CharT>
64 DAW_CPP20_CONCEPT is_span_like_range_v =
65 daw::is_detected_v<span_like_range_test, T, CharT> and
66 ( writeable_output_details::is_char_sized_character_v<CharT> or
67 writeable_output_details::is_byte_type_v<CharT> );
69 template<
typename T,
typename CharT>
70 using resizable_contiguous_range_test =
71 decltype( (void)( std::declval<T &>( ).resize( std::size_t{ 0 } ) ),
72 (void)( std::declval<T &>( ).size( ) ),
73 (
void)( *std::declval<T &>( ).data( ) ),
74 (
void)( *std::declval<T &>( ).data( ) =
75 std::declval<CharT>( ) ),
76 (
void)( std::declval<T &>( ).push_back(
77 std::declval<CharT>( ) ) ),
78 (
void)(
static_cast<CharT
>(
'a' ) ) );
80 template<
typename Container,
typename CharT>
81 DAW_CPP20_CONCEPT is_resizable_contiguous_range_v =
82 daw::is_detected_v<resizable_contiguous_range_test, Container, CharT>;
84 template<
typename Container,
typename CharT>
85 DAW_CPP20_CONCEPT is_string_like_writable_output_v =
86 ( writeable_output_details::is_char_sized_character_v<CharT> or
87 writeable_output_details::is_byte_type_v<CharT> ) and
88 writeable_output_details::is_resizable_contiguous_range_v<Container,
92 using is_writable_output_iterator_test =
93 decltype( *std::declval<T &>( ) =
'c', ++std::declval<T &>( ) );
96 DAW_CPP20_CONCEPT is_writable_output_iterator_v =
97 not std::is_pointer_v<T> and
98 daw::is_detected_v<is_writable_output_iterator_test, T>;