// (C) Copyright Gennadiy Rozental 2008. | |
// 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) | |
// See http://www.boost.org/libs/test for the library home page. | |
// | |
// File : $RCSfile$ | |
// | |
// Version : $Revision: 49312 $ | |
// | |
// Description : contains definition for all test tools in test toolbox | |
// *************************************************************************** | |
#ifndef BOOST_TEST_LAZY_OSTREAM_HPP_070708GER | |
#define BOOST_TEST_LAZY_OSTREAM_HPP_070708GER | |
// Boost.Test | |
#include <boost/test/detail/config.hpp> | |
// STL | |
#include <iosfwd> | |
#include <boost/test/detail/suppress_warnings.hpp> | |
//____________________________________________________________________________// | |
// ************************************************************************** // | |
// ************** lazy_ostream ************** // | |
// ************************************************************************** // | |
namespace boost { | |
namespace unit_test { | |
class lazy_ostream { | |
public: | |
static lazy_ostream& instance() { static lazy_ostream inst; return inst; } | |
friend std::ostream& operator<<( std::ostream& ostr, lazy_ostream const& o ) { return o( ostr ); } | |
// access method | |
bool empty() const { return m_empty; } | |
// actual printing interface; to be accessed only by this class and children | |
virtual std::ostream& operator()( std::ostream& ostr ) const { return ostr; } | |
protected: | |
explicit lazy_ostream( bool empty = true ) : m_empty( empty ) {} | |
// protected destructor to make sure right one is called | |
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) | |
public: | |
#endif | |
BOOST_TEST_PROTECTED_VIRTUAL ~lazy_ostream() {} | |
private: | |
// Data members | |
bool m_empty; | |
}; | |
//____________________________________________________________________________// | |
template<typename T> | |
class lazy_ostream_impl : public lazy_ostream { | |
public: | |
lazy_ostream_impl( lazy_ostream const& prev, T value ) | |
: lazy_ostream( false ) | |
, m_prev( prev ) | |
, m_value( value ) | |
{} | |
private: | |
virtual std::ostream& operator()( std::ostream& ostr ) const | |
{ | |
return m_prev(ostr) << m_value; | |
} | |
// Data members | |
lazy_ostream const& m_prev; | |
T m_value; | |
}; | |
//____________________________________________________________________________// | |
template<typename T> | |
inline lazy_ostream_impl<T const&> | |
operator<<( lazy_ostream const& prev, T const& v ) | |
{ | |
return lazy_ostream_impl<T const&>( prev, v ); | |
} | |
//____________________________________________________________________________// | |
#if BOOST_TEST_USE_STD_LOCALE | |
template<typename R,typename S> | |
inline lazy_ostream_impl<R& (BOOST_TEST_CALL_DECL *)(S&)> | |
operator<<( lazy_ostream const& prev, R& (BOOST_TEST_CALL_DECL *man)(S&) ) | |
{ | |
return lazy_ostream_impl<R& (BOOST_TEST_CALL_DECL *)(S&)>( prev, man ); | |
} | |
//____________________________________________________________________________// | |
#endif | |
} // namespace unit_test | |
} // namespace boost | |
//____________________________________________________________________________// | |
#include <boost/test/detail/enable_warnings.hpp> | |
#endif // BOOST_TEST_LAZY_OSTREAM_HPP_070708GER |