#ifndef EXCEPTIONSTREAM_H #define EXCEPTIONSTREAM_H #include #ifdef WIN32 #undef ExceptionStream_NO_SSTREAM #define ExceptionStream_NO_SSTREAM #endif #ifdef ExceptionStream_NO_SSTREAM #include #else #include #endif struct exception_stream : public std::exception /* This class provides an easy-to-use exception type for verbose error messages. Use like: ifstream in( filename); if ( !in) throw exception_stream() << "Couldn't open file '" << filename << "'"; */ { exception_stream(); virtual const char* what() const throw(); // Part of the std::exception interface. virtual ~exception_stream() throw(); template< class T> friend const exception_stream& operator << ( const exception_stream& es, const T& t); template< class T> friend const exception_stream& operator << ( const exception_stream& es, T& t); #ifdef WIN32 template< class T> friend const exception_stream& operator << ( const exception_stream& es, const char* t); template< class T> friend const exception_stream& operator << ( const exception_stream& es, char* t); #endif exception_stream( const exception_stream& rhs); exception_stream& operator = ( const exception_stream& rhs); #ifdef ExceptionStream_NO_SSTREAM // Actually appends rhs.GetString() to *this. Should really clear *this first. private: std::string filename; mutable std::ofstream stream; mutable std::string buffer; #else mutable std::stringstream stream; mutable std::string buffer_for_what; #endif }; template< class T> const exception_stream& operator << ( const exception_stream& es, const T& t) { es.stream << t; return es; } template< class T> const exception_stream& operator << ( const exception_stream& es, T& t) { es.stream << t; return es; } #ifdef WIN32 inline const exception_stream& operator << ( const exception_stream& es, const char* text) { es.stream << text; return es; } inline const exception_stream& operator << ( const exception_stream& es, char* text) { es.stream << text; return es; } #endif #endif