Home | History | Annotate | Download | only in utils
      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>&
     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&
     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>&
     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&
     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>&
    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>&
    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 //____________________________________________________________________________//
    161 
    162 #include <boost/test/detail/enable_warnings.hpp>
    163 
    164 #endif  // BOOST_WRAP_STRINGSTREAM_HPP_071894GER
    165