1
#ifndef CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
2
#define CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
5
// Type CppUT::Stream (either std::stream or a custom type)
6
// Type CppUT::OStringStream (eitjer std::ostringstream, older alternate or a custom type)
7
// Functions stdCOut() & stdCErr() which returns a reference on cout & cerr stream (or our
10
#include <cppunit/Portability.h>
13
#if defined( CPPUNIT_NO_STREAM )
24
virtual ~StreamBuffer() {}
26
virtual void write( const char *text, unsigned int length ) = 0;
28
virtual void flush() {}
32
class StringStreamBuffer : public StreamBuffer
35
std::string str() const
40
public: // overridden from StreamBuffer
41
void write( const char *text, unsigned int length )
43
str_.append( text, length );
51
class FileStreamBuffer : public StreamBuffer
54
FileStreamBuffer( FILE *file )
64
public: // overridden from StreamBuffer
65
void write( const char *text, unsigned int length )
68
fwrite( text, sizeof(char), length, file_ );
90
OStream( StreamBuffer *buffer )
107
void setBuffer( StreamBuffer *buffer )
112
OStream &write( const char *text, unsigned int length )
115
buffer_->write( text, length );
119
OStream &write( const char *text )
121
return write( text, strlen(text) );
124
OStream &operator <<( bool v )
126
const char *out = v ? "true" : "false";
130
OStream &operator <<( short v )
133
sprintf( buffer, "%hd", v );
134
return write( buffer );
137
OStream &operator <<( unsigned short v )
140
sprintf( buffer, "%hu", v );
141
return write( buffer );
144
OStream &operator <<( int v )
147
sprintf( buffer, "%d", v );
148
return write( buffer );
151
OStream &operator <<( unsigned int v )
154
sprintf( buffer, "%u", v );
155
return write( buffer );
158
OStream &operator <<( long v )
161
sprintf( buffer, "%ld", v );
162
return write( buffer );
165
OStream &operator <<( unsigned long v )
168
sprintf( buffer, "%lu", v );
169
return write( buffer );
172
OStream &operator <<( float v )
175
sprintf( buffer, "%.16g", double(v) );
176
return write( buffer );
179
OStream &operator <<( double v )
182
sprintf( buffer, "%.16g", v );
183
return write( buffer );
186
OStream &operator <<( long double v )
189
sprintf( buffer, "%.16g", double(v) );
190
return write( buffer );
193
OStream &operator <<( const void *v )
196
sprintf( buffer, "%p", v );
197
return write( buffer );
200
OStream &operator <<( const char *v )
202
return write( v ? v : "NULL" );
205
OStream &operator <<( char c )
208
sprintf( buffer, "%c", c );
209
return write( buffer );
212
OStream &operator <<( const std::string &s )
214
return write( s.c_str(), s.length() );
218
StreamBuffer *buffer_;
222
class OStringStream : public OStream
226
: OStream( &buffer_ )
230
std::string str() const
232
return buffer_.str();
236
StringStreamBuffer buffer_;
240
class OFileStream : public OStream
243
OFileStream( FILE *file )
244
: OStream( &buffer_ )
250
OFileStream( const char *path )
251
: OStream( &buffer_ )
252
, buffer_( fopen( path, "wt" ) )
257
virtual ~OFileStream()
259
if ( ownFile_ && buffer_.file() )
260
fclose( buffer_.file() );
264
FileStreamBuffer buffer_;
268
inline OStream &stdCOut()
270
static OFileStream stream( stdout );
274
inline OStream &stdCErr()
276
static OFileStream stream( stderr );
282
#elif CPPUNIT_HAVE_SSTREAM // #if defined( CPPUNIT_NO_STREAM )
287
typedef std::ostringstream OStringStream; // The standard C++ way
288
typedef std::ofstream OFileStream;
292
#elif CPPUNIT_HAVE_CLASS_STRSTREAM
294
# if CPPUNIT_HAVE_STRSTREAM
295
# include <strstream>
296
# else // CPPUNIT_HAVE_STRSTREAM
297
# include <strstream.h>
298
# endif // CPPUNIT_HAVE_CLASS_STRSTREAM
302
class OStringStream : public std::ostrstream
308
// std::string msg(std::ostrstream::str());
309
// std::ostrstream::freeze(false);
311
// Alternative implementation that don't rely on freeze which is not
312
// available on some platforms:
313
return std::string( std::ostrstream::str(), pcount() );
318
#else // CPPUNIT_HAVE_CLASS_STRSTREAM
319
# error Cannot define CppUnit::OStringStream.
320
#endif // #if defined( CPPUNIT_NO_STREAM )
324
#if !defined( CPPUNIT_NO_STREAM )
330
typedef std::ostream OStream;
332
inline OStream &stdCOut()
337
inline OStream &stdCErr()
344
#endif // #if !defined( CPPUNIT_NO_STREAM )
346
#endif // CPPUNIT_PORTABILITY_STREAM_H_INCLUDED