1 // (C) Copyright Gennadiy Rozental 2002-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 : wraps strstream and stringstream (depends with one is present)
13 // to provide the unified interface
14 // ***************************************************************************
15
16 #ifndef BOOST_WRAP_STRINGSTREAM_HPP_071894GER
17 #define BOOST_WRAP_STRINGSTREAM_HPP_071894GER
18
19 // Boost.Test
20 #include <boost/test/detail/config.hpp>
21
22 // STL
23 #ifdef BOOST_NO_STRINGSTREAM
24 #include <strstream> // for std::ostrstream
25 #else
26 #include <sstream> // for std::ostringstream
27 #endif // BOOST_NO_STRINGSTREAM
28
29 #include <boost/test/detail/suppress_warnings.hpp>
30
31 //____________________________________________________________________________//
32
33 namespace boost {
34
35 // ************************************************************************** //
36 // ************** basic_wrap_stringstream ************** //
37 // ************************************************************************** //
38
39 template<typename CharT>
40 class basic_wrap_stringstream {
41 public:
42 #if defined(BOOST_CLASSIC_IOSTREAMS)
43 typedef std::ostringstream wrapped_stream;
44 #elif defined(BOOST_NO_STRINGSTREAM)
45 typedef std::basic_ostrstream<CharT> wrapped_stream;
46 #else
47 typedef std::basic_ostringstream<CharT> wrapped_stream;
48 #endif // BOOST_NO_STRINGSTREAM
49 // Access methods
50 basic_wrap_stringstream& ref();
51 wrapped_stream& stream();
52 std::basic_string<CharT> const& str();
53
54 private:
55 // Data members
56 wrapped_stream m_stream;
57 std::basic_string<CharT> m_str;
58 };
59
60 //____________________________________________________________________________//
61
62 template <typename CharT, typename T>
63 inline basic_wrap_stringstream<CharT>&
operator <<(basic_wrap_stringstream<CharT> & targ,T const & t)64 operator<<( basic_wrap_stringstream<CharT>& targ, T const& t )
65 {
66 targ.stream() << t;
67 return targ;
68 }
69
70 //____________________________________________________________________________//
71
72 template <typename CharT>
73 inline typename basic_wrap_stringstream<CharT>::wrapped_stream&
stream()74 basic_wrap_stringstream<CharT>::stream()
75 {
76 return m_stream;
77 }
78
79 //____________________________________________________________________________//
80
81 template <typename CharT>
82 inline basic_wrap_stringstream<CharT>&
ref()83 basic_wrap_stringstream<CharT>::ref()
84 {
85 return *this;
86 }
87
88 //____________________________________________________________________________//
89
90 template <typename CharT>
91 inline std::basic_string<CharT> const&
str()92 basic_wrap_stringstream<CharT>::str()
93 {
94
95 #ifdef BOOST_NO_STRINGSTREAM
96 m_str.assign( m_stream.str(), m_stream.pcount() );
97 m_stream.freeze( false );
98 #else
99 m_str = m_stream.str();
100 #endif
101
102 return m_str;
103 }
104
105 //____________________________________________________________________________//
106
107 template <typename CharT>
108 inline basic_wrap_stringstream<CharT>&
operator <<(basic_wrap_stringstream<CharT> & targ,basic_wrap_stringstream<CharT> & src)109 operator<<( basic_wrap_stringstream<CharT>& targ, basic_wrap_stringstream<CharT>& src )
110 {
111 targ << src.str();
112 return targ;
113 }
114
115 //____________________________________________________________________________//
116
117 #if BOOST_TEST_USE_STD_LOCALE
118
119 template <typename CharT>
120 inline basic_wrap_stringstream<CharT>&
operator <<(basic_wrap_stringstream<CharT> & targ,std::ios_base & (BOOST_TEST_CALL_DECL * man)(std::ios_base &))121 operator<<( basic_wrap_stringstream<CharT>& targ, std::ios_base& (BOOST_TEST_CALL_DECL *man)(std::ios_base&) )
122 {
123 targ.stream() << man;
124 return targ;
125 }
126
127 //____________________________________________________________________________//
128
129 template<typename CharT,typename Elem,typename Tr>
130 inline basic_wrap_stringstream<CharT>&
operator <<(basic_wrap_stringstream<CharT> & targ,std::basic_ostream<Elem,Tr> & (BOOST_TEST_CALL_DECL * man)(std::basic_ostream<Elem,Tr> &))131 operator<<( basic_wrap_stringstream<CharT>& targ, std::basic_ostream<Elem,Tr>& (BOOST_TEST_CALL_DECL *man)(std::basic_ostream<Elem, Tr>&) )
132 {
133 targ.stream() << man;
134 return targ;
135 }
136
137 //____________________________________________________________________________//
138
139 template<typename CharT,typename Elem,typename Tr>
140 inline basic_wrap_stringstream<CharT>&
operator <<(basic_wrap_stringstream<CharT> & targ,std::basic_ios<Elem,Tr> & (BOOST_TEST_CALL_DECL * man)(std::basic_ios<Elem,Tr> &))141 operator<<( basic_wrap_stringstream<CharT>& targ, std::basic_ios<Elem, Tr>& (BOOST_TEST_CALL_DECL *man)(std::basic_ios<Elem, Tr>&) )
142 {
143 targ.stream() << man;
144 return targ;
145 }
146
147 //____________________________________________________________________________//
148
149 #endif
150
151 // ************************************************************************** //
152 // ************** wrap_stringstream ************** //
153 // ************************************************************************** //
154
155 typedef basic_wrap_stringstream<char> wrap_stringstream;
156 typedef basic_wrap_stringstream<wchar_t> wrap_wstringstream;
157
158 } // namespace boost
159
160 //____________________________________________________________________________//
161
162 #include <boost/test/detail/enable_warnings.hpp>
163
164 #endif // BOOST_WRAP_STRINGSTREAM_HPP_071894GER
165