Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // String based streams -*- C++ -*-
  2.  
  3. // Copyright (C) 1997-2013 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.