10 #ifndef INCLUDED_RTL_STRINGCONCAT_HXX 11 #define INCLUDED_RTL_STRINGCONCAT_HXX 17 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING" 19 #ifdef RTL_STRING_UNITTEST 20 #define rtl rtlunittest 24 #ifdef RTL_STRING_UNITTEST 47 template<
typename T >
51 static int length(
const T& );
53 static char* addData(
char* buffer,
const T& );
57 static const bool allowOStringConcat =
false;
59 static const bool allowOUStringConcat =
false;
63 char* addDataHelper(
char* buffer,
const char* data,
int length )
65 memcpy( buffer, data, length );
66 return buffer + length;
72 memcpy( buffer, data, length *
sizeof(
sal_Unicode ));
73 return buffer + length;
85 char* addDataCString(
char* buffer,
const char* str )
101 struct ToStringHelper< const char* >
103 static int length(
const char* str ) {
106 static char* addData(
char* buffer,
const char* str ) {
return addDataCString( buffer, str ); }
107 static const bool allowOStringConcat =
true;
108 static const bool allowOUStringConcat =
false;
112 struct ToStringHelper< char* >
114 static int length(
const char* str ) {
117 static char* addData(
char* buffer,
const char* str ) {
return addDataCString( buffer, str ); }
118 static const bool allowOStringConcat =
true;
119 static const bool allowOUStringConcat =
false;
123 struct ToStringHelper< char[ N ] >
125 static int length(
const char str[ N ] ) {
128 static char* addData(
char* buffer,
const char str[ N ] ) {
return addDataCString( buffer, str ); }
129 static sal_Unicode* addData(
sal_Unicode* buffer,
const char str[ N ] ) {
return addDataLiteral( buffer, str, N - 1 ); }
130 static const bool allowOStringConcat =
true;
131 static const bool allowOUStringConcat =
false;
135 struct ToStringHelper< const char[ N ] >
137 static int length(
const char str[ N ] ) { (void)str; assert( strlen( str ) == N - 1 );
return N - 1; }
138 static char* addData(
char* buffer,
const char str[ N ] ) {
return addDataHelper( buffer, str, N - 1 ); }
139 static sal_Unicode* addData(
sal_Unicode* buffer,
const char str[ N ] ) {
return addDataLiteral( buffer, str, N - 1 ); }
140 static const bool allowOStringConcat =
true;
141 static const bool allowOUStringConcat =
true;
144 template<
char C>
struct ToStringHelper<OUStringLiteral1_<C>> {
145 static int length(OUStringLiteral1_<C>) {
return 1; }
146 static char * addData(
char * buffer, OUStringLiteral1_<C> literal)
147 {
return addDataHelper(buffer, &literal.c, 1); }
149 sal_Unicode * buffer, OUStringLiteral1_<C> literal)
150 {
return addDataLiteral(buffer, &literal.c, 1); }
151 static bool const allowOStringConcat =
false;
152 static bool const allowOUStringConcat =
true;
161 template<
typename T1,
typename T2 >
165 OStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
166 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
167 char* addData(
char* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
182 template<
typename T1,
typename T2 >
183 struct OUStringConcat
186 OUStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
187 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
188 sal_Unicode* addData(
sal_Unicode* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
194 template<
typename T1,
typename T2 >
195 struct ToStringHelper< OStringConcat< T1, T2 > >
197 static int length(
const OStringConcat< T1, T2 >& c ) {
return c.length(); }
198 static char* addData(
char* buffer,
const OStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
199 static const bool allowOStringConcat = ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat;
200 static const bool allowOUStringConcat =
false;
203 template<
typename T1,
typename T2 >
204 struct ToStringHelper< OUStringConcat< T1, T2 > >
206 static int length(
const OUStringConcat< T1, T2 >& c ) {
return c.length(); }
207 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
208 static const bool allowOStringConcat =
false;
209 static const bool allowOUStringConcat = ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat;
212 template<
typename T1,
typename T2 >
215 typename libreoffice_internal::Enable< OStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat >::Type operator+(
const T1& left,
const T2& right )
217 return OStringConcat< T1, T2 >( left, right );
221 template<
typename T,
int N >
224 typename libreoffice_internal::Enable< OStringConcat< T, const char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
const char (&right)[ N ] )
226 return OStringConcat< T, const char[ N ] >( left, right );
229 template<
typename T,
int N >
232 typename libreoffice_internal::Enable< OStringConcat< const char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const char (&left)[ N ],
const T& right )
234 return OStringConcat< const char[ N ], T >( left, right );
237 template<
typename T,
int N >
240 typename libreoffice_internal::Enable< OStringConcat< T, char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
char (&right)[ N ] )
242 return OStringConcat< T, char[ N ] >( left, right );
245 template<
typename T,
int N >
248 typename libreoffice_internal::Enable< OStringConcat< char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
char (&left)[ N ],
const T& right )
250 return OStringConcat< char[ N ], T >( left, right );
253 template<
typename T1,
typename T2 >
256 typename libreoffice_internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat >::Type operator+(
const T1& left,
const T2& right )
258 return OUStringConcat< T1, T2 >( left, right );
261 template<
typename T1,
typename T2 >
266 return OUStringConcat< T1, T2 >( left, right );
269 template<
typename T1,
typename T2 >
274 return OUStringConcat< T1, T2 >( left, right );
277 #ifdef RTL_STRING_UNITTEST_CONCAT 280 struct StringConcatInvalid
282 template<
typename T >
283 StringConcatInvalid(
const T& ) {}
285 template<
typename T >
287 int operator+(
const StringConcatInvalid&,
const T& )
289 rtl_string_unittest_invalid_concat =
true;
sal_uInt16 sal_Unicode
Definition: types.h:155
static const bool ok
Definition: stringutils.hxx:162
T1 static_int_cast(T2 n)
A static_cast between integral types, to avoid C++ compiler warnings.
Definition: types.h:473
#define SAL_WARN_UNUSED_RESULT
Use this as markup for functions and methods whose return value must be checked.
Definition: types.h:325
Definition: bootstrap.hxx:29