Moved a lot of stream related stuff out of the public headers and replaced more ostream dependencies with iosfwd

This commit is contained in:
Phil Nash 2017-11-07 15:55:09 +00:00
parent c9cdb9a48f
commit 868e125d49
9 changed files with 118 additions and 154 deletions

View File

@ -159,7 +159,6 @@ set(INTERNAL_HEADERS
${HEADER_DIR}/internal/catch_session.h
${HEADER_DIR}/internal/catch_startup_exception_registry.h
${HEADER_DIR}/internal/catch_stream.h
${HEADER_DIR}/internal/catch_streambuf.h
${HEADER_DIR}/internal/catch_stringref.h
${HEADER_DIR}/internal/catch_string_manip.h
${HEADER_DIR}/internal/catch_suppress_warnings.h
@ -220,7 +219,6 @@ set(IMPL_SOURCES
${HEADER_DIR}/internal/catch_session.cpp
${HEADER_DIR}/internal/catch_startup_exception_registry.cpp
${HEADER_DIR}/internal/catch_stream.cpp
${HEADER_DIR}/internal/catch_streambuf.cpp
${HEADER_DIR}/internal/catch_stringref.cpp
${HEADER_DIR}/internal/catch_string_manip.cpp
${HEADER_DIR}/internal/catch_tag_alias.cpp

View File

@ -7,7 +7,7 @@
#include "catch_config.hpp"
#include "catch_enforce.h"
#include "catch_stream.h"
#include "catch_stringref.h"
namespace Catch {
@ -58,16 +58,7 @@ namespace Catch {
Verbosity Config::verbosity() const { return m_data.verbosity; }
IStream const* Config::openStream() {
if( m_data.outputFilename.empty() )
return new CoutStream();
else if( m_data.outputFilename[0] == '%' ) {
if( m_data.outputFilename == "%debug" )
return new DebugOutStream();
else
CATCH_ERROR( "Unrecognised stream: '" << m_data.outputFilename << "'" );
}
else
return new FileStream( m_data.outputFilename );
return Catch::makeStream(m_data.outputFilename);
}
} // end namespace Catch

View File

@ -19,6 +19,8 @@
# include <sys/types.h>
# include <unistd.h>
# include <sys/sysctl.h>
# include <cstddef>
# include <ostream>
namespace Catch {

View File

@ -11,7 +11,7 @@
#include "catch_tostring.h"
#include "catch_stringref.h"
#include <ostream>
#include <iosfwd>
#ifdef _MSC_VER
#pragma warning(push)

View File

@ -11,15 +11,20 @@
#include "catch_enforce.h"
#include "catch_stream.h"
#include "catch_debug_console.h"
#include "catch_stringref.h"
#include <stdexcept>
#include <cstdio>
#include <iostream>
#include <fstream>
namespace Catch {
Catch::IStream::~IStream() = default;
namespace detail { namespace {
template<typename WriterF, std::size_t bufferSize=256>
class StreamBufImpl : public StreamBufBase {
class StreamBufImpl : public std::streambuf {
char data[bufferSize];
WriterF m_writer;
@ -56,18 +61,6 @@ namespace Catch {
///////////////////////////////////////////////////////////////////////////
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;
}
struct OutputDebugWriter {
void operator()( std::string const&str ) {
@ -75,24 +68,72 @@ namespace Catch {
}
};
DebugOutStream::DebugOutStream()
///////////////////////////////////////////////////////////////////////////
class FileStream : public IStream {
mutable std::ofstream m_ofs;
public:
FileStream( StringRef filename ) {
m_ofs.open( filename.c_str() );
CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" );
}
~FileStream() override = default;
public: // IStream
std::ostream& stream() const override {
return m_ofs;
}
};
///////////////////////////////////////////////////////////////////////////
class CoutStream : public IStream {
mutable std::ostream m_os;
public:
// Store the streambuf from cout up-front because
// cout may get redirected when running tests
CoutStream() : m_os( Catch::cout().rdbuf() ) {}
~CoutStream() override = default;
public: // IStream
std::ostream& stream() const override { return m_os; }
};
///////////////////////////////////////////////////////////////////////////
class DebugOutStream : public IStream {
std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf;
mutable std::ostream m_os;
public:
DebugOutStream()
: m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),
m_os( m_streamBuf.get() )
{}
std::ostream& DebugOutStream::stream() const {
return m_os;
~DebugOutStream() override = default;
public: // IStream
std::ostream& stream() const override { return m_os; }
};
}} // namespace anon::detail
///////////////////////////////////////////////////////////////////////////
auto makeStream( StringRef const &filename ) -> IStream const* {
if( filename.empty() )
return new detail::CoutStream();
else if( filename[0] == '%' ) {
if( filename == "%debug" )
return new detail::DebugOutStream();
else
CATCH_ERROR( "Unrecognised stream: '" << filename << "'" );
}
else
return new detail::FileStream( filename );
}
// Store the streambuf from cout up-front because
// cout may get redirected when running tests
CoutStream::CoutStream()
: m_os( Catch::cout().rdbuf() )
{}
///////////////////////////////////////////////////////////////////////////
std::ostream& CoutStream::stream() const {
return m_os;
}
#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions
std::ostream& cout() {

View File

@ -9,12 +9,7 @@
#ifndef TWOBLUECUBES_CATCH_STREAM_H_INCLUDED
#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED
#include "catch_streambuf.h"
#include <streambuf>
#include <ostream>
#include <fstream>
#include <memory>
#include <iosfwd>
namespace Catch {
@ -22,43 +17,14 @@ namespace Catch {
std::ostream& cerr();
std::ostream& clog();
class StringRef;
struct IStream {
virtual ~IStream();
virtual std::ostream& stream() const = 0;
};
class FileStream : public IStream {
mutable std::ofstream m_ofs;
public:
FileStream( std::string const& filename );
~FileStream() override = default;
public: // IStream
std::ostream& stream() const override;
};
class CoutStream : public IStream {
mutable std::ostream m_os;
public:
CoutStream();
~CoutStream() override = default;
public: // IStream
std::ostream& stream() const override;
};
class DebugOutStream : public IStream {
std::unique_ptr<StreamBufBase> m_streamBuf;
mutable std::ostream m_os;
public:
DebugOutStream();
~DebugOutStream() override = default;
public: // IStream
std::ostream& stream() const override;
};
auto makeStream( StringRef const &filename ) -> IStream const*;
}
#endif // TWOBLUECUBES_CATCH_STREAM_H_INCLUDED

View File

@ -1,12 +0,0 @@
/*
* Created by Martin on 31/08/2017.
*
* 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_streambuf.h"
namespace Catch {
StreamBufBase::~StreamBufBase() = default;
}

View File

@ -1,21 +0,0 @@
/*
* Created by Phil on 27/11/2012.
* Copyright 2012 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)
*/
#ifndef TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
#include <streambuf>
namespace Catch {
class StreamBufBase : public std::streambuf {
public:
virtual ~StreamBufBase();
};
}
#endif // TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED

View File

@ -39,7 +39,6 @@
#include "../../../include/internal/catch_session.cpp"
#include "../../../include/internal/catch_startup_exception_registry.cpp"
#include "../../../include/internal/catch_stream.cpp"
#include "../../../include/internal/catch_streambuf.cpp"
#include "../../../include/internal/catch_string_manip.cpp"
#include "../../../include/internal/catch_stringref.cpp"
#include "../../../include/internal/catch_tag_alias.cpp"