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

📄 sstream.tcc

📁 c++编程宝典源码及Quincy99编译器 是《标准C++编程宝典》电子工业出版社的光盘
💻 TCC
字号:
// String based streams -*- C++ -*-// Copyright (C) 1997-1999 Cygnus Solutions//// 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//#ifndef _CPP_BITS_SSTREAM_TCC#define _CPP_BITS_SSTREAM_TCC	1#include <bits/std_sstream.h>namespace std {  template <class _CharT, class _Traits, class _Alloc>    basic_stringbuf<_CharT, _Traits, _Alloc>::int_type     basic_stringbuf<_CharT, _Traits, _Alloc>::pbackfail(int_type __c)    {      int_type __retval = traits_type::eof();      char_type* __pcur = this->gptr();      bool __testeof = traits_type::eq_int_type(__c, traits_type::eof());      bool __testpos = __pcur && _M_in_beg < __pcur;             // Try to put back __c into input sequence in one of three ways.      // Order these tests done in is unspecified by the standard.      if (!__testeof && __testpos 	  && traits_type::eq(traits_type::to_char_type(__c), gptr()[-1]))	{	  char_type __asgn = __pcur[-1];	  *__pcur = __asgn;	  __retval = __c;	}      else if (!__testeof && __testpos && _M_mode & ios_base::out)	{	  __pcur[-1] = __c;	  __retval = __c;	}      else if (__testeof && __testpos)	{	  char_type __asgn = __pcur[-1];	  *__pcur = __asgn;	  __retval = traits_type::not_eof(__c);	}      return __retval;    }    template <class _CharT, class _Traits, class _Alloc>    basic_stringbuf<_CharT, _Traits, _Alloc>::int_type     basic_stringbuf<_CharT, _Traits, _Alloc>::overflow(int_type __c)    {      int_type __retval = traits_type::eof();      bool __testeof = traits_type::eq_int_type(__c, __retval);      bool __testwrite = _M_out_cur < _M_buf + _M_buf_size;      bool __testout = _M_mode & ios_base::out;      // Try to append __c into output sequence in one of two ways.      // Order these tests done in is unspecified by the standard.      if (__testout)	{	  if (!__testeof)	    {	      // NB: Start ostringstream buffers at 1024 bytes. This	      // is an experimental value (pronounced "arbitrary" in	      // some of the hipper english-speaking countries), and	      // can be changed to suite particular needs.	      __size_type __len = max(_M_buf_size, static_cast<int_type>(512));	      __len *= 2;	      if (__testwrite)		__retval = this->sputc(__c);	      else if (__len <= _M_string.max_size())		{		  // Force-allocate, re-sync.		  _M_string = this->str();		  _M_string.reserve(__len);		  _M_buf_size = static_cast<int_type>(__len);		  _M_really_sync(_M_in_cur - _M_in_beg, 				 _M_out_cur - _M_out_beg);		  *_M_out_cur = traits_type::to_char_type(__c);		  _M_buf_bump(1);		  __retval = __c;		}#if 0	      else		throw out_of_range("stringbuf::overflow");#endif	    }	  else	    __retval = traits_type::not_eof(__c);	}      return __retval;    }  template <class _CharT, class _Traits, class _Alloc>    basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type    basic_stringbuf<_CharT, _Traits, _Alloc>::    seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)    {      pos_type __retval =  pos_type(off_type(-1));       __streambuf_type::char_type* __beg = _M_buf;      __streambuf_type::char_type* __cur = NULL;      __streambuf_type::char_type* __end = NULL;      bool __testin = __mode & ios_base::in && _M_mode & ios_base::in;      bool __testout = __mode & ios_base::out && _M_mode & ios_base::out;      bool __testboth = __testin && __testout && __way != ios_base::cur;            if (__testin)	{	  __cur = this->gptr();	  __end = this->egptr();	  }      if (__testout)	{	  __cur = this->pptr();	  __end = _M_buf + _M_buf_size;	}      if (__testboth || __testin && !__testout || __testout && !__testin)	{	  off_type __newoff = 0;	  if (__way == ios_base::cur)	    __newoff = __cur - __beg;	  else if (__way == ios_base::end)	    __newoff = __end - __beg;	  	  if (__newoff + __off >= 0 && __end - __beg >= __newoff + __off)	    {	      // Need to set both of these if applicable.	      if (__testin)		_M_in_cur = __beg + __newoff + __off;	      if (__testout)		_M_buf_bump(__newoff + __off - (_M_out_cur - __beg));	      __retval = pos_type(off_type(__beg + __newoff + __off));	    }	}      return __retval;    }  template <class _CharT, class _Traits, class _Alloc>    basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type    basic_stringbuf<_CharT, _Traits, _Alloc>::    seekpos(pos_type __sp, ios_base::openmode __mode)    {      pos_type __retval =  pos_type(off_type(-1));       char_type* __pos = reinterpret_cast<char_type*> (__sp._M_position());      char_type* __beg = NULL;      char_type* __end = NULL;      bool __testin = __mode & ios_base::in && _M_mode & ios_base::in;      bool __testout = __mode & ios_base::out && _M_mode & ios_base::out;            if (__testin)	{	  __beg = this->eback();	  __end = this->egptr();	}      if (__testout)	{	  __beg = this->pbase();	  __end = _M_buf + _M_buf_size;	}      if (__beg <= __pos && __pos <= __end)	{	  // Need to set both of these if applicable	  if (__testin)	    _M_in_cur = __pos;	  if (__testout)	    _M_buf_bump((__pos - __beg) - (_M_out_cur - __beg));	  __retval = pos_type(off_type(__pos));	}            return __retval;    }} // namespace std#endif	/* _CPP_BITS_SSTREAM_TCC */

⌨️ 快捷键说明

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