10 #ifndef INCLUDED_RTL_STRINGCONCAT_HXX
11 #define INCLUDED_RTL_STRINGCONCAT_HXX
17 #ifdef 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;
150 template<
typename T1,
typename T2 >
154 OStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
155 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
156 char* addData(
char* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
171 template<
typename T1,
typename T2 >
172 struct OUStringConcat
175 OUStringConcat(
const T1& left_,
const T2& right_ ) : left( left_ ), right( right_ ) {}
176 int length()
const {
return ToStringHelper< T1 >::length( left ) + ToStringHelper< T2 >::length( right ); }
177 sal_Unicode* addData(
sal_Unicode* buffer )
const {
return ToStringHelper< T2 >::addData( ToStringHelper< T1 >::addData( buffer, left ), right ); }
183 template<
typename T1,
typename T2 >
184 struct ToStringHelper< OStringConcat< T1, T2 > >
186 static int length(
const OStringConcat< T1, T2 >& c ) {
return c.length(); }
187 static char* addData(
char* buffer,
const OStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
188 static const bool allowOStringConcat = ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat;
189 static const bool allowOUStringConcat =
false;
192 template<
typename T1,
typename T2 >
193 struct ToStringHelper< OUStringConcat< T1, T2 > >
195 static int length(
const OUStringConcat< T1, T2 >& c ) {
return c.length(); }
196 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUStringConcat< T1, T2 >& c ) {
return c.addData( buffer ); }
197 static const bool allowOStringConcat =
false;
198 static const bool allowOUStringConcat = ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat;
201 template<
typename T1,
typename T2 >
204 typename internal::Enable< OStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOStringConcat && ToStringHelper< T2 >::allowOStringConcat >::Type operator+(
const T1& left,
const T2& right )
206 return OStringConcat< T1, T2 >( left, right );
210 template<
typename T,
int N >
213 typename internal::Enable< OStringConcat< T, const char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
const char (&right)[ N ] )
215 return OStringConcat< T, const char[ N ] >( left, right );
218 template<
typename T,
int N >
221 typename internal::Enable< OStringConcat< const char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const char (&left)[ N ],
const T& right )
223 return OStringConcat< const char[ N ], T >( left, right );
226 template<
typename T,
int N >
229 typename internal::Enable< OStringConcat< T, char[ N ] >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
const T& left,
char (&right)[ N ] )
231 return OStringConcat< T, char[ N ] >( left, right );
234 template<
typename T,
int N >
237 typename internal::Enable< OStringConcat< char[ N ], T >, ToStringHelper< T >::allowOStringConcat >::Type operator+(
char (&left)[ N ],
const T& right )
239 return OStringConcat< char[ N ], T >( left, right );
242 template<
typename T1,
typename T2 >
244 typename internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat >::Type operator+(
const T1& left,
const T2& right )
246 return OUStringConcat< T1, T2 >( left, right );
249 template<
typename T1,
typename T2 >
251 typename internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat && internal::ConstCharArrayDetector< T1, void >::ok >::Type operator+( T1& left,
const T2& right )
253 return OUStringConcat< T1, T2 >( left, right );
256 template<
typename T1,
typename T2 >
258 typename internal::Enable< OUStringConcat< T1, T2 >, ToStringHelper< T1 >::allowOUStringConcat && ToStringHelper< T2 >::allowOUStringConcat && internal::ConstCharArrayDetector< T2, void >::ok >::Type operator+(
const T1& left, T2& right )
260 return OUStringConcat< T1, T2 >( left, right );
263 #ifdef RTL_STRING_UNITTEST_CONCAT
266 struct StringConcatInvalid
268 template<
typename T >
269 StringConcatInvalid(
const T& ) {}
271 template<
typename T >
273 int operator+(
const StringConcatInvalid&,
const T& )
275 rtl_string_unittest_invalid_concat =
true;
sal_uInt16 sal_Unicode
Definition: types.h:136
T1 static_int_cast(T2 n)
A static_cast between integral types, to avoid C++ compiler warnings.
Definition: types.h:443
#define SAL_WARN_UNUSED_RESULT
Use this as markup for functions and methods whose return value must be checked.
Definition: types.h:305