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