10 #ifndef INCLUDED_RTL_STRINGCONCAT_HXX
11 #define INCLUDED_RTL_STRINGCONCAT_HXX
18 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
20 #ifdef RTL_STRING_UNITTEST
21 #define rtl rtlunittest
25 #ifdef RTL_STRING_UNITTEST
48 template<
typename T >
52 static int length(
const T& );
54 static char* addData(
char* buffer,
const T& );
58 static const bool allowOStringConcat =
false;
60 static const bool allowOUStringConcat =
false;
64 char* addDataHelper(
char* buffer,
const char* data,
int length )
66 memcpy( buffer, data, length );
67 return buffer + length;
73 memcpy( buffer, data, length *
sizeof(
sal_Unicode ));
74 return buffer + length;
86 char* addDataCString(
char* buffer,
const char* str )
102 struct ToStringHelper< const char* >
104 static int length(
const char* str ) {
107 static char* addData(
char* buffer,
const char* str ) {
return addDataCString( buffer, str ); }
108 static const bool allowOStringConcat =
true;
109 static const bool allowOUStringConcat =
false;
113 struct ToStringHelper< char* >
115 static int length(
const char* str ) {
118 static char* addData(
char* buffer,
const char* str ) {
return addDataCString( buffer, str ); }
119 static const bool allowOStringConcat =
true;
120 static const bool allowOUStringConcat =
false;
124 struct ToStringHelper< char[ N ] >
126 static int length(
const char str[ N ] ) {
129 static char* addData(
char* buffer,
const char str[ N ] ) {
return addDataCString( buffer, str ); }
130 static sal_Unicode* addData(
sal_Unicode* buffer,
const char str[ N ] ) {
return addDataLiteral( buffer, str, N - 1 ); }
131 static const bool allowOStringConcat =
true;
132 static const bool allowOUStringConcat =
false;
136 struct ToStringHelper< const char[ N ] >
138 static int length(
const char str[ N ] ) { (void)str; assert( strlen( str ) == N - 1 );
return N - 1; }
139 static char* addData(
char* buffer,
const char str[ N ] ) {
return addDataHelper( buffer, str, N - 1 ); }
140 static sal_Unicode* addData(
sal_Unicode* buffer,
const char str[ N ] ) {
return addDataLiteral( buffer, str, N - 1 ); }
141 static const bool allowOStringConcat =
true;
142 static const bool allowOUStringConcat =
true;
145 template<std::
size_t N>
struct ToStringHelper<
sal_Unicode const[N]> {
146 static int length(
sal_Unicode const[N]) {
return N - 1; }
148 {
return addDataHelper(buffer, str, N - 1); }
149 static bool const allowOStringConcat =
false;
150 static bool const allowOUStringConcat =
true;
153 template<>
struct ToStringHelper<OUStringLiteral1_> {
154 static int length(OUStringLiteral1_) {
return 1; }
157 {
return addDataHelper(buffer, &literal.c, 1); }
158 static bool const allowOStringConcat =
false;
159 static bool const allowOUStringConcat =
true;
168 template<
typename T1,
typename T2 >
172 OStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
173 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
174 char* addData(
char* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
189 template<
typename T1,
typename T2 >
190 struct OUStringConcat
193 OUStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
194 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
195 sal_Unicode* addData(
sal_Unicode* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
201 template<
typename T1,
typename T2 >
202 struct ToStringHelper< OStringConcat< T1, T2 > >
204 static int length(
const OStringConcat< T1, T2 >& c ) {
return c.length(); }
205 static char* addData(
char* buffer,
const OStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
206 static const bool allowOStringConcat = ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat;
207 static const bool allowOUStringConcat =
false;
210 template<
typename T1,
typename T2 >
211 struct ToStringHelper< OUStringConcat< T1, T2 > >
213 static int length(
const OUStringConcat< T1, T2 >& c ) {
return c.length(); }
214 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
215 static const bool allowOStringConcat =
false;
216 static const bool allowOUStringConcat = ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat;
219 template<
typename T1,
typename T2 >
222 typename libreoffice_internal::Enable< OStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat >::Type operator+(
const T1& left,
const T2& right )
224 return OStringConcat< T1, T2 >( left, right );
228 template<
typename T,
int N >
231 typename libreoffice_internal::Enable< OStringConcat< T, const char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
const char (&right)[ N ] )
233 return OStringConcat< T, const char[ N ] >( left, right );
236 template<
typename T,
int N >
239 typename libreoffice_internal::Enable< OStringConcat< const char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const char (&left)[ N ],
const T& right )
241 return OStringConcat< const char[ N ], T >( left, right );
244 template<
typename T,
int N >
247 typename libreoffice_internal::Enable< OStringConcat< T, char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
char (&right)[ N ] )
249 return OStringConcat< T, char[ N ] >( left, right );
252 template<
typename T,
int N >
255 typename libreoffice_internal::Enable< OStringConcat< char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
char (&left)[ N ],
const T& right )
257 return OStringConcat< char[ N ], T >( left, right );
260 template<
typename T1,
typename T2 >
263 typename libreoffice_internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat >::Type operator+(
const T1& left,
const T2& right )
265 return OUStringConcat< T1, T2 >( left, right );
268 template<
typename T1,
typename T2 >
271 typename libreoffice_internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat && libreoffice_internal::ConstCharArrayDetector< T1, void >::ok >::Type operator+( T1& left,
const T2& right )
273 return OUStringConcat< T1, T2 >( left, right );
276 template<
typename T1,
typename T2 >
279 typename libreoffice_internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat && libreoffice_internal::ConstCharArrayDetector< T2, void >::ok >::Type operator+(
const T1& left, T2& right )
281 return OUStringConcat< T1, T2 >( left, right );
284 #ifdef RTL_STRING_UNITTEST_CONCAT
287 struct StringConcatInvalid
289 template<
typename T >
290 StringConcatInvalid(
const T& ) {}
292 template<
typename T >
294 int operator+(
const StringConcatInvalid&,
const T& )
296 rtl_string_unittest_invalid_concat =
true;
#define SAL_WARN_UNUSED_RESULT
Use this as markup for functions and methods whose return value must be checked.
Definition: types.h:325
sal_uInt16 sal_Unicode
Definition: types.h:155
T1 static_int_cast(T2 n)
A static_cast between integral types, to avoid C++ compiler warnings.
Definition: types.h:473