Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // String based streams -*- C++ -*-
  2.  
  3. // Copyright (C) 1997-1999 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 2, 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. // You should have received a copy of the GNU General Public License along
  17. // with this library; see the file COPYING.  If not, write to the Free
  18. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  19. // USA.
  20.  
  21. // As a special exception, you may use this file as part of a free software
  22. // library without restriction.  Specifically, if other files instantiate
  23. // templates or use macros or inline functions from this file, or you compile
  24. // this file and link it with other files to produce an executable, this
  25. // file does not by itself cause the resulting executable to be covered by
  26. // the GNU General Public License.  This exception does not however
  27. // invalidate any other reasons why the executable file might be covered by
  28. // the GNU General Public License.
  29.  
  30. //
  31. // ISO C++ 14882: 27.7  String-based streams
  32. //
  33.  
  34. #ifndef _CPP_SSTREAM
  35. #define _CPP_SSTREAM    1
  36.  
  37. #pragma GCC system_header
  38.  
  39. #include <bits/std_istream.h>
  40. #include <bits/std_ostream.h>
  41.  
  42. namespace std
  43. {
  44.   template<typename _CharT, typename _Traits, typename _Alloc>
  45.     class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
  46.     {
  47.     public:
  48.       // Types:
  49.       typedef _CharT                                    char_type;
  50.       typedef _Traits                                   traits_type;
  51. #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
  52. // 251. basic_stringbuf missing allocator_type
  53.       typedef _Alloc                                    allocator_type;
  54. #endif
  55.       typedef typename traits_type::int_type            int_type;
  56.       typedef typename traits_type::pos_type            pos_type;
  57.       typedef typename traits_type::off_type            off_type;
  58.  
  59.       // Non-standard Types:
  60.       typedef basic_streambuf<char_type, traits_type>   __streambuf_type;
  61.       typedef basic_string<char_type, _Traits, _Alloc>  __string_type;
  62.       typedef typename __string_type::size_type         __size_type;
  63.  
  64.     private:
  65.       // Data Members:
  66.       __string_type             _M_string;
  67.      
  68.     public:
  69.       // Constructors:
  70.       explicit
  71.       basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
  72.       : __streambuf_type(), _M_string()
  73.       { _M_stringbuf_init(__mode); }
  74.  
  75.       explicit
  76.       basic_stringbuf(const __string_type& __str,
  77.                       ios_base::openmode __mode = ios_base::in | ios_base::out)
  78.       : __streambuf_type(), _M_string(__str.c_str())
  79.       { _M_stringbuf_init(__mode); }
  80.  
  81.       // Get and set:
  82.       __string_type
  83.       str() const
  84.       {
  85.         if (_M_mode & ios_base::out)
  86.           {
  87.             // This is the deal: _M_string.size() is value that
  88.             // represents the size of the intial string that makes
  89.             // _M_string, and may not be the correct size of the
  90.             // current stringbuf internal buffer.
  91.             __size_type __len = _M_string.size();
  92.             if (_M_out_cur > _M_out_beg)
  93.               __len = max(__size_type(_M_out_end - _M_out_beg), __len);
  94.             return __string_type(_M_out_beg, _M_out_beg + __len);
  95.           }
  96.         else
  97.           return _M_string;
  98.       }
  99.  
  100.       void
  101.       str(const __string_type& __s)
  102.       {
  103.         _M_string = __s;
  104.         _M_stringbuf_init(_M_mode);
  105.       }
  106.  
  107.     protected:
  108.       // Common initialization code for both ctors goes here.
  109.       void
  110.       _M_stringbuf_init(ios_base::openmode __mode)
  111.       {
  112.         // _M_buf_size is a convenient alias for "what the streambuf
  113.         // thinks the allocated size of the string really is." This is
  114.         // necessary as ostringstreams are implemented with the
  115.         // streambufs having control of the allocation and
  116.         // re-allocation of the internal string object, _M_string.
  117.         _M_buf_size = _M_string.size();
  118.  
  119.         // NB: Start ostringstream buffers at 1024 bytes. This is an
  120.         // experimental value (pronounced "arbitrary" in some of the
  121.         // hipper english-speaking countries), and can be changed to
  122.         // suite particular needs.
  123.         _M_buf_size_opt = 512;
  124.         _M_mode = __mode;
  125.         if (_M_mode & ios_base::ate)
  126.           _M_really_sync(0, _M_buf_size);
  127.         else  
  128.           _M_really_sync(0, 0);
  129.       }
  130.  
  131.       // Overridden virtual functions:
  132.       virtual int_type
  133.       underflow()
  134.       {
  135.         if (_M_in_cur && _M_in_cur < _M_in_end)
  136.           return traits_type::to_int_type(*gptr());
  137.         else
  138.           return traits_type::eof();
  139.       }
  140.  
  141.       virtual int_type
  142.       pbackfail(int_type __c = traits_type::eof());
  143.  
  144.       virtual int_type
  145.       overflow(int_type __c = traits_type::eof());
  146.  
  147.       virtual __streambuf_type*
  148.       setbuf(char_type* __s, streamsize __n)
  149.       {
  150.         if (__s && __n)
  151.           {
  152.             _M_string = __string_type(__s, __n);
  153.             _M_really_sync(0, 0);
  154.           }
  155.         return this;
  156.       }
  157.  
  158.       virtual pos_type
  159.       seekoff(off_type __off, ios_base::seekdir __way,
  160.               ios_base::openmode __mode = ios_base::in | ios_base::out);
  161.  
  162.       virtual pos_type
  163.       seekpos(pos_type __sp,
  164.               ios_base::openmode __mode = ios_base::in | ios_base::out);
  165.  
  166.       // Internal function for correctly updating the internal buffer
  167.       // for a particular _M_string, due to initialization or
  168.       // re-sizing of an existing _M_string.
  169.       // Assumes: contents of _M_string and internal buffer match exactly.
  170.       // __i == _M_in_cur - _M_in_beg      
  171.       // __o == _M_out_cur - _M_out_beg
  172.       virtual int
  173.       _M_really_sync(__size_type __i, __size_type __o)
  174.       {
  175.         char_type* __base = const_cast<char_type*>(_M_string.data());
  176.         bool __testin = _M_mode & ios_base::in;
  177.         bool __testout = _M_mode & ios_base::out;
  178.         __size_type __len = _M_string.size();
  179.  
  180.         _M_buf = __base;
  181.         if (__testin)
  182.             this->setg(__base, __base + __i, __base + __len);
  183.         if (__testout)
  184.           {
  185.             this->setp(__base, __base + __len);
  186.             _M_out_cur += __o;
  187.           }
  188.         return 0;
  189.       }
  190.     };
  191.  
  192.  
  193.   // 27.7.2  Template class basic_istringstream
  194.   template<typename _CharT, typename _Traits, typename _Alloc>
  195.     class basic_istringstream : public basic_istream<_CharT, _Traits>
  196.     {
  197.     public:
  198.       // Types:
  199.       typedef _CharT                                    char_type;
  200.       typedef _Traits                                   traits_type;
  201. #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
  202. // 251. basic_stringbuf missing allocator_type
  203.       typedef _Alloc                                    allocator_type;
  204. #endif
  205.       typedef typename traits_type::int_type            int_type;
  206.       typedef typename traits_type::pos_type            pos_type;
  207.       typedef typename traits_type::off_type            off_type;
  208.  
  209.       // Non-standard types:
  210.       typedef basic_string<_CharT, _Traits, _Alloc>     __string_type;
  211.       typedef basic_stringbuf<_CharT, _Traits, _Alloc>  __stringbuf_type;
  212.       typedef basic_istream<char_type, traits_type>     __istream_type;
  213.  
  214.     private:
  215.       __stringbuf_type  _M_stringbuf;
  216.  
  217.     public:
  218.       // Constructors:
  219.       explicit
  220.       basic_istringstream(ios_base::openmode __mode = ios_base::in)
  221.       : __istream_type(NULL), _M_stringbuf(__mode | ios_base::in)
  222.       { this->init(&_M_stringbuf); }
  223.  
  224.       explicit
  225.       basic_istringstream(const __string_type& __str,
  226.                           ios_base::openmode __mode = ios_base::in)
  227.       : __istream_type(NULL), _M_stringbuf(__str, __mode | ios_base::in)
  228.       { this->init(&_M_stringbuf); }
  229.  
  230.       ~basic_istringstream()
  231.       { }
  232.  
  233.       // Members:
  234.       __stringbuf_type*
  235.       rdbuf() const
  236.       { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
  237.  
  238.       __string_type
  239.       str() const
  240.       { return _M_stringbuf.str(); }
  241.  
  242.       void
  243.       str(const __string_type& __s)
  244.       { _M_stringbuf.str(__s); }
  245.     };
  246.  
  247.  
  248.   // 27.7.3  Template class basic_ostringstream
  249.   template <typename _CharT, typename _Traits, typename _Alloc>
  250.     class basic_ostringstream : public basic_ostream<_CharT, _Traits>
  251.     {
  252.     public:
  253.       // Types:
  254.       typedef _CharT                                    char_type;
  255.       typedef _Traits                                   traits_type;
  256. #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
  257. // 251. basic_stringbuf missing allocator_type
  258.       typedef _Alloc                                    allocator_type;
  259. #endif
  260.       typedef typename traits_type::int_type            int_type;
  261.       typedef typename traits_type::pos_type            pos_type;
  262.       typedef typename traits_type::off_type            off_type;
  263.  
  264.       // Non-standard types:
  265.       typedef basic_string<_CharT, _Traits, _Alloc>     __string_type;
  266.       typedef basic_stringbuf<_CharT, _Traits, _Alloc>  __stringbuf_type;
  267.       typedef basic_ostream<char_type, traits_type>     __ostream_type;
  268.  
  269.     private:
  270.       __stringbuf_type  _M_stringbuf;
  271.  
  272.     public:
  273.      // Constructors/destructor:
  274.       explicit
  275.       basic_ostringstream(ios_base::openmode __mode = ios_base::out)
  276.       : __ostream_type(NULL), _M_stringbuf(__mode | ios_base::out)
  277.       { this->init(&_M_stringbuf); }
  278.  
  279.       explicit
  280.       basic_ostringstream(const __string_type __str,
  281.                           ios_base::openmode __mode = ios_base::out)
  282.       : __ostream_type(NULL), _M_stringbuf(__str, __mode | ios_base::out)
  283.       { this->init(&_M_stringbuf); }
  284.  
  285.       ~basic_ostringstream()
  286.       { }
  287.  
  288.       // Members:
  289.       __stringbuf_type*
  290.       rdbuf() const
  291.       { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
  292.  
  293.       __string_type
  294.       str() const
  295.       { return _M_stringbuf.str(); }
  296.  
  297.       void
  298.       str(const __string_type& __s)
  299.       { _M_stringbuf.str(__s); }
  300.     };
  301.  
  302.  
  303.   // 27.7.4  Template class basic_stringstream
  304.   template <typename _CharT, typename _Traits, typename _Alloc>
  305.     class basic_stringstream : public basic_iostream<_CharT, _Traits>
  306.     {
  307.     public:
  308.       // Types:
  309.       typedef _CharT                                    char_type;
  310.       typedef _Traits                                   traits_type;
  311. #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
  312. // 251. basic_stringbuf missing allocator_type
  313.       typedef _Alloc                                    allocator_type;
  314. #endif
  315.       typedef typename traits_type::int_type            int_type;
  316.       typedef typename traits_type::pos_type            pos_type;
  317.       typedef typename traits_type::off_type            off_type;
  318.  
  319.       // Non-standard Types:
  320.       typedef basic_string<_CharT, _Traits, _Alloc>     __string_type;
  321.       typedef basic_stringbuf<_CharT, _Traits, _Alloc>  __stringbuf_type;
  322.       typedef basic_iostream<char_type, traits_type>    __iostream_type;
  323.  
  324.     private:
  325.       __stringbuf_type  _M_stringbuf;
  326.  
  327.     public:
  328.       // Constructors/destructors
  329.       explicit
  330.       basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
  331.       : __iostream_type(NULL), _M_stringbuf(__m)
  332.       { this->init(&_M_stringbuf); }
  333.  
  334.       explicit
  335.       basic_stringstream(const __string_type& __str,
  336.                          ios_base::openmode __m = ios_base::out | ios_base::in)
  337.       : __iostream_type(NULL), _M_stringbuf(__str, __m)
  338.       { this->init(&_M_stringbuf); }
  339.  
  340.       ~basic_stringstream()
  341.       { }
  342.  
  343.       // Members:
  344.       __stringbuf_type*
  345.       rdbuf() const
  346.       { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
  347.  
  348.       __string_type
  349.       str() const
  350.       { return _M_stringbuf.str(); }
  351.  
  352.       void
  353.       str(const __string_type& __s)
  354.       { _M_stringbuf.str(__s); }
  355.     };
  356. } // namespace std
  357.  
  358.  
  359.  
  360. #ifdef _GLIBCPP_NO_TEMPLATE_EXPORT
  361. # define export
  362. #ifdef  _GLIBCPP_FULLY_COMPLIANT_HEADERS
  363. # include <bits/sstream.tcc>
  364. #endif
  365. #endif
  366.  
  367. #endif  // _CPP_SSTREAM
  368.