⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 std_sstream.h

📁 gcc-you can use this code to learn something about gcc, and inquire further into linux,
💻 H
📖 第 1 页 / 共 2 页
字号:
// String based streams -*- C++ -*-// Copyright (C) 1997, 1998, 1999, 2002, 2003 Free Software Foundation, Inc.//// This file is part of the GNU ISO C++ Library.  This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License.//// ISO C++ 14882: 27.7  String-based streams///** @file sstream *  This is a Standard C++ Library header.  You should @c #include this header *  in your programs, rather than any of the "st[dl]_*.h" implementation files. */#ifndef _CPP_SSTREAM#define _CPP_SSTREAM	1#pragma GCC system_header#include <istream>#include <ostream>namespace std{  // [27.7.1] template class basic_stringbuf  /**   *  @brief  The actual work of input and output (for std::string).   *   *  This class associates either or both of its input and output sequences   *  with a sequence of characters, which can be initialized from, or made   *  available as, a @c std::basic_string.  (Paraphrased from [27.7.1]/1.)   *   *  For this class, open modes (of type @c ios_base::openmode) have   *  @c in set if the input sequence can be read, and @c out set if the   *  output sequence can be written.  */  template<typename _CharT, typename _Traits, typename _Alloc>    class basic_stringbuf : public basic_streambuf<_CharT, _Traits>    {    public:      // Types:      typedef _CharT 					char_type;      typedef _Traits 					traits_type;#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS// 251. basic_stringbuf missing allocator_type      typedef _Alloc				       	allocator_type;#endif      typedef typename traits_type::int_type 		int_type;      typedef typename traits_type::pos_type 		pos_type;      typedef typename traits_type::off_type 		off_type;      //@{      /**       *  @if maint       *  @doctodo       *  @endif      */      typedef basic_streambuf<char_type, traits_type>  	__streambuf_type;      typedef basic_string<char_type, _Traits, _Alloc> 	__string_type;      typedef typename __string_type::size_type		__size_type;      //@}    protected:      // Data Members:      /**       *  @if maint       *  @doctodo       *  @endif      */      __string_type 		_M_string;    public:      // Constructors:      /**       *  @brief  Starts with an empty string buffer.       *  @param  mode  Whether the buffer can read, or write, or both.       *       *  The default constructor initializes the parent class using its       *  own default ctor.      */      explicit      basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)      : __streambuf_type(), _M_string()      { _M_stringbuf_init(__mode); }      /**       *  @brief  Starts with an existing string buffer.       *  @param  str  A string to copy as a starting buffer.       *  @param  mode  Whether the buffer can read, or write, or both.       *       *  This constructor initializes the parent class using its       *  own default ctor.      */      explicit      basic_stringbuf(const __string_type& __str,		      ios_base::openmode __mode = ios_base::in | ios_base::out)      : __streambuf_type(), _M_string(__str.data(), __str.size())      { _M_stringbuf_init(__mode); }      // Get and set:      /**       *  @brief  Copying out the string buffer.       *  @return  A copy of one of the underlying sequences.       *       *  "If the buffer is only created in input mode, the underlying       *  character sequence is equal to the input sequence; otherwise, it       *  is equal to the output sequence." [27.7.1.2]/1      */      __string_type      str() const      {	if (_M_mode & ios_base::out)	  {	    // This is the deal: _M_string.size() is a value that	    // represents the size of the initial string that makes	    // _M_string, and may not be the correct size of the	    // current stringbuf internal buffer.	    __size_type __len = _M_string.size();	    if (_M_out_end > _M_out_beg)	      __len = max(__size_type(_M_out_end - _M_out_beg), __len);	    return __string_type(_M_out_beg, _M_out_beg + __len);	  }	else	  return _M_string;      }      /**       *  @brief  Setting a new buffer.       *  @param  s  The string to use as a new sequence.       *       *  Deallocates any previous stored sequence, then copies @a s to       *  use as a new one.      */      void      str(const __string_type& __s)      {	// Cannot use _M_string = __s, since v3 strings are COW.	_M_string.assign(__s.data(), __s.size());	_M_stringbuf_init(_M_mode);      }    protected:      // Common initialization code for both ctors goes here.      /**       *  @if maint       *  @doctodo       *  @endif      */      void      _M_stringbuf_init(ios_base::openmode __mode)      {	// _M_buf_size is a convenient alias for "what the streambuf	// thinks the allocated size of the string really is." This is	// necessary as ostringstreams are implemented with the	// streambufs having control of the allocation and	// re-allocation of the internal string object, _M_string.	_M_buf_size = _M_string.size();	// NB: Start ostringstream buffers at 512 bytes. This is an	// experimental value (pronounced "arbitrary" in some of the	// hipper english-speaking countries), and can be changed to	// suit particular needs.	_M_buf_size_opt = 512;	_M_mode = __mode;	if (_M_mode & (ios_base::ate | ios_base::app))	  _M_really_sync(0, _M_buf_size);	else	  _M_really_sync(0, 0);      }      // Overridden virtual functions:      // [documentation is inherited]      virtual int_type      underflow()      {	if (_M_in_cur && _M_in_cur < _M_in_end)	  return traits_type::to_int_type(*gptr());	else	  return traits_type::eof();      }      // [documentation is inherited]      virtual int_type      pbackfail(int_type __c = traits_type::eof());      // [documentation is inherited]      virtual int_type      overflow(int_type __c = traits_type::eof());      /**       *  @brief  Manipulates the buffer.       *  @param  s  Pointer to a buffer area.       *  @param  n  Size of @a s.       *  @return  @c this       *       *  If no buffer has already been created, and both @a s and @a n are       *  non-zero, then @c s is used as a buffer; see       *  http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#2       *  for more.      */      virtual __streambuf_type*      setbuf(char_type* __s, streamsize __n)      {	if (__s && __n)	  {	    _M_string = __string_type(__s, __n);	    _M_really_sync(0, 0);	  }	return this;      }      // [documentation is inherited]      virtual pos_type      seekoff(off_type __off, ios_base::seekdir __way,	      ios_base::openmode __mode = ios_base::in | ios_base::out);      // [documentation is inherited]      virtual pos_type      seekpos(pos_type __sp,	      ios_base::openmode __mode = ios_base::in | ios_base::out);      // Internal function for correctly updating the internal buffer      // for a particular _M_string, due to initialization or      // re-sizing of an existing _M_string.      // Assumes: contents of _M_string and internal buffer match exactly.      // __i == _M_in_cur - _M_in_beg      // __o == _M_out_cur - _M_out_beg      /**       *  @if maint       *  @doctodo       *  @endif      */      virtual int      _M_really_sync(__size_type __i, __size_type __o)      {	char_type* __base = const_cast<char_type*>(_M_string.data());	bool __testin = _M_mode & ios_base::in;	bool __testout = _M_mode & ios_base::out;	__size_type __len = _M_string.size();	_M_buf = __base;	if (__testin)	    this->setg(__base, __base + __i, __base + __len);	if (__testout)	  {	    this->setp(__base, __base + __len);	    _M_out_cur += __o;	  }	return 0;      }    };  // [27.7.2] Template class basic_istringstream  /**   *  @brief  Controlling input for std::string.   *   *  This class supports reading from objects of type std::basic_string,   *  using the inherited functions from std::basic_istream.  To control   *  the associated sequence, an instance of std::basic_stringbuf is used,   *  which this page refers to as @c sb.  */  template<typename _CharT, typename _Traits, typename _Alloc>    class basic_istringstream : public basic_istream<_CharT, _Traits>    {    public:      // Types:      typedef _CharT 					char_type;      typedef _Traits 					traits_type;#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS// 251. basic_stringbuf missing allocator_type      typedef _Alloc				       	allocator_type;#endif      typedef typename traits_type::int_type 		int_type;      typedef typename traits_type::pos_type 		pos_type;      typedef typename traits_type::off_type 		off_type;      // Non-standard types:      typedef basic_string<_CharT, _Traits, _Alloc> 	__string_type;      typedef basic_stringbuf<_CharT, _Traits, _Alloc> 	__stringbuf_type;      typedef basic_istream<char_type, traits_type>	__istream_type;    private:      /**       *  @if maint       *  @doctodo       *  @endif      */      __stringbuf_type	_M_stringbuf;    public:      // Constructors:      /**       *  @brief  Default constructor starts with an empty string buffer.       *  @param  mode  Whether the buffer can read, or write, or both.       *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -