catch2/include/internal/catch_stream.cpp

109 lines
2.6 KiB
C++
Raw Normal View History

/*
* Created by Phil on 17/01/2011.
* Copyright 2011 Two Blue Cubes Ltd. All rights reserved.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*
*/
#include "catch_common.h"
#include "catch_enforce.h"
#include "catch_stream.h"
#include "catch_debug_console.h"
#include <stdexcept>
#include <cstdio>
#include <iostream>
2012-05-15 09:02:36 +02:00
namespace Catch {
template<typename WriterF, std::size_t bufferSize=256>
2012-05-15 09:02:36 +02:00
class StreamBufImpl : public StreamBufBase {
char data[bufferSize];
WriterF m_writer;
public:
2012-05-15 09:02:36 +02:00
StreamBufImpl() {
setp( data, data + sizeof(data) );
}
~StreamBufImpl() noexcept {
StreamBufImpl::sync();
}
private:
int overflow( int c ) override {
sync();
2012-05-15 09:02:36 +02:00
if( c != EOF ) {
if( pbase() == epptr() )
2011-01-31 11:10:20 +01:00
m_writer( std::string( 1, static_cast<char>( c ) ) );
else
sputc( static_cast<char>( c ) );
}
return 0;
}
int sync() override {
2012-05-15 09:02:36 +02:00
if( pbase() != pptr() ) {
m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );
setp( pbase(), epptr() );
}
return 0;
}
};
///////////////////////////////////////////////////////////////////////////
Catch::IStream::~IStream() = default;
FileStream::FileStream( std::string const& filename ) {
m_ofs.open( filename.c_str() );
CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" );
}
std::ostream& FileStream::stream() const {
return m_ofs;
}
2012-05-15 09:02:36 +02:00
struct OutputDebugWriter {
void operator()( std::string const&str ) {
writeToDebugConsole( str );
}
};
2012-09-26 19:36:58 +02:00
DebugOutStream::DebugOutStream()
: m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),
m_os( m_streamBuf.get() )
{}
2012-09-26 19:36:58 +02:00
std::ostream& DebugOutStream::stream() const {
return m_os;
}
// Store the streambuf from cout up-front because
// cout may get redirected when running tests
CoutStream::CoutStream()
: m_os( Catch::cout().rdbuf() )
{}
2012-09-26 19:36:58 +02:00
std::ostream& CoutStream::stream() const {
return m_os;
}
2015-10-22 21:49:32 +02:00
#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions
std::ostream& cout() {
return std::cout;
}
std::ostream& cerr() {
return std::cerr;
}
std::ostream& clog() {
return std::clog;
}
#endif
}