Line data Source code
1 : // (C) Copyright Gennadiy Rozental 2001. 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$ 11 : // 12 : // Description : wraps strstream and stringstream (depends with one is present) 13 : // to provide the unified interface 14 : // *************************************************************************** 15 : 16 : #ifndef BOOST_TEST_UTILS_WRAP_STRINGSTREAM_HPP 17 : #define BOOST_TEST_UTILS_WRAP_STRINGSTREAM_HPP 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>& 64 10959 : operator<<( basic_wrap_stringstream<CharT>& targ, T const& t ) 65 : { 66 10959 : targ.stream() << t; 67 10959 : return targ; 68 : } 69 : 70 : //____________________________________________________________________________// 71 : 72 : template <typename CharT> 73 : inline typename basic_wrap_stringstream<CharT>::wrapped_stream& 74 10959 : basic_wrap_stringstream<CharT>::stream() 75 : { 76 10959 : return m_stream; 77 : } 78 : 79 : //____________________________________________________________________________// 80 : 81 : template <typename CharT> 82 : inline basic_wrap_stringstream<CharT>& 83 3653 : basic_wrap_stringstream<CharT>::ref() 84 : { 85 3653 : return *this; 86 : } 87 : 88 : //____________________________________________________________________________// 89 : 90 : template <typename CharT> 91 : inline std::basic_string<CharT> const& 92 3653 : 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 3653 : m_str = m_stream.str(); 100 : #endif 101 : 102 3653 : return m_str; 103 : } 104 : 105 : //____________________________________________________________________________// 106 : 107 : template <typename CharT> 108 : inline basic_wrap_stringstream<CharT>& 109 0 : operator<<( basic_wrap_stringstream<CharT>& targ, basic_wrap_stringstream<CharT>& src ) 110 : { 111 0 : targ << src.str(); 112 0 : return targ; 113 : } 114 : 115 : //____________________________________________________________________________// 116 : 117 : #if BOOST_TEST_USE_STD_LOCALE 118 : 119 : template <typename CharT> 120 : inline basic_wrap_stringstream<CharT>& 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>& 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>& 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 : #include <boost/test/detail/enable_warnings.hpp> 161 : 162 : #endif // BOOST_TEST_UTILS_WRAP_STRINGSTREAM_HPP