// Author: Adam Sawicki, www.asawicki.info, adam__REMOVE__@asawicki.info // License: Public Domain #pragma once #include #include #include class CPrintStream { public: virtual ~CPrintStream() = 0 { } void printf( const char* format, ... ); virtual void vprintf( const char* format, va_list argList ) = 0; }; class CConsolePrintStream : public CPrintStream { public: virtual void vprintf( const char* format, va_list argList ); }; class CFilePrintStream : public CPrintStream { public: CFilePrintStream(); // Automatically closes file. ~CFilePrintStream(); // mode: Like in fopen, e.g. "wb", "a". void Open( const char* filePath, const char* mode ); void Close(); bool Opened() const { return m_File != nullptr; } virtual void vprintf( const char* format, va_list argList ); private: FILE* m_File; }; class CMemoryPrintStream : public CPrintStream { public: typedef std::vector Buf_t; // Use own memory. CMemoryPrintStream() : m_BufPtr( &m_MyBuf ) { } // Use given buffer. CMemoryPrintStream( Buf_t* buf ) : m_BufPtr( buf ) { } const Buf_t* Buf() const { return m_BufPtr; } Buf_t* Buf() { return m_BufPtr; } void GetAsString( std::string& out ); virtual void vprintf( const char* format, va_list argList ); private: Buf_t m_MyBuf; // Not null-terminated. Buf_t* m_BufPtr; };