Home | History | Annotate | Download | only in include
      1 // String based streams -*- C++ -*-
      2 
      3 // Copyright (C) 1997-2014 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the
      7 // terms of the GNU General Public License as published by the
      8 // Free Software Foundation; either version 3, or (at your option)
      9 // any later version.
     10 
     11 // This library is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 
     16 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file include/sstream
     26  *  This is a Standard C++ Library header.
     27  */
     28 
     29 //
     30 // ISO C++ 14882: 27.7  String-based streams
     31 //
     32 
     33 #ifndef _GLIBCXX_SSTREAM
     34 #define _GLIBCXX_SSTREAM 1
     35 
     36 #pragma GCC system_header
     37 
     38 #include <istream>
     39 #include <ostream>
     40 
     41 namespace std _GLIBCXX_VISIBILITY(default)
     42 {
     43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
     44 
     45   // [27.7.1] template class basic_stringbuf
     46   /**
     47    *  @brief  The actual work of input and output (for std::string).
     48    *  @ingroup io
     49    *
     50    *  @tparam _CharT  Type of character stream.
     51    *  @tparam _Traits  Traits for character type, defaults to
     52    *                   char_traits<_CharT>.
     53    *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
     54    *
     55    *  This class associates either or both of its input and output sequences
     56    *  with a sequence of characters, which can be initialized from, or made
     57    *  available as, a @c std::basic_string.  (Paraphrased from [27.7.1]/1.)
     58    *
     59    *  For this class, open modes (of type @c ios_base::openmode) have
     60    *  @c in set if the input sequence can be read, and @c out set if the
     61    *  output sequence can be written.
     62   */
     63   template<typename _CharT, typename _Traits, typename _Alloc>
     64     class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
     65     {
     66     public:
     67       // Types:
     68       typedef _CharT 					char_type;
     69       typedef _Traits 					traits_type;
     70       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     71       // 251. basic_stringbuf missing allocator_type
     72       typedef _Alloc				       	allocator_type;
     73       typedef typename traits_type::int_type 		int_type;
     74       typedef typename traits_type::pos_type 		pos_type;
     75       typedef typename traits_type::off_type 		off_type;
     76 
     77       typedef basic_streambuf<char_type, traits_type>  	__streambuf_type;
     78       typedef basic_string<char_type, _Traits, _Alloc> 	__string_type;
     79       typedef typename __string_type::size_type		__size_type;
     80 
     81     protected:
     82       /// Place to stash in || out || in | out settings for current stringbuf.
     83       ios_base::openmode 	_M_mode;
     84 
     85       // Data Members:
     86       __string_type 		_M_string;
     87 
     88     public:
     89       // Constructors:
     90       /**
     91        *  @brief  Starts with an empty string buffer.
     92        *  @param  __mode  Whether the buffer can read, or write, or both.
     93        *
     94        *  The default constructor initializes the parent class using its
     95        *  own default ctor.
     96       */
     97       explicit
     98       basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
     99       : __streambuf_type(), _M_mode(__mode), _M_string()
    100       { }
    101 
    102       /**
    103        *  @brief  Starts with an existing string buffer.
    104        *  @param  __str  A string to copy as a starting buffer.
    105        *  @param  __mode  Whether the buffer can read, or write, or both.
    106        *
    107        *  This constructor initializes the parent class using its
    108        *  own default ctor.
    109       */
    110       explicit
    111       basic_stringbuf(const __string_type& __str,
    112 		      ios_base::openmode __mode = ios_base::in | ios_base::out)
    113       : __streambuf_type(), _M_mode(), _M_string(__str.data(), __str.size())
    114       { _M_stringbuf_init(__mode); }
    115 
    116       // Get and set:
    117       /**
    118        *  @brief  Copying out the string buffer.
    119        *  @return  A copy of one of the underlying sequences.
    120        *
    121        *  <em>If the buffer is only created in input mode, the underlying
    122        *  character sequence is equal to the input sequence; otherwise, it
    123        *  is equal to the output sequence.</em> [27.7.1.2]/1
    124       */
    125       __string_type
    126       str() const
    127       {
    128 	__string_type __ret;
    129 	if (this->pptr())
    130 	  {
    131 	    // The current egptr() may not be the actual string end.
    132 	    if (this->pptr() > this->egptr())
    133 	      __ret = __string_type(this->pbase(), this->pptr());
    134 	    else
    135  	      __ret = __string_type(this->pbase(), this->egptr());
    136 	  }
    137 	else
    138 	  __ret = _M_string;
    139 	return __ret;
    140       }
    141 
    142       /**
    143        *  @brief  Setting a new buffer.
    144        *  @param  __s  The string to use as a new sequence.
    145        *
    146        *  Deallocates any previous stored sequence, then copies @a s to
    147        *  use as a new one.
    148       */
    149       void
    150       str(const __string_type& __s)
    151       {
    152 	// Cannot use _M_string = __s, since v3 strings are COW.
    153 	_M_string.assign(__s.data(), __s.size());
    154 	_M_stringbuf_init(_M_mode);
    155       }
    156 
    157     protected:
    158       // Common initialization code goes here.
    159       void
    160       _M_stringbuf_init(ios_base::openmode __mode)
    161       {
    162 	_M_mode = __mode;
    163 	__size_type __len = 0;
    164 	if (_M_mode & (ios_base::ate | ios_base::app))
    165 	  __len = _M_string.size();
    166 	_M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
    167       }
    168 
    169       virtual streamsize
    170       showmanyc()
    171       { 
    172 	streamsize __ret = -1;
    173 	if (_M_mode & ios_base::in)
    174 	  {
    175 	    _M_update_egptr();
    176 	    __ret = this->egptr() - this->gptr();
    177 	  }
    178 	return __ret;
    179       }
    180 
    181       virtual int_type
    182       underflow();
    183 
    184       virtual int_type
    185       pbackfail(int_type __c = traits_type::eof());
    186 
    187       virtual int_type
    188       overflow(int_type __c = traits_type::eof());
    189 
    190       /**
    191        *  @brief  Manipulates the buffer.
    192        *  @param  __s  Pointer to a buffer area.
    193        *  @param  __n  Size of @a __s.
    194        *  @return  @c this
    195        *
    196        *  If no buffer has already been created, and both @a __s and @a __n are
    197        *  non-zero, then @c __s is used as a buffer; see
    198        *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt11ch25s02.html
    199        *  for more.
    200       */
    201       virtual __streambuf_type*
    202       setbuf(char_type* __s, streamsize __n)
    203       {
    204 	if (__s && __n >= 0)
    205 	  {
    206 	    // This is implementation-defined behavior, and assumes
    207 	    // that an external char_type array of length __n exists
    208 	    // and has been pre-allocated. If this is not the case,
    209 	    // things will quickly blow up.
    210 	    
    211 	    // Step 1: Destroy the current internal array.
    212 	    _M_string.clear();
    213 	    
    214 	    // Step 2: Use the external array.
    215 	    _M_sync(__s, __n, 0);
    216 	  }
    217 	return this;
    218       }
    219 
    220       virtual pos_type
    221       seekoff(off_type __off, ios_base::seekdir __way,
    222 	      ios_base::openmode __mode = ios_base::in | ios_base::out);
    223 
    224       virtual pos_type
    225       seekpos(pos_type __sp,
    226 	      ios_base::openmode __mode = ios_base::in | ios_base::out);
    227 
    228       // Internal function for correctly updating the internal buffer
    229       // for a particular _M_string, due to initialization or re-sizing
    230       // of an existing _M_string.
    231       void
    232       _M_sync(char_type* __base, __size_type __i, __size_type __o);
    233 
    234       // Internal function for correctly updating egptr() to the actual
    235       // string end.
    236       void
    237       _M_update_egptr()
    238       {
    239 	const bool __testin = _M_mode & ios_base::in;
    240 	if (this->pptr() && this->pptr() > this->egptr())
    241 	  {
    242 	    if (__testin)
    243 	      this->setg(this->eback(), this->gptr(), this->pptr());
    244 	    else
    245 	      this->setg(this->pptr(), this->pptr(), this->pptr());
    246 	  }
    247       }
    248 
    249       // Works around the issue with pbump, part of the protected
    250       // interface of basic_streambuf, taking just an int.
    251       void
    252       _M_pbump(char_type* __pbeg, char_type* __pend, off_type __off);
    253     };
    254 
    255 
    256   // [27.7.2] Template class basic_istringstream
    257   /**
    258    *  @brief  Controlling input for std::string.
    259    *  @ingroup io
    260    *
    261    *  @tparam _CharT  Type of character stream.
    262    *  @tparam _Traits  Traits for character type, defaults to
    263    *                   char_traits<_CharT>.
    264    *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
    265    *
    266    *  This class supports reading from objects of type std::basic_string,
    267    *  using the inherited functions from std::basic_istream.  To control
    268    *  the associated sequence, an instance of std::basic_stringbuf is used,
    269    *  which this page refers to as @c sb.
    270   */
    271   template<typename _CharT, typename _Traits, typename _Alloc>
    272     class basic_istringstream : public basic_istream<_CharT, _Traits>
    273     {
    274     public:
    275       // Types:
    276       typedef _CharT 					char_type;
    277       typedef _Traits 					traits_type;
    278       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    279       // 251. basic_stringbuf missing allocator_type
    280       typedef _Alloc				       	allocator_type;
    281       typedef typename traits_type::int_type 		int_type;
    282       typedef typename traits_type::pos_type 		pos_type;
    283       typedef typename traits_type::off_type 		off_type;
    284 
    285       // Non-standard types:
    286       typedef basic_string<_CharT, _Traits, _Alloc> 	__string_type;
    287       typedef basic_stringbuf<_CharT, _Traits, _Alloc> 	__stringbuf_type;
    288       typedef basic_istream<char_type, traits_type>	__istream_type;
    289 
    290     private:
    291       __stringbuf_type	_M_stringbuf;
    292 
    293     public:
    294       // Constructors:
    295       /**
    296        *  @brief  Default constructor starts with an empty string buffer.
    297        *  @param  __mode  Whether the buffer can read, or write, or both.
    298        *
    299        *  @c ios_base::in is automatically included in @a __mode.
    300        *
    301        *  Initializes @c sb using @c __mode|in, and passes @c &sb to the base
    302        *  class initializer.  Does not allocate any buffer.
    303        *
    304        *  That's a lie.  We initialize the base class with NULL, because the
    305        *  string class does its own memory management.
    306       */
    307       explicit
    308       basic_istringstream(ios_base::openmode __mode = ios_base::in)
    309       : __istream_type(), _M_stringbuf(__mode | ios_base::in)
    310       { this->init(&_M_stringbuf); }
    311 
    312       /**
    313        *  @brief  Starts with an existing string buffer.
    314        *  @param  __str  A string to copy as a starting buffer.
    315        *  @param  __mode  Whether the buffer can read, or write, or both.
    316        *
    317        *  @c ios_base::in is automatically included in @a mode.
    318        *
    319        *  Initializes @c sb using @a str and @c mode|in, and passes @c &sb
    320        *  to the base class initializer.
    321        *
    322        *  That's a lie.  We initialize the base class with NULL, because the
    323        *  string class does its own memory management.
    324       */
    325       explicit
    326       basic_istringstream(const __string_type& __str,
    327 			  ios_base::openmode __mode = ios_base::in)
    328       : __istream_type(), _M_stringbuf(__str, __mode | ios_base::in)
    329       { this->init(&_M_stringbuf); }
    330 
    331       /**
    332        *  @brief  The destructor does nothing.
    333        *
    334        *  The buffer is deallocated by the stringbuf object, not the
    335        *  formatting stream.
    336       */
    337       ~basic_istringstream()
    338       { }
    339 
    340       // Members:
    341       /**
    342        *  @brief  Accessing the underlying buffer.
    343        *  @return  The current basic_stringbuf buffer.
    344        *
    345        *  This hides both signatures of std::basic_ios::rdbuf().
    346       */
    347       __stringbuf_type*
    348       rdbuf() const
    349       { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
    350 
    351       /**
    352        *  @brief  Copying out the string buffer.
    353        *  @return  @c rdbuf()->str()
    354       */
    355       __string_type
    356       str() const
    357       { return _M_stringbuf.str(); }
    358 
    359       /**
    360        *  @brief  Setting a new buffer.
    361        *  @param  __s  The string to use as a new sequence.
    362        *
    363        *  Calls @c rdbuf()->str(s).
    364       */
    365       void
    366       str(const __string_type& __s)
    367       { _M_stringbuf.str(__s); }
    368     };
    369 
    370 
    371   // [27.7.3] Template class basic_ostringstream
    372   /**
    373    *  @brief  Controlling output for std::string.
    374    *  @ingroup io
    375    *
    376    *  @tparam _CharT  Type of character stream.
    377    *  @tparam _Traits  Traits for character type, defaults to
    378    *                   char_traits<_CharT>.
    379    *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
    380    *
    381    *  This class supports writing to objects of type std::basic_string,
    382    *  using the inherited functions from std::basic_ostream.  To control
    383    *  the associated sequence, an instance of std::basic_stringbuf is used,
    384    *  which this page refers to as @c sb.
    385   */
    386   template <typename _CharT, typename _Traits, typename _Alloc>
    387     class basic_ostringstream : public basic_ostream<_CharT, _Traits>
    388     {
    389     public:
    390       // Types:
    391       typedef _CharT 					char_type;
    392       typedef _Traits 					traits_type;
    393       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    394       // 251. basic_stringbuf missing allocator_type
    395       typedef _Alloc				       	allocator_type;
    396       typedef typename traits_type::int_type 		int_type;
    397       typedef typename traits_type::pos_type 		pos_type;
    398       typedef typename traits_type::off_type 		off_type;
    399 
    400       // Non-standard types:
    401       typedef basic_string<_CharT, _Traits, _Alloc> 	__string_type;
    402       typedef basic_stringbuf<_CharT, _Traits, _Alloc> 	__stringbuf_type;
    403       typedef basic_ostream<char_type, traits_type>	__ostream_type;
    404 
    405     private:
    406       __stringbuf_type	_M_stringbuf;
    407 
    408     public:
    409       // Constructors/destructor:
    410       /**
    411        *  @brief  Default constructor starts with an empty string buffer.
    412        *  @param  __mode  Whether the buffer can read, or write, or both.
    413        *
    414        *  @c ios_base::out is automatically included in @a mode.
    415        *
    416        *  Initializes @c sb using @c mode|out, and passes @c &sb to the base
    417        *  class initializer.  Does not allocate any buffer.
    418        *
    419        *  That's a lie.  We initialize the base class with NULL, because the
    420        *  string class does its own memory management.
    421       */
    422       explicit
    423       basic_ostringstream(ios_base::openmode __mode = ios_base::out)
    424       : __ostream_type(), _M_stringbuf(__mode | ios_base::out)
    425       { this->init(&_M_stringbuf); }
    426 
    427       /**
    428        *  @brief  Starts with an existing string buffer.
    429        *  @param  __str  A string to copy as a starting buffer.
    430        *  @param  __mode  Whether the buffer can read, or write, or both.
    431        *
    432        *  @c ios_base::out is automatically included in @a mode.
    433        *
    434        *  Initializes @c sb using @a str and @c mode|out, and passes @c &sb
    435        *  to the base class initializer.
    436        *
    437        *  That's a lie.  We initialize the base class with NULL, because the
    438        *  string class does its own memory management.
    439       */
    440       explicit
    441       basic_ostringstream(const __string_type& __str,
    442 			  ios_base::openmode __mode = ios_base::out)
    443       : __ostream_type(), _M_stringbuf(__str, __mode | ios_base::out)
    444       { this->init(&_M_stringbuf); }
    445 
    446       /**
    447        *  @brief  The destructor does nothing.
    448        *
    449        *  The buffer is deallocated by the stringbuf object, not the
    450        *  formatting stream.
    451       */
    452       ~basic_ostringstream()
    453       { }
    454 
    455       // Members:
    456       /**
    457        *  @brief  Accessing the underlying buffer.
    458        *  @return  The current basic_stringbuf buffer.
    459        *
    460        *  This hides both signatures of std::basic_ios::rdbuf().
    461       */
    462       __stringbuf_type*
    463       rdbuf() const
    464       { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
    465 
    466       /**
    467        *  @brief  Copying out the string buffer.
    468        *  @return  @c rdbuf()->str()
    469       */
    470       __string_type
    471       str() const
    472       { return _M_stringbuf.str(); }
    473 
    474       /**
    475        *  @brief  Setting a new buffer.
    476        *  @param  __s  The string to use as a new sequence.
    477        *
    478        *  Calls @c rdbuf()->str(s).
    479       */
    480       void
    481       str(const __string_type& __s)
    482       { _M_stringbuf.str(__s); }
    483     };
    484 
    485 
    486   // [27.7.4] Template class basic_stringstream
    487   /**
    488    *  @brief  Controlling input and output for std::string.
    489    *  @ingroup io
    490    *
    491    *  @tparam _CharT  Type of character stream.
    492    *  @tparam _Traits  Traits for character type, defaults to
    493    *                   char_traits<_CharT>.
    494    *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
    495    *
    496    *  This class supports reading from and writing to objects of type
    497    *  std::basic_string, using the inherited functions from
    498    *  std::basic_iostream.  To control the associated sequence, an instance
    499    *  of std::basic_stringbuf is used, which this page refers to as @c sb.
    500   */
    501   template <typename _CharT, typename _Traits, typename _Alloc>
    502     class basic_stringstream : public basic_iostream<_CharT, _Traits>
    503     {
    504     public:
    505       // Types:
    506       typedef _CharT 					char_type;
    507       typedef _Traits 					traits_type;
    508       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    509       // 251. basic_stringbuf missing allocator_type
    510       typedef _Alloc				       	allocator_type;
    511       typedef typename traits_type::int_type 		int_type;
    512       typedef typename traits_type::pos_type 		pos_type;
    513       typedef typename traits_type::off_type 		off_type;
    514 
    515       // Non-standard Types:
    516       typedef basic_string<_CharT, _Traits, _Alloc> 	__string_type;
    517       typedef basic_stringbuf<_CharT, _Traits, _Alloc> 	__stringbuf_type;
    518       typedef basic_iostream<char_type, traits_type>	__iostream_type;
    519 
    520     private:
    521       __stringbuf_type	_M_stringbuf;
    522 
    523     public:
    524       // Constructors/destructors
    525       /**
    526        *  @brief  Default constructor starts with an empty string buffer.
    527        *  @param  __m  Whether the buffer can read, or write, or both.
    528        *
    529        *  Initializes @c sb using the mode from @c __m, and passes @c
    530        *  &sb to the base class initializer.  Does not allocate any
    531        *  buffer.
    532        *
    533        *  That's a lie.  We initialize the base class with NULL, because the
    534        *  string class does its own memory management.
    535       */
    536       explicit
    537       basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
    538       : __iostream_type(), _M_stringbuf(__m)
    539       { this->init(&_M_stringbuf); }
    540 
    541       /**
    542        *  @brief  Starts with an existing string buffer.
    543        *  @param  __str  A string to copy as a starting buffer.
    544        *  @param  __m  Whether the buffer can read, or write, or both.
    545        *
    546        *  Initializes @c sb using @a __str and @c __m, and passes @c &sb
    547        *  to the base class initializer.
    548        *
    549        *  That's a lie.  We initialize the base class with NULL, because the
    550        *  string class does its own memory management.
    551       */
    552       explicit
    553       basic_stringstream(const __string_type& __str,
    554 			 ios_base::openmode __m = ios_base::out | ios_base::in)
    555       : __iostream_type(), _M_stringbuf(__str, __m)
    556       { this->init(&_M_stringbuf); }
    557 
    558       /**
    559        *  @brief  The destructor does nothing.
    560        *
    561        *  The buffer is deallocated by the stringbuf object, not the
    562        *  formatting stream.
    563       */
    564       ~basic_stringstream()
    565       { }
    566 
    567       // Members:
    568       /**
    569        *  @brief  Accessing the underlying buffer.
    570        *  @return  The current basic_stringbuf buffer.
    571        *
    572        *  This hides both signatures of std::basic_ios::rdbuf().
    573       */
    574       __stringbuf_type*
    575       rdbuf() const
    576       { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
    577 
    578       /**
    579        *  @brief  Copying out the string buffer.
    580        *  @return  @c rdbuf()->str()
    581       */
    582       __string_type
    583       str() const
    584       { return _M_stringbuf.str(); }
    585 
    586       /**
    587        *  @brief  Setting a new buffer.
    588        *  @param  __s  The string to use as a new sequence.
    589        *
    590        *  Calls @c rdbuf()->str(s).
    591       */
    592       void
    593       str(const __string_type& __s)
    594       { _M_stringbuf.str(__s); }
    595     };
    596 
    597 _GLIBCXX_END_NAMESPACE_VERSION
    598 } // namespace
    599 
    600 #include <bits/sstream.tcc>
    601 
    602 #endif /* _GLIBCXX_SSTREAM */
    603