10 #ifndef INCLUDED_RTL_STRINGCONCAT_HXX 11 #define INCLUDED_RTL_STRINGCONCAT_HXX 18 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING" 20 #if defined RTL_STRING_UNITTEST_CONCAT 21 extern bool rtl_string_unittest_invalid_concat;
24 #ifdef RTL_STRING_UNITTEST 25 #define rtl rtlunittest 29 #ifdef RTL_STRING_UNITTEST 52 template<
typename T >
56 static int length(
const T& );
58 static char* addData(
char* buffer,
const T& );
62 static const bool allowOStringConcat =
false;
64 static const bool allowOUStringConcat =
false;
68 char* addDataHelper(
char* buffer,
const char* data,
int length )
70 memcpy( buffer, data, length );
71 return buffer + length;
77 memcpy( buffer, data, length *
sizeof(
sal_Unicode ));
78 return buffer + length;
90 char* addDataCString(
char* buffer,
const char* str )
100 while( *str !=
'\0' )
106 struct ToStringHelper< const char* >
108 static int length(
const char* str ) {
111 static char* addData(
char* buffer,
const char* str ) {
return addDataCString( buffer, str ); }
112 static const bool allowOStringConcat =
true;
113 static const bool allowOUStringConcat =
false;
117 struct ToStringHelper< char* >
119 static int length(
const char* str ) {
122 static char* addData(
char* buffer,
const char* str ) {
return addDataCString( buffer, str ); }
123 static const bool allowOStringConcat =
true;
124 static const bool allowOUStringConcat =
false;
128 struct ToStringHelper< char[ N ] >
130 static int length(
const char str[ N ] ) {
133 static char* addData(
char* buffer,
const char str[ N ] ) {
return addDataCString( buffer, str ); }
134 static sal_Unicode* addData(
sal_Unicode* buffer,
const char str[ N ] ) {
return addDataLiteral( buffer, str, N - 1 ); }
135 static const bool allowOStringConcat =
true;
136 static const bool allowOUStringConcat =
false;
140 struct ToStringHelper< const char[ N ] >
142 static int length(
const char str[ N ] ) { (void)str; assert( strlen( str ) == N - 1 );
return N - 1; }
143 static char* addData(
char* buffer,
const char str[ N ] ) {
return addDataHelper( buffer, str, N - 1 ); }
144 static sal_Unicode* addData(
sal_Unicode* buffer,
const char str[ N ] ) {
return addDataLiteral( buffer, str, N - 1 ); }
145 static const bool allowOStringConcat =
true;
146 static const bool allowOUStringConcat =
true;
149 template<std::
size_t N>
struct ToStringHelper<
sal_Unicode const[N]> {
150 static int length(
sal_Unicode const[N]) {
return N - 1; }
152 {
return addDataHelper(buffer, str, N - 1); }
153 static bool const allowOStringConcat =
false;
154 static bool const allowOUStringConcat =
true;
157 template<>
struct ToStringHelper<OUStringLiteral1_> {
158 static int length(OUStringLiteral1_) {
return 1; }
161 {
return addDataHelper(buffer, &literal.c, 1); }
162 static bool const allowOStringConcat =
false;
163 static bool const allowOUStringConcat =
true;
172 template<
typename T1,
typename T2 >
176 OStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
177 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
178 char* addData(
char* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
193 template<
typename T1,
typename T2 >
194 struct OUStringConcat
197 OUStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
198 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
199 sal_Unicode* addData(
sal_Unicode* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
205 template<
typename T1,
typename T2 >
206 struct ToStringHelper< OStringConcat< T1, T2 > >
208 static int length(
const OStringConcat< T1, T2 >& c ) {
return c.length(); }
209 static char* addData(
char* buffer,
const OStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
210 static const bool allowOStringConcat = ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat;
211 static const bool allowOUStringConcat =
false;
214 template<
typename T1,
typename T2 >
215 struct ToStringHelper< OUStringConcat< T1, T2 > >
217 static int length(
const OUStringConcat< T1, T2 >& c ) {
return c.length(); }
218 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
219 static const bool allowOStringConcat =
false;
220 static const bool allowOUStringConcat = ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat;
223 template<
typename T1,
typename T2 >
226 typename libreoffice_internal::Enable< OStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat >::Type operator+(
const T1& left,
const T2& right )
228 return OStringConcat< T1, T2 >( left, right );
232 template<
typename T,
int N >
235 typename libreoffice_internal::Enable< OStringConcat< T, const char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
const char (&right)[ N ] )
237 return OStringConcat< T, const char[ N ] >( left, right );
240 template<
typename T,
int N >
243 typename libreoffice_internal::Enable< OStringConcat< const char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const char (&left)[ N ],
const T& right )
245 return OStringConcat< const char[ N ], T >( left, right );
248 template<
typename T,
int N >
251 typename libreoffice_internal::Enable< OStringConcat< T, char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
char (&right)[ N ] )
253 return OStringConcat< T, char[ N ] >( left, right );
256 template<
typename T,
int N >
259 typename libreoffice_internal::Enable< OStringConcat< char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
char (&left)[ N ],
const T& right )
261 return OStringConcat< char[ N ], T >( left, right );
264 template<
typename T1,
typename T2 >
267 typename libreoffice_internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat >::Type operator+(
const T1& left,
const T2& right )
269 return OUStringConcat< T1, T2 >( left, right );
272 template<
typename T1,
typename T2 >
277 return OUStringConcat< T1, T2 >( left, right );
280 template<
typename T1,
typename T2 >
285 return OUStringConcat< T1, T2 >( left, right );
288 #ifdef RTL_STRING_UNITTEST_CONCAT 291 struct StringConcatInvalid
293 template<
typename T >
294 StringConcatInvalid(
const T& ) {}
296 template<
typename T >
298 int operator+(
const StringConcatInvalid&,
const T& )
300 rtl_string_unittest_invalid_concat =
true;
sal_uInt16 sal_Unicode
Definition: types.h:142
static const bool ok
Definition: stringutils.hxx:160
T1 static_int_cast(T2 n)
A static_cast between integral types, to avoid C++ compiler warnings.
Definition: types.h:447
#define SAL_WARN_UNUSED_RESULT
Use this as markup for functions and methods whose return value must be checked.
Definition: types.h:307
Definition: bootstrap.hxx:29