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

📄 streambuf

📁 symbian上STL模板库的实现
💻
📖 第 1 页 / 共 2 页
字号:
// Stream buffer classes -*- C++ -*-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004// 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.5  Stream buffers///** @file streambuf *  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 _CLIBXX_STREAMBUF#define _CLIBXX_STREAMBUF 1//#pragma GCC system_header#include <bits/c++config.h>#include <iosfwd>#include <bits/localefwd.h>#include <bits/ios_base.h>namespace std{  /**   *  @if maint   *  Does stuff.   *  @endif  */  template<typename _CharT, typename _Traits>    streamsize    __copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin,		      basic_streambuf<_CharT, _Traits>* __sbout);    /**   *  @brief  The actual work of input and output (interface).   *   *  This is a base class.  Derived stream buffers each control a   *  pair of character sequences:  one for input, and one for output.   *   *  Section [27.5.1] of the standard describes the requirements and   *  behavior of stream buffer classes.  That section (three paragraphs)   *  is reproduced here, for simplicity and accuracy.   *   *  -# Stream buffers can impose various constraints on the sequences   *     they control.  Some constraints are:   *     - The controlled input sequence can be not readable.   *     - The controlled output sequence can be not writable.   *     - The controlled sequences can be associated with the contents of   *       other representations for character sequences, such as external   *       files.   *     - The controlled sequences can support operations @e directly to or   *       from associated sequences.   *     - The controlled sequences can impose limitations on how the   *       program can read characters from a sequence, write characters to   *       a sequence, put characters back into an input sequence, or alter   *       the stream position.   *     .   *  -# Each sequence is characterized by three pointers which, if non-null,   *     all point into the same @c charT array object.  The array object   *     represents, at any moment, a (sub)sequence of characters from the   *     sequence.  Operations performed on a sequence alter the values   *     stored in these pointers, perform reads and writes directly to or   *     from associated sequences, and alter "the stream position" and   *     conversion state as needed to maintain this subsequence relationship.   *     The three pointers are:   *     - the <em>beginning pointer</em>, or lowest element address in the   *       array (called @e xbeg here);   *     - the <em>next pointer</em>, or next element address that is a   *       current candidate for reading or writing (called @e xnext here);   *     - the <em>end pointer</em>, or first element address beyond the   *       end of the array (called @e xend here).   *     .   *  -# The following semantic constraints shall always apply for any set   *     of three pointers for a sequence, using the pointer names given   *     immediately above:   *     - If @e xnext is not a null pointer, then @e xbeg and @e xend shall   *       also be non-null pointers into the same @c charT array, as   *       described above; otherwise, @e xbeg and @e xend shall also be null.   *     - If @e xnext is not a null pointer and @e xnext < @e xend for an   *       output sequence, then a <em>write position</em> is available.   *       In this case, @e *xnext shall be assignable as the next element   *       to write (to put, or to store a character value, into the sequence).   *     - If @e xnext is not a null pointer and @e xbeg < @e xnext for an   *       input sequence, then a <em>putback position</em> is available.   *       In this case, @e xnext[-1] shall have a defined value and is the   *       next (preceding) element to store a character that is put back   *       into the input sequence.   *     - If @e xnext is not a null pointer and @e xnext< @e xend for an   *       input sequence, then a <em>read position</em> is available.   *       In this case, @e *xnext shall have a defined value and is the   *       next element to read (to get, or to obtain a character value,   *       from the sequence).  */  template<typename _CharT, typename _Traits>    class basic_streambuf     {    public:      //@{      /**       *  These are standard types.  They permit a standardized way of       *  referring to names of (or names dependant on) the template       *  parameters, which are specific to the implementation.      */      typedef _CharT 					char_type;      typedef _Traits 					traits_type;      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       *  This is a non-standard type.       *  @endif      */      typedef basic_streambuf<char_type, traits_type>  	__streambuf_type;      //@}            friend class basic_ios<char_type, traits_type>;      friend class basic_istream<char_type, traits_type>;      friend class basic_ostream<char_type, traits_type>;      friend class istreambuf_iterator<char_type, traits_type>;      friend class ostreambuf_iterator<char_type, traits_type>;      friend streamsize      __copy_streambufs<>(__streambuf_type* __sbin,			  __streambuf_type* __sbout);          protected:      //@{      /**       *  @if maint       *  This is based on _IO_FILE, just reordered to be more consistent,       *  and is intended to be the most minimal abstraction for an       *  internal buffer.       *  -  get == input == read       *  -  put == output == write       *  @endif      */      char_type* 		_M_in_beg;     // Start of get area.       char_type* 		_M_in_cur;     // Current read area.       char_type* 		_M_in_end;     // End of get area.       char_type* 		_M_out_beg;    // Start of put area.       char_type* 		_M_out_cur;    // Current put area.       char_type* 		_M_out_end;    // End of put area.      /**       *  @if maint       *  Current locale setting.       *  @endif      */      locale 			_M_buf_locale;	  public:      /// Destructor deallocates no buffer space.      virtual       ~basic_streambuf()       { }      // [27.5.2.2.1] locales      /**       *  @brief  Entry point for imbue().       *  @param  loc  The new locale.       *  @return  The previous locale.       *       *  Calls the derived imbue(loc).      */      locale       pubimbue(const locale &__loc)      {	locale __tmp(this->getloc());	this->imbue(__loc);	_M_buf_locale = __loc;	return __tmp;      }      /**       *  @brief  Locale access.       *  @return  The current locale in effect.       *       *  If pubimbue(loc) has been called, then the most recent @c loc       *  is returned.  Otherwise the global locale in effect at the time       *  of construction is returned.      */      locale         getloc() const      { return _M_buf_locale; }       // [27.5.2.2.2] buffer management and positioning      //@{      /**       *  @brief  Entry points for derived buffer functions.       *       *  The public versions of @c pubfoo dispatch to the protected       *  derived @c foo member functions, passing the arguments (if any)       *  and returning the result unchanged.      */      __streambuf_type*       pubsetbuf(char_type* __s, streamsize __n)       { return this->setbuf(__s, __n); }      pos_type       pubseekoff(off_type __off, ios_base::seekdir __way, 		 ios_base::openmode __mode = ios_base::in | ios_base::out)      { return this->seekoff(__off, __way, __mode); }      pos_type       pubseekpos(pos_type __sp,		 ios_base::openmode __mode = ios_base::in | ios_base::out)      { return this->seekpos(__sp, __mode); }      int       pubsync() { return this->sync(); }      //@}      // [27.5.2.2.3] get area      /**       *  @brief  Looking ahead into the stream.       *  @return  The number of characters available.       *       *  If a read position is available, returns the number of characters       *  available for reading before the buffer must be refilled.       *  Otherwise returns the derived @c showmanyc().      */      streamsize       in_avail()       { 	const streamsize __ret = this->egptr() - this->gptr();	return __ret ? __ret : this->showmanyc();      }      /**       *  @brief  Getting the next character.       *  @return  The next character, or eof.       *       *  Calls @c sbumpc(), and if that function returns       *  @c traits::eof(), so does this function.  Otherwise, @c sgetc().      */      int_type       snextc()      {	int_type __ret = traits_type::eof();	if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(), 						       __ret), true))	  __ret = this->sgetc();	return __ret;      }      /**       *  @brief  Getting the next character.       *  @return  The next character, or eof.       *       *  If the input read position is available, returns that character       *  and increments the read pointer, otherwise calls and returns       *  @c uflow().      */      int_type       sbumpc()      {	int_type __ret;	if (__builtin_expect(this->gptr() < this->egptr(), true))	  {	    __ret = traits_type::to_int_type(*this->gptr());	    this->gbump(1);	  }	else 	  __ret = this->uflow();	return __ret;      }      /**       *  @brief  Getting the next character.       *  @return  The next character, or eof.       *       *  If the input read position is available, returns that character,       *  otherwise calls and returns @c underflow().  Does not move the        *  read position after fetching the character.      */      int_type       sgetc()      {	int_type __ret;	if (__builtin_expect(this->gptr() < this->egptr(), true))	  __ret = traits_type::to_int_type(*this->gptr());	else 	  __ret = this->underflow();	return __ret;      }      /**       *  @brief  Entry point for xsgetn.       *  @param  s  A buffer area.       *  @param  n  A count.       *       *  Returns xsgetn(s,n).  The effect is to fill @a s[0] through       *  @a s[n-1] with characters from the input sequence, if possible.      */      streamsize       sgetn(char_type* __s, streamsize __n)      { return this->xsgetn(__s, __n); }      // [27.5.2.2.4] putback      /**       *  @brief  Pushing characters back into the input stream.       *  @param  c  The character to push back.       *  @return  The previous character, if possible.       *       *  Similar to sungetc(), but @a c is pushed onto the stream instead       *  of "the previous character".  If successful, the next character       *  fetched from the input stream will be @a c.      */      int_type       sputbackc(char_type __c)      {	int_type __ret;	const bool __testpos = this->eback() < this->gptr();	if (__builtin_expect(!__testpos || 			     !traits_type::eq(__c, this->gptr()[-1]), false))	  __ret = this->pbackfail(traits_type::to_int_type(__c));	else 	  {	    this->gbump(-1);	    __ret = traits_type::to_int_type(*this->gptr());	  }	return __ret;      }      /**       *  @brief  Moving backwards in the input stream.       *  @return  The previous character, if possible.       *       *  If a putback position is available, this function decrements the       *  input pointer and returns that character.  Otherwise, calls and       *  returns pbackfail().  The effect is to "unget" the last character       *  "gotten".      */      int_type       sungetc()      {	int_type __ret;	if (__builtin_expect(this->eback() < this->gptr(), true))	  {	    this->gbump(-1);	    __ret = traits_type::to_int_type(*this->gptr());	  }	else 	  __ret = this->pbackfail();	return __ret;      }      // [27.5.2.2.5] put area      /**       *  @brief  Entry point for all single-character output functions.       *  @param  c  A character to output.       *  @return  @a c, if possible.       *       *  One of two public output functions.       *       *  If a write position is available for the output sequence (i.e.,       *  the buffer is not full), stores @a c in that position, increments       *  the position, and returns @c traits::to_int_type(c).  If a write       *  position is not available, returns @c overflow(c).      */      int_type 

⌨️ 快捷键说明

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