Blame include/cppunit/portability/Stream.h

Packit 8c9aa0
#ifndef CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
Packit 8c9aa0
#define CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
Packit 8c9aa0
Packit 8c9aa0
// This module define:
Packit 8c9aa0
// Type CppUT::Stream (either std::stream or a custom type)
Packit 8c9aa0
// Type CppUT::OStringStream (eitjer std::ostringstream, older alternate or a custom type)
Packit 8c9aa0
// Functions stdCOut() & stdCErr() which returns a reference on cout & cerr stream (or our
Packit 8c9aa0
// custom stream).
Packit 8c9aa0
Packit 8c9aa0
#include <cppunit/Portability.h>
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
#if defined( CPPUNIT_NO_STREAM )
Packit 8c9aa0
Packit 8c9aa0
#include <string>
Packit 8c9aa0
#include <stdio.h>
Packit 8c9aa0
#include <string.h>
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_BEGIN
Packit 8c9aa0
Packit 8c9aa0
class StreamBuffer
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
   virtual ~StreamBuffer() {}
Packit 8c9aa0
Packit 8c9aa0
   virtual void write( const char *text, unsigned int length ) = 0;
Packit 8c9aa0
Packit 8c9aa0
   virtual void flush() {}
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
class StringStreamBuffer : public StreamBuffer
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
   std::string str() const
