1 // (C) Copyright Gennadiy Rozental 2008.
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5
6 // See http://www.boost.org/libs/test for the library home page.
7 //
8 // File : $RCSfile$
9 //
10 // Version : $Revision: 49312 $
11 //
12 // Description : contains definition for all test tools in test toolbox
13 // ***************************************************************************
14
15 #ifndef BOOST_TEST_LAZY_OSTREAM_HPP_070708GER
16 #define BOOST_TEST_LAZY_OSTREAM_HPP_070708GER
17
18 // Boost.Test
19 #include <boost/test/detail/config.hpp>
20
21 // STL
22 #include <iosfwd>
23
24 #include <boost/test/detail/suppress_warnings.hpp>
25
26 //____________________________________________________________________________//
27
28 // ************************************************************************** //
29 // ************** lazy_ostream ************** //
30 // ************************************************************************** //
31
32 namespace boost {
33
34 namespace unit_test {
35
36 class lazy_ostream {
37 public:
instance()38 static lazy_ostream& instance() { static lazy_ostream inst; return inst; }
39
operator <<(std::ostream & ostr,lazy_ostream const & o)40 friend std::ostream& operator<<( std::ostream& ostr, lazy_ostream const& o ) { return o( ostr ); }
41
42 // access method
empty() const43 bool empty() const { return m_empty; }
44
45 // actual printing interface; to be accessed only by this class and children
operator ()(std::ostream & ostr) const46 virtual std::ostream& operator()( std::ostream& ostr ) const { return ostr; }
47 protected:
lazy_ostream(bool empty=true)48 explicit lazy_ostream( bool empty = true ) : m_empty( empty ) {}
49
50 // protected destructor to make sure right one is called
51 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
52 public:
53 #endif
~lazy_ostream()54 BOOST_TEST_PROTECTED_VIRTUAL ~lazy_ostream() {}
55
56 private:
57 // Data members
58 bool m_empty;
59 };
60
61 //____________________________________________________________________________//
62
63 template<typename T>
64 class lazy_ostream_impl : public lazy_ostream {
65 public:
lazy_ostream_impl(lazy_ostream const & prev,T value)66 lazy_ostream_impl( lazy_ostream const& prev, T value )
67 : lazy_ostream( false )
68 , m_prev( prev )
69 , m_value( value )
70 {}
71 private:
operator ()(std::ostream & ostr) const72 virtual std::ostream& operator()( std::ostream& ostr ) const
73 {
74 return m_prev(ostr) << m_value;
75 }
76
77 // Data members
78 lazy_ostream const& m_prev;
79 T m_value;
80 };
81
82 //____________________________________________________________________________//
83
84 template<typename T>
85 inline lazy_ostream_impl<T const&>
operator <<(lazy_ostream const & prev,T const & v)86 operator<<( lazy_ostream const& prev, T const& v )
87 {
88 return lazy_ostream_impl<T const&>( prev, v );
89 }
90
91 //____________________________________________________________________________//
92
93 #if BOOST_TEST_USE_STD_LOCALE
94
95 template<typename R,typename S>
96 inline lazy_ostream_impl<R& (BOOST_TEST_CALL_DECL *)(S&)>
operator <<(lazy_ostream const & prev,R & (BOOST_TEST_CALL_DECL * man)(S &))97 operator<<( lazy_ostream const& prev, R& (BOOST_TEST_CALL_DECL *man)(S&) )
98 {
99 return lazy_ostream_impl<R& (BOOST_TEST_CALL_DECL *)(S&)>( prev, man );
100 }
101
102 //____________________________________________________________________________//
103
104 #endif
105
106 } // namespace unit_test
107
108 } // namespace boost
109
110 //____________________________________________________________________________//
111
112 #include <boost/test/detail/enable_warnings.hpp>
113
114 #endif // BOOST_TEST_LAZY_OSTREAM_HPP_070708GER
115