21
21
#include " catch_objc_arc.hpp"
22
22
#endif
23
23
24
+ #ifdef CATCH_CPP11_OR_GREATER
25
+ #include < tuple>
26
+ #include < type_traits>
27
+ #endif
28
+
24
29
namespace Catch {
25
30
26
31
// Why we're here.
27
32
template <typename T>
28
33
std::string toString ( T const & value );
29
34
35
+ // Built in overloads
36
+
37
+ std::string toString ( std::string const & value );
38
+ std::string toString ( std::wstring const & value );
39
+ std::string toString ( const char * const value );
40
+ std::string toString ( char * const value );
41
+ std::string toString ( const wchar_t * const value );
42
+ std::string toString ( wchar_t * const value );
43
+ std::string toString ( int value );
44
+ std::string toString ( unsigned long value );
45
+ std::string toString ( unsigned int value );
46
+ std::string toString ( const double value );
47
+ std::string toString ( const float value );
48
+ std::string toString ( bool value );
49
+ std::string toString ( char value );
50
+ std::string toString ( signed char value );
51
+ std::string toString ( unsigned char value );
52
+
53
+ #ifdef CATCH_CONFIG_CPP11_NULLPTR
54
+ std::string toString ( std::nullptr_t );
55
+ #endif
56
+
57
+ #ifdef __OBJC__
58
+ std::string toString ( NSString const * const & nsstring );
59
+ std::string toString ( NSString * CATCH_ARC_STRONG const & nsstring );
60
+ std::string toString ( NSObject* const & nsObject );
61
+ #endif
62
+
63
+
30
64
namespace Detail {
31
65
32
66
extern std::string unprintableString;
@@ -166,6 +200,50 @@ std::string toString( std::vector<T,Allocator> const& v ) {
166
200
return Detail::rangeToString ( v.begin (), v.end () );
167
201
}
168
202
203
+
204
+ #ifdef CATCH_CPP11_OR_GREATER
205
+ /*
206
+ toString for tuples
207
+ */
208
+ namespace TupleDetail {
209
+ template <
210
+ typename Tuple,
211
+ std::size_t N = 0 ,
212
+ bool = (N < std::tuple_size<Tuple>::value)
213
+ >
214
+ struct ElementPrinter {
215
+ static void print ( const Tuple& tuple, std::ostream& os )
216
+ {
217
+ os << ( N ? " , " : " " )
218
+ << Catch::toString (std::get<N>(tuple));
219
+ ElementPrinter<Tuple,N+1 >::print (tuple,os);
220
+ }
221
+ };
222
+
223
+ template <
224
+ typename Tuple,
225
+ std::size_t N
226
+ >
227
+ struct ElementPrinter <Tuple,N,false > {
228
+ static void print ( const Tuple&, std::ostream& ) {}
229
+ };
230
+
231
+ }
232
+
233
+ template <typename ...Types>
234
+ struct StringMaker <std::tuple<Types...>> {
235
+
236
+ static std::string convert ( const std::tuple<Types...>& tuple )
237
+ {
238
+ std::ostringstream os;
239
+ os << ' {' ;
240
+ TupleDetail::ElementPrinter<std::tuple<Types...>>::print ( tuple, os );
241
+ os << " }" ;
242
+ return os.str ();
243
+ }
244
+ };
245
+ #endif
246
+
169
247
namespace Detail {
170
248
template <typename T>
171
249
std::string makeString ( T const & value ) {
@@ -185,33 +263,6 @@ std::string toString( T const& value ) {
185
263
return StringMaker<T>::convert ( value );
186
264
}
187
265
188
- // Built in overloads
189
-
190
- std::string toString ( std::string const & value );
191
- std::string toString ( std::wstring const & value );
192
- std::string toString ( const char * const value );
193
- std::string toString ( char * const value );
194
- std::string toString ( const wchar_t * const value );
195
- std::string toString ( wchar_t * const value );
196
- std::string toString ( int value );
197
- std::string toString ( unsigned long value );
198
- std::string toString ( unsigned int value );
199
- std::string toString ( const double value );
200
- std::string toString ( const float value );
201
- std::string toString ( bool value );
202
- std::string toString ( char value );
203
- std::string toString ( signed char value );
204
- std::string toString ( unsigned char value );
205
-
206
- #ifdef CATCH_CONFIG_CPP11_NULLPTR
207
- std::string toString ( std::nullptr_t );
208
- #endif
209
-
210
- #ifdef __OBJC__
211
- std::string toString ( NSString const * const & nsstring );
212
- std::string toString ( NSString * CATCH_ARC_STRONG const & nsstring );
213
- std::string toString ( NSObject* const & nsObject );
214
- #endif
215
266
216
267
namespace Detail {
217
268
template <typename InputIterator>
0 commit comments