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