Packit 8c9aa0
   {
Packit 8c9aa0
      return str_;
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
public: // overridden from StreamBuffer
Packit 8c9aa0
   void write( const char *text, unsigned int length )
Packit 8c9aa0
   {
Packit 8c9aa0
      str_.append( text, length );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
private:
Packit 8c9aa0
   std::string str_;
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
class FileStreamBuffer : public StreamBuffer
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
   FileStreamBuffer( FILE *file )
Packit 8c9aa0
      : file_( file )
Packit 8c9aa0
   {
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   FILE *file() const
Packit 8c9aa0
   {
Packit 8c9aa0
      return file_;
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
public: // overridden from StreamBuffer
Packit 8c9aa0
   void write( const char *text, unsigned int length )
Packit 8c9aa0
   {
Packit 8c9aa0
      if ( file_ )
Packit 8c9aa0
         fwrite( text, sizeof(char), length, file_ );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   void flush() 
Packit 8c9aa0
   {
Packit 8c9aa0
      if ( file_ )
Packit 8c9aa0
         fflush( file_ );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
private:
Packit 8c9aa0
   FILE *file_;
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
class OStream
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
   OStream()
Packit 8c9aa0
      : buffer_( 0 )
Packit 8c9aa0
   {
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream( StreamBuffer *buffer )
Packit 8c9aa0
      : buffer_( buffer )
Packit 8c9aa0
   {
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   virtual ~OStream()
Packit 8c9aa0
   {
Packit 8c9aa0
     flush();
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &flush()
Packit 8c9aa0
   {
Packit 8c9aa0
	   if ( buffer_ )
Packit 8c9aa0
		    buffer_->flush();
Packit 8c9aa0
	   return *this;
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   void setBuffer( StreamBuffer *buffer )
Packit 8c9aa0
   {
Packit 8c9aa0
      buffer_ = buffer;
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &write( const char *text, unsigned int length )
Packit 8c9aa0
   {
Packit 8c9aa0
      if ( buffer_ )
Packit 8c9aa0
         buffer_->write( text, length );
Packit 8c9aa0
      return *this;
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &write( const char *text )
Packit 8c9aa0
   {
Packit 8c9aa0
      return write( text, strlen(text) );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( bool v )
Packit 8c9aa0
   {
Packit 8c9aa0
      const char *out = v ? "true" : "false";
Packit 8c9aa0
      return write( out );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( short v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[64];
Packit 8c9aa0
      sprintf( buffer, "%hd", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( unsigned short v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[64];
Packit 8c9aa0
      sprintf( buffer, "%hu", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( int v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[64];
Packit 8c9aa0
      sprintf( buffer, "%d", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( unsigned int v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[64];
Packit 8c9aa0
      sprintf( buffer, "%u", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( long v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[64];
Packit 8c9aa0
      sprintf( buffer, "%ld", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( unsigned long v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[64];
Packit 8c9aa0
      sprintf( buffer, "%lu", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( float v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[128];
Packit 8c9aa0
      sprintf( buffer, "%.16g", double(v) );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( double v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[128];
Packit 8c9aa0
      sprintf( buffer, "%.16g", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( long double v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[128];
Packit 8c9aa0
      sprintf( buffer, "%.16g", double(v) );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( const void *v )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[64];
Packit 8c9aa0
      sprintf( buffer, "%p", v );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( const char *v )
Packit 8c9aa0
   {
Packit 8c9aa0
      return write( v ? v : "NULL" );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( char c )
Packit 8c9aa0
   {
Packit 8c9aa0
      char buffer[16];
Packit 8c9aa0
      sprintf( buffer, "%c", c );
Packit 8c9aa0
      return write( buffer );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OStream &operator <<( const std::string &s )
Packit 8c9aa0
   {
Packit 8c9aa0
      return write( s.c_str(), s.length() );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
private:
Packit 8c9aa0
   StreamBuffer *buffer_;
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
class OStringStream : public OStream
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
	OStringStream()
Packit 8c9aa0
		: OStream( &buffer_ )
Packit 8c9aa0
	{
Packit 8c9aa0
	}
Packit 8c9aa0
Packit 8c9aa0
	std::string str() const
Packit 8c9aa0
	{
Packit 8c9aa0
		return buffer_.str();
Packit 8c9aa0
	}
Packit 8c9aa0
Packit 8c9aa0
private:
Packit 8c9aa0
	StringStreamBuffer buffer_;
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
class OFileStream : public OStream
Packit 8c9aa0
{
Packit 8c9aa0
public:
Packit 8c9aa0
   OFileStream( FILE *file )
Packit 8c9aa0
      : OStream( &buffer_ )
Packit 8c9aa0
      , buffer_( file )
Packit 8c9aa0
      , ownFile_( false )
Packit 8c9aa0
   {
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   OFileStream( const char *path )
Packit 8c9aa0
      : OStream( &buffer_ )
Packit 8c9aa0
      , buffer_( fopen( path, "wt" ) )
Packit 8c9aa0
      , ownFile_( true )
Packit 8c9aa0
   {
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
   virtual ~OFileStream()
Packit 8c9aa0
   {
Packit 8c9aa0
      if ( ownFile_  &&  buffer_.file() )
Packit 8c9aa0
         fclose( buffer_.file() );
Packit 8c9aa0
   }
Packit 8c9aa0
Packit 8c9aa0
private:
Packit 8c9aa0
   FileStreamBuffer buffer_;
Packit 8c9aa0
   bool ownFile_;
Packit 8c9aa0
};
Packit 8c9aa0
Packit 8c9aa0
inline OStream &stdCOut() 
Packit 8c9aa0
{
Packit 8c9aa0
   static OFileStream stream( stdout );
Packit 8c9aa0
   return stream;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
inline OStream &stdCErr() 
Packit 8c9aa0
{
Packit 8c9aa0
   static OFileStream stream( stderr );
Packit 8c9aa0
   return stream;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_END
Packit 8c9aa0
Packit 8c9aa0
#elif CPPUNIT_HAVE_SSTREAM // #if defined( CPPUNIT_NO_STREAM )
Packit 8c9aa0
# include <sstream>
Packit 8c9aa0
# include <fstream>
Packit 8c9aa0
Packit 8c9aa0
    CPPUNIT_NS_BEGIN
Packit 8c9aa0
    typedef std::ostringstream OStringStream;      // The standard C++ way
Packit 8c9aa0
    typedef std::ofstream OFileStream;
Packit 8c9aa0
    CPPUNIT_NS_END
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
#elif CPPUNIT_HAVE_CLASS_STRSTREAM
Packit 8c9aa0
# include <string>
Packit 8c9aa0
# if CPPUNIT_HAVE_STRSTREAM
Packit 8c9aa0
#   include <strstream>
Packit 8c9aa0
# else // CPPUNIT_HAVE_STRSTREAM
Packit 8c9aa0
#  include <strstream.h>
Packit 8c9aa0
# endif // CPPUNIT_HAVE_CLASS_STRSTREAM
Packit 8c9aa0
Packit 8c9aa0
    CPPUNIT_NS_BEGIN
Packit 8c9aa0
Packit 8c9aa0
    class OStringStream : public std::ostrstream 
Packit 8c9aa0
    {
Packit 8c9aa0
    public:
Packit 8c9aa0
        std::string str()
Packit 8c9aa0
        {
Packit 8c9aa0
//            (*this) << '\0';
Packit 8c9aa0
//            std::string msg(std::ostrstream::str());
Packit 8c9aa0
//            std::ostrstream::freeze(false);
Packit 8c9aa0
//            return msg;
Packit 8c9aa0
// Alternative implementation that don't rely on freeze which is not
Packit 8c9aa0
// available on some platforms:
Packit 8c9aa0
            return std::string( std::ostrstream::str(), pcount() );
Packit 8c9aa0
        }
Packit 8c9aa0
    };
Packit 8c9aa0
Packit 8c9aa0
    CPPUNIT_NS_END
Packit 8c9aa0
#else // CPPUNIT_HAVE_CLASS_STRSTREAM
Packit 8c9aa0
#   error Cannot define CppUnit::OStringStream.
Packit 8c9aa0
#endif // #if defined( CPPUNIT_NO_STREAM )
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
#if !defined( CPPUNIT_NO_STREAM )
Packit 8c9aa0
Packit 8c9aa0
#include <iostream>
Packit 8c9aa0
Packit 8c9aa0
    CPPUNIT_NS_BEGIN
Packit 8c9aa0
Packit 8c9aa0
    typedef std::ostream OStream;
Packit 8c9aa0
Packit 8c9aa0
    inline OStream &stdCOut() 
Packit 8c9aa0
    {
Packit 8c9aa0
        return std::cout;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    inline OStream &stdCErr() 
Packit 8c9aa0
    {
Packit 8c9aa0
       return std::cerr;
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    CPPUNIT_NS_END
Packit 8c9aa0
   
Packit 8c9aa0
#endif // #if !defined( CPPUNIT_NO_STREAM )
Packit 8c9aa0
Packit 8c9aa0
#endif // CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
Packit 8c9aa0