CppUnit project page FAQ CppUnit home page

Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

Stream.h

Go to the documentation of this file.
00001 #ifndef CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
00002 #define CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
00003 
00004 // This module define:
00005 // Type CppUT::Stream (either std::stream or a custom type)
00006 // Type CppUT::OStringStream (eitjer std::ostringstream, older alternate or a custom type)
00007 // Functions stdCOut() & stdCErr() which returns a reference on cout & cerr stream (or our
00008 // custom stream).
00009 
00010 #include <cppunit/Portability.h>
00011 
00012 
00013 #if defined( CPPUNIT_NO_STREAM )
00014 
00015 #include <string>
00016 #include <stdio.h>
00017 #include <string.h>
00018 
00019 CPPUNIT_NS_BEGIN
00020 
00021 class StreamBuffer
00022 {
00023 public:
00024    virtual ~StreamBuffer() {}
00025 
00026    virtual void write( const char *text, unsigned int length ) = 0;
00027 
00028    virtual void flush() {}
00029 };
00030 
00031 
00032 class StringStreamBuffer : public StreamBuffer
00033 {
00034 public:
00035    std::string str() const
00036    {
00037       return str_;
00038    }
00039 
00040 public: // overridden from StreamBuffer
00041    void write( const char *text, unsigned int length )
00042    {
00043       str_.append( text, length );
00044    }
00045 
00046 private:
00047    std::string str_;
00048 };
00049 
00050 
00051 class FileStreamBuffer : public StreamBuffer
00052 {
00053 public:
00054    FileStreamBuffer( FILE *file )
00055       : file_( file )
00056    {
00057    }
00058 
00059    FILE *file() const
00060    {
00061       return file_;
00062    }
00063 
00064 public: // overridden from StreamBuffer
00065    void write( const char *text, unsigned int length )
00066    {
00067       if ( file_ )
00068          fwrite( text, sizeof(char), length, file_ );
00069    }
00070 
00071    void flush() 
00072    {
00073       if ( file_ )
00074          fflush( file_ );
00075    }
00076 
00077 private:
00078    FILE *file_;
00079 };
00080 
00081 
00082 class OStream
00083 {
00084 public:
00085    OStream()
00086       : buffer_( 0 )
00087    {
00088    }
00089 
00090    OStream( StreamBuffer *buffer )
00091       : buffer_( buffer )
00092    {
00093    }
00094 
00095    virtual ~OStream()
00096    {
00097      flush();
00098    }
00099 
00100    OStream &flush()
00101    {
00102            if ( buffer_ )
00103                     buffer_->flush();
00104            return *this;
00105    }
00106 
00107    void setBuffer( StreamBuffer *buffer )
00108    {
00109       buffer_ = buffer;
00110    }
00111 
00112    OStream &write( const char *text, unsigned int length )
00113    {
00114       if ( buffer_ )
00115          buffer_->write( text, length );
00116       return *this;
00117    }
00118 
00119    OStream &write( const char *text )
00120    {
00121       return write( text, strlen(text) );
00122    }
00123 
00124    OStream &operator <<( bool v )
00125    {
00126       const char *out = v ? "true" : "false";
00127       return write( out );
00128    }
00129 
00130    OStream &operator <<( short v )
00131    {
00132       char buffer[64];
00133       sprintf( buffer, "%hd", v );
00134       return write( buffer );
00135    }
00136 
00137    OStream &operator <<( unsigned short v )
00138    {
00139       char buffer[64];
00140       sprintf( buffer, "%hu", v );
00141       return write( buffer );
00142    }
00143 
00144    OStream &operator <<( int v )
00145    {
00146       char buffer[64];
00147       sprintf( buffer, "%d", v );
00148       return write( buffer );
00149    }
00150 
00151    OStream &operator <<( unsigned int v )
00152    {
00153       char buffer[64];
00154       sprintf( buffer, "%u", v );
00155       return write( buffer );
00156    }
00157 
00158    OStream &operator <<( long v )
00159    {
00160       char buffer[64];
00161       sprintf( buffer, "%ld", v );
00162       return write( buffer );
00163    }
00164 
00165    OStream &operator <<( unsigned long v )
00166    {
00167       char buffer[64];
00168       sprintf( buffer, "%lu", v );
00169       return write( buffer );
00170    }
00171 
00172    OStream &operator <<( float v )
00173    {
00174       char buffer[128];
00175       sprintf( buffer, "%.16g", double(v) );
00176       return write( buffer );
00177    }
00178 
00179    OStream &operator <<( double v )
00180    {
00181       char buffer[128];
00182       sprintf( buffer, "%.16g", v );
00183       return write( buffer );
00184    }
00185 
00186    OStream &operator <<( long double v )
00187    {
00188       char buffer[128];
00189       sprintf( buffer, "%.16g", double(v) );
00190       return write( buffer );
00191    }
00192 
00193    OStream &operator <<( const void *v )
00194    {
00195       char buffer[64];
00196       sprintf( buffer, "%p", v );
00197       return write( buffer );
00198    }
00199 
00200    OStream &operator <<( const char *v )
00201    {
00202       return write( v ? v : "NULL" );
00203    }
00204 
00205    OStream &operator <<( char c )
00206    {
00207       char buffer[16];
00208       sprintf( buffer, "%c", c );
00209       return write( buffer );
00210    }
00211 
00212    OStream &operator <<( const std::string &s )
00213    {
00214       return write( s.c_str(), s.length() );
00215    }
00216 
00217 private:
00218    StreamBuffer *buffer_;
00219 };
00220 
00221 
00222 class OStringStream : public OStream
00223 {
00224 public:
00225         OStringStream()
00226                 : OStream( &buffer_ )
00227         {
00228         }
00229 
00230         std::string str() const
00231         {
00232                 return buffer_.str();
00233         }
00234 
00235 private:
00236         StringStreamBuffer buffer_;
00237 };
00238 
00239 
00240 class OFileStream : public OStream
00241 {
00242 public:
00243    OFileStream( FILE *file )
00244       : OStream( &buffer_ )
00245       , buffer_( file )
00246       , ownFile_( false )
00247    {
00248    }
00249 
00250    OFileStream( const char *path )
00251       : OStream( &buffer_ )
00252       , buffer_( fopen( path, "wt" ) )
00253       , ownFile_( true )
00254    {
00255    }
00256 
00257    virtual ~OFileStream()
00258    {
00259       if ( ownFile_  &&  buffer_.file() )
00260          fclose( buffer_.file() );
00261    }
00262 
00263 private:
00264    FileStreamBuffer buffer_;
00265    bool ownFile_;
00266 };
00267 
00268 inline OStream &stdCOut() 
00269 {
00270    static OFileStream stream( stdout );
00271    return stream;
00272 }
00273 
00274 inline OStream &stdCErr() 
00275 {
00276    static OFileStream stream( stderr );
00277    return stream;
00278 }
00279 
00280 CPPUNIT_NS_END
00281 
00282 #elif CPPUNIT_HAVE_SSTREAM // #if defined( CPPUNIT_NO_STREAM )
00283 # include <sstream>
00284 # include <fstream>
00285 
00286     CPPUNIT_NS_BEGIN
00287     typedef std::ostringstream OStringStream;      // The standard C++ way
00288     typedef std::ofstream OFileStream;
00289     CPPUNIT_NS_END
00290 
00291 
00292 #elif CPPUNIT_HAVE_CLASS_STRSTREAM
00293 # include <string>
00294 # if CPPUNIT_HAVE_STRSTREAM
00295 #   include <strstream>
00296 # else // CPPUNIT_HAVE_STRSTREAM
00297 #  include <strstream.h>
00298 # endif // CPPUNIT_HAVE_CLASS_STRSTREAM
00299 
00300     CPPUNIT_NS_BEGIN
00301 
00302     class OStringStream : public std::ostrstream 
00303     {
00304     public:
00305         std::string str()
00306         {
00307 //            (*this) << '\0';
00308 //            std::string msg(std::ostrstream::str());
00309 //            std::ostrstream::freeze(false);
00310 //            return msg;
00311 // Alternative implementation that don't rely on freeze which is not
00312 // available on some platforms:
00313             return std::string( std::ostrstream::str(), pcount() );
00314         }
00315     };
00316 
00317     CPPUNIT_NS_END
00318 #else // CPPUNIT_HAVE_CLASS_STRSTREAM
00319 #   error Cannot define CppUnit::OStringStream.
00320 #endif // #if defined( CPPUNIT_NO_STREAM )
00321 
00322 
00323 
00324 #if !defined( CPPUNIT_NO_STREAM )
00325 
00326 #include <iostream>
00327 
00328     CPPUNIT_NS_BEGIN
00329 
00330     typedef std::ostream OStream;
00331 
00332     inline OStream &stdCOut() 
00333     {
00334         return std::cout;
00335     }
00336 
00337     inline OStream &stdCErr() 
00338     {
00339        return std::cerr;
00340     }
00341 
00342     CPPUNIT_NS_END
00343    
00344 #endif // #if !defined( CPPUNIT_NO_STREAM )
00345 
00346 #endif // CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
00347 

SourceForge Logo hosts this site. Send comments to:
CppUnit Developers