100db7afdSDavid E. O'Brien // Stream buffer classes -*- C++ -*-
200db7afdSDavid E. O'Brien 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
400db7afdSDavid E. O'Brien // Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien 
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien 
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien 
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien 
31*f8a1b7d9SAlexander Kabaev /** @file streambuf
32*f8a1b7d9SAlexander Kabaev  *  This is a Standard C++ Library header.
33*f8a1b7d9SAlexander Kabaev  */
34*f8a1b7d9SAlexander Kabaev 
3500db7afdSDavid E. O'Brien //
3600db7afdSDavid E. O'Brien // ISO C++ 14882: 27.5  Stream buffers
3700db7afdSDavid E. O'Brien //
3800db7afdSDavid E. O'Brien 
39*f8a1b7d9SAlexander Kabaev #ifndef _GLIBXX_STREAMBUF
40*f8a1b7d9SAlexander Kabaev #define _GLIBXX_STREAMBUF 1
4100db7afdSDavid E. O'Brien 
4200db7afdSDavid E. O'Brien #pragma GCC system_header
4300db7afdSDavid E. O'Brien 
4400db7afdSDavid E. O'Brien #include <bits/c++config.h>
4500db7afdSDavid E. O'Brien #include <iosfwd>
4600db7afdSDavid E. O'Brien #include <bits/localefwd.h>
4700db7afdSDavid E. O'Brien #include <bits/ios_base.h>
48*f8a1b7d9SAlexander Kabaev #include <bits/cpp_type_traits.h>
49*f8a1b7d9SAlexander Kabaev #include <ext/type_traits.h>
5000db7afdSDavid E. O'Brien 
51*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
52*f8a1b7d9SAlexander Kabaev 
531b86b14eSAlexander Kabaev   /**
541b86b14eSAlexander Kabaev    *  @if maint
551b86b14eSAlexander Kabaev    *  Does stuff.
561b86b14eSAlexander Kabaev    *  @endif
571b86b14eSAlexander Kabaev   */
5800db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
5900db7afdSDavid E. O'Brien     streamsize
60*f8a1b7d9SAlexander Kabaev     __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*,
61*f8a1b7d9SAlexander Kabaev 			  basic_streambuf<_CharT, _Traits>*, bool&);
6200db7afdSDavid E. O'Brien 
631b86b14eSAlexander Kabaev   /**
641b86b14eSAlexander Kabaev    *  @brief  The actual work of input and output (interface).
651b86b14eSAlexander Kabaev    *
661b86b14eSAlexander Kabaev    *  This is a base class.  Derived stream buffers each control a
671b86b14eSAlexander Kabaev    *  pair of character sequences:  one for input, and one for output.
681b86b14eSAlexander Kabaev    *
691b86b14eSAlexander Kabaev    *  Section [27.5.1] of the standard describes the requirements and
701b86b14eSAlexander Kabaev    *  behavior of stream buffer classes.  That section (three paragraphs)
711b86b14eSAlexander Kabaev    *  is reproduced here, for simplicity and accuracy.
721b86b14eSAlexander Kabaev    *
731b86b14eSAlexander Kabaev    *  -# Stream buffers can impose various constraints on the sequences
741b86b14eSAlexander Kabaev    *     they control.  Some constraints are:
751b86b14eSAlexander Kabaev    *     - The controlled input sequence can be not readable.
761b86b14eSAlexander Kabaev    *     - The controlled output sequence can be not writable.
771b86b14eSAlexander Kabaev    *     - The controlled sequences can be associated with the contents of
781b86b14eSAlexander Kabaev    *       other representations for character sequences, such as external
791b86b14eSAlexander Kabaev    *       files.
801b86b14eSAlexander Kabaev    *     - The controlled sequences can support operations @e directly to or
811b86b14eSAlexander Kabaev    *       from associated sequences.
821b86b14eSAlexander Kabaev    *     - The controlled sequences can impose limitations on how the
831b86b14eSAlexander Kabaev    *       program can read characters from a sequence, write characters to
841b86b14eSAlexander Kabaev    *       a sequence, put characters back into an input sequence, or alter
851b86b14eSAlexander Kabaev    *       the stream position.
861b86b14eSAlexander Kabaev    *     .
871b86b14eSAlexander Kabaev    *  -# Each sequence is characterized by three pointers which, if non-null,
881b86b14eSAlexander Kabaev    *     all point into the same @c charT array object.  The array object
891b86b14eSAlexander Kabaev    *     represents, at any moment, a (sub)sequence of characters from the
901b86b14eSAlexander Kabaev    *     sequence.  Operations performed on a sequence alter the values
911b86b14eSAlexander Kabaev    *     stored in these pointers, perform reads and writes directly to or
921b86b14eSAlexander Kabaev    *     from associated sequences, and alter "the stream position" and
931b86b14eSAlexander Kabaev    *     conversion state as needed to maintain this subsequence relationship.
941b86b14eSAlexander Kabaev    *     The three pointers are:
951b86b14eSAlexander Kabaev    *     - the <em>beginning pointer</em>, or lowest element address in the
961b86b14eSAlexander Kabaev    *       array (called @e xbeg here);
971b86b14eSAlexander Kabaev    *     - the <em>next pointer</em>, or next element address that is a
981b86b14eSAlexander Kabaev    *       current candidate for reading or writing (called @e xnext here);
991b86b14eSAlexander Kabaev    *     - the <em>end pointer</em>, or first element address beyond the
1001b86b14eSAlexander Kabaev    *       end of the array (called @e xend here).
1011b86b14eSAlexander Kabaev    *     .
1021b86b14eSAlexander Kabaev    *  -# The following semantic constraints shall always apply for any set
1031b86b14eSAlexander Kabaev    *     of three pointers for a sequence, using the pointer names given
1041b86b14eSAlexander Kabaev    *     immediately above:
1051b86b14eSAlexander Kabaev    *     - If @e xnext is not a null pointer, then @e xbeg and @e xend shall
1061b86b14eSAlexander Kabaev    *       also be non-null pointers into the same @c charT array, as
1071b86b14eSAlexander Kabaev    *       described above; otherwise, @e xbeg and @e xend shall also be null.
1081b86b14eSAlexander Kabaev    *     - If @e xnext is not a null pointer and @e xnext < @e xend for an
1091b86b14eSAlexander Kabaev    *       output sequence, then a <em>write position</em> is available.
1101b86b14eSAlexander Kabaev    *       In this case, @e *xnext shall be assignable as the next element
1111b86b14eSAlexander Kabaev    *       to write (to put, or to store a character value, into the sequence).
1121b86b14eSAlexander Kabaev    *     - If @e xnext is not a null pointer and @e xbeg < @e xnext for an
1131b86b14eSAlexander Kabaev    *       input sequence, then a <em>putback position</em> is available.
1141b86b14eSAlexander Kabaev    *       In this case, @e xnext[-1] shall have a defined value and is the
1151b86b14eSAlexander Kabaev    *       next (preceding) element to store a character that is put back
1161b86b14eSAlexander Kabaev    *       into the input sequence.
1171b86b14eSAlexander Kabaev    *     - If @e xnext is not a null pointer and @e xnext< @e xend for an
1181b86b14eSAlexander Kabaev    *       input sequence, then a <em>read position</em> is available.
1191b86b14eSAlexander Kabaev    *       In this case, @e *xnext shall have a defined value and is the
1201b86b14eSAlexander Kabaev    *       next element to read (to get, or to obtain a character value,
1211b86b14eSAlexander Kabaev    *       from the sequence).
1221b86b14eSAlexander Kabaev   */
12300db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
12400db7afdSDavid E. O'Brien     class basic_streambuf
12500db7afdSDavid E. O'Brien     {
12600db7afdSDavid E. O'Brien     public:
1271b86b14eSAlexander Kabaev       //@{
1281b86b14eSAlexander Kabaev       /**
1291b86b14eSAlexander Kabaev        *  These are standard types.  They permit a standardized way of
1301b86b14eSAlexander Kabaev        *  referring to names of (or names dependant on) the template
1311b86b14eSAlexander Kabaev        *  parameters, which are specific to the implementation.
1321b86b14eSAlexander Kabaev       */
13300db7afdSDavid E. O'Brien       typedef _CharT 					char_type;
13400db7afdSDavid E. O'Brien       typedef _Traits 					traits_type;
13500db7afdSDavid E. O'Brien       typedef typename traits_type::int_type 		int_type;
13600db7afdSDavid E. O'Brien       typedef typename traits_type::pos_type 		pos_type;
13700db7afdSDavid E. O'Brien       typedef typename traits_type::off_type 		off_type;
1381b86b14eSAlexander Kabaev       //@}
13900db7afdSDavid E. O'Brien 
1401b86b14eSAlexander Kabaev       //@{
1411b86b14eSAlexander Kabaev       /**
1421b86b14eSAlexander Kabaev        *  @if maint
143ffeaf689SAlexander Kabaev        *  This is a non-standard type.
1441b86b14eSAlexander Kabaev        *  @endif
1451b86b14eSAlexander Kabaev       */
14600db7afdSDavid E. O'Brien       typedef basic_streambuf<char_type, traits_type>  	__streambuf_type;
1471b86b14eSAlexander Kabaev       //@}
14800db7afdSDavid E. O'Brien 
14900db7afdSDavid E. O'Brien       friend class basic_ios<char_type, traits_type>;
15000db7afdSDavid E. O'Brien       friend class basic_istream<char_type, traits_type>;
15100db7afdSDavid E. O'Brien       friend class basic_ostream<char_type, traits_type>;
15200db7afdSDavid E. O'Brien       friend class istreambuf_iterator<char_type, traits_type>;
15300db7afdSDavid E. O'Brien       friend class ostreambuf_iterator<char_type, traits_type>;
15400db7afdSDavid E. O'Brien 
15500db7afdSDavid E. O'Brien       friend streamsize
156*f8a1b7d9SAlexander Kabaev       __copy_streambufs_eof<>(__streambuf_type*, __streambuf_type*, bool&);
157*f8a1b7d9SAlexander Kabaev 
158*f8a1b7d9SAlexander Kabaev       template<typename _CharT2>
159*f8a1b7d9SAlexander Kabaev         friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
160*f8a1b7d9SAlexander Kabaev 					       _CharT2*>::__type
161*f8a1b7d9SAlexander Kabaev         __copy_aux(istreambuf_iterator<_CharT2>,
162*f8a1b7d9SAlexander Kabaev 		   istreambuf_iterator<_CharT2>, _CharT2*);
163*f8a1b7d9SAlexander Kabaev 
164*f8a1b7d9SAlexander Kabaev       template<typename _CharT2>
165*f8a1b7d9SAlexander Kabaev         friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
166*f8a1b7d9SAlexander Kabaev 				  istreambuf_iterator<_CharT2> >::__type
167*f8a1b7d9SAlexander Kabaev         find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
168*f8a1b7d9SAlexander Kabaev 	     const _CharT2&);
169*f8a1b7d9SAlexander Kabaev 
170*f8a1b7d9SAlexander Kabaev       template<typename _CharT2, typename _Traits2>
171*f8a1b7d9SAlexander Kabaev         friend basic_istream<_CharT2, _Traits2>&
172*f8a1b7d9SAlexander Kabaev         operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*);
173*f8a1b7d9SAlexander Kabaev 
174*f8a1b7d9SAlexander Kabaev       template<typename _CharT2, typename _Traits2, typename _Alloc>
175*f8a1b7d9SAlexander Kabaev         friend basic_istream<_CharT2, _Traits2>&
176*f8a1b7d9SAlexander Kabaev         operator>>(basic_istream<_CharT2, _Traits2>&,
177*f8a1b7d9SAlexander Kabaev 		   basic_string<_CharT2, _Traits2, _Alloc>&);
178*f8a1b7d9SAlexander Kabaev 
179*f8a1b7d9SAlexander Kabaev       template<typename _CharT2, typename _Traits2, typename _Alloc>
180*f8a1b7d9SAlexander Kabaev         friend basic_istream<_CharT2, _Traits2>&
181*f8a1b7d9SAlexander Kabaev         getline(basic_istream<_CharT2, _Traits2>&,
182*f8a1b7d9SAlexander Kabaev 		basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2);
18300db7afdSDavid E. O'Brien 
18400db7afdSDavid E. O'Brien     protected:
1851b86b14eSAlexander Kabaev       //@{
1861b86b14eSAlexander Kabaev       /**
1871b86b14eSAlexander Kabaev        *  @if maint
1881b86b14eSAlexander Kabaev        *  This is based on _IO_FILE, just reordered to be more consistent,
1891b86b14eSAlexander Kabaev        *  and is intended to be the most minimal abstraction for an
1901b86b14eSAlexander Kabaev        *  internal buffer.
1911b86b14eSAlexander Kabaev        *  -  get == input == read
1921b86b14eSAlexander Kabaev        *  -  put == output == write
1931b86b14eSAlexander Kabaev        *  @endif
1941b86b14eSAlexander Kabaev       */
19500db7afdSDavid E. O'Brien       char_type* 		_M_in_beg;     // Start of get area.
19600db7afdSDavid E. O'Brien       char_type* 		_M_in_cur;     // Current read area.
19700db7afdSDavid E. O'Brien       char_type* 		_M_in_end;     // End of get area.
19800db7afdSDavid E. O'Brien       char_type* 		_M_out_beg;    // Start of put area.
19900db7afdSDavid E. O'Brien       char_type* 		_M_out_cur;    // Current put area.
20000db7afdSDavid E. O'Brien       char_type* 		_M_out_end;    // End of put area.
20100db7afdSDavid E. O'Brien 
2021b86b14eSAlexander Kabaev       /**
2031b86b14eSAlexander Kabaev        *  @if maint
2041b86b14eSAlexander Kabaev        *  Current locale setting.
2051b86b14eSAlexander Kabaev        *  @endif
2061b86b14eSAlexander Kabaev       */
20700db7afdSDavid E. O'Brien       locale 			_M_buf_locale;
20800db7afdSDavid E. O'Brien 
20900db7afdSDavid E. O'Brien   public:
2101b86b14eSAlexander Kabaev       /// Destructor deallocates no buffer space.
21100db7afdSDavid E. O'Brien       virtual
~basic_streambuf()21200db7afdSDavid E. O'Brien       ~basic_streambuf()
213ffeaf689SAlexander Kabaev       { }
21400db7afdSDavid E. O'Brien 
2151b86b14eSAlexander Kabaev       // [27.5.2.2.1] locales
2161b86b14eSAlexander Kabaev       /**
2171b86b14eSAlexander Kabaev        *  @brief  Entry point for imbue().
2181b86b14eSAlexander Kabaev        *  @param  loc  The new locale.
2191b86b14eSAlexander Kabaev        *  @return  The previous locale.
2201b86b14eSAlexander Kabaev        *
2211b86b14eSAlexander Kabaev        *  Calls the derived imbue(loc).
2221b86b14eSAlexander Kabaev       */
22300db7afdSDavid E. O'Brien       locale
pubimbue(const locale & __loc)22400db7afdSDavid E. O'Brien       pubimbue(const locale &__loc)
22500db7afdSDavid E. O'Brien       {
22600db7afdSDavid E. O'Brien 	locale __tmp(this->getloc());
22700db7afdSDavid E. O'Brien 	this->imbue(__loc);
228ffeaf689SAlexander Kabaev 	_M_buf_locale = __loc;
22900db7afdSDavid E. O'Brien 	return __tmp;
23000db7afdSDavid E. O'Brien       }
23100db7afdSDavid E. O'Brien 
2321b86b14eSAlexander Kabaev       /**
2331b86b14eSAlexander Kabaev        *  @brief  Locale access.
2341b86b14eSAlexander Kabaev        *  @return  The current locale in effect.
2351b86b14eSAlexander Kabaev        *
2361b86b14eSAlexander Kabaev        *  If pubimbue(loc) has been called, then the most recent @c loc
2371b86b14eSAlexander Kabaev        *  is returned.  Otherwise the global locale in effect at the time
2381b86b14eSAlexander Kabaev        *  of construction is returned.
2391b86b14eSAlexander Kabaev       */
24000db7afdSDavid E. O'Brien       locale
getloc()24100db7afdSDavid E. O'Brien       getloc() const
24261e268fbSAlexander Kabaev       { return _M_buf_locale; }
24300db7afdSDavid E. O'Brien 
2441b86b14eSAlexander Kabaev       // [27.5.2.2.2] buffer management and positioning
2451b86b14eSAlexander Kabaev       //@{
2461b86b14eSAlexander Kabaev       /**
2471b86b14eSAlexander Kabaev        *  @brief  Entry points for derived buffer functions.
2481b86b14eSAlexander Kabaev        *
2491b86b14eSAlexander Kabaev        *  The public versions of @c pubfoo dispatch to the protected
2501b86b14eSAlexander Kabaev        *  derived @c foo member functions, passing the arguments (if any)
2511b86b14eSAlexander Kabaev        *  and returning the result unchanged.
2521b86b14eSAlexander Kabaev       */
25300db7afdSDavid E. O'Brien       __streambuf_type*
pubsetbuf(char_type * __s,streamsize __n)25400db7afdSDavid E. O'Brien       pubsetbuf(char_type* __s, streamsize __n)
25500db7afdSDavid E. O'Brien       { return this->setbuf(__s, __n); }
25600db7afdSDavid E. O'Brien 
25700db7afdSDavid E. O'Brien       pos_type
25800db7afdSDavid E. O'Brien       pubseekoff(off_type __off, ios_base::seekdir __way,
25900db7afdSDavid E. O'Brien 		 ios_base::openmode __mode = ios_base::in | ios_base::out)
26000db7afdSDavid E. O'Brien       { return this->seekoff(__off, __way, __mode); }
26100db7afdSDavid E. O'Brien 
26200db7afdSDavid E. O'Brien       pos_type
26300db7afdSDavid E. O'Brien       pubseekpos(pos_type __sp,
26400db7afdSDavid E. O'Brien 		 ios_base::openmode __mode = ios_base::in | ios_base::out)
26500db7afdSDavid E. O'Brien       { return this->seekpos(__sp, __mode); }
26600db7afdSDavid E. O'Brien 
26700db7afdSDavid E. O'Brien       int
pubsync()26800db7afdSDavid E. O'Brien       pubsync() { return this->sync(); }
2691b86b14eSAlexander Kabaev       //@}
27000db7afdSDavid E. O'Brien 
2711b86b14eSAlexander Kabaev       // [27.5.2.2.3] get area
2721b86b14eSAlexander Kabaev       /**
2731b86b14eSAlexander Kabaev        *  @brief  Looking ahead into the stream.
2741b86b14eSAlexander Kabaev        *  @return  The number of characters available.
2751b86b14eSAlexander Kabaev        *
2761b86b14eSAlexander Kabaev        *  If a read position is available, returns the number of characters
2771b86b14eSAlexander Kabaev        *  available for reading before the buffer must be refilled.
2781b86b14eSAlexander Kabaev        *  Otherwise returns the derived @c showmanyc().
2791b86b14eSAlexander Kabaev       */
28000db7afdSDavid E. O'Brien       streamsize
in_avail()28100db7afdSDavid E. O'Brien       in_avail()
28200db7afdSDavid E. O'Brien       {
283ffeaf689SAlexander Kabaev 	const streamsize __ret = this->egptr() - this->gptr();
284ffeaf689SAlexander Kabaev 	return __ret ? __ret : this->showmanyc();
28500db7afdSDavid E. O'Brien       }
28600db7afdSDavid E. O'Brien 
2871b86b14eSAlexander Kabaev       /**
2881b86b14eSAlexander Kabaev        *  @brief  Getting the next character.
2891b86b14eSAlexander Kabaev        *  @return  The next character, or eof.
2901b86b14eSAlexander Kabaev        *
2911b86b14eSAlexander Kabaev        *  Calls @c sbumpc(), and if that function returns
2921b86b14eSAlexander Kabaev        *  @c traits::eof(), so does this function.  Otherwise, @c sgetc().
2931b86b14eSAlexander Kabaev       */
29400db7afdSDavid E. O'Brien       int_type
snextc()29500db7afdSDavid E. O'Brien       snextc()
29600db7afdSDavid E. O'Brien       {
297ffeaf689SAlexander Kabaev 	int_type __ret = traits_type::eof();
298ffeaf689SAlexander Kabaev 	if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(),
299ffeaf689SAlexander Kabaev 						       __ret), true))
300ffeaf689SAlexander Kabaev 	  __ret = this->sgetc();
301ffeaf689SAlexander Kabaev 	return __ret;
30200db7afdSDavid E. O'Brien       }
30300db7afdSDavid E. O'Brien 
3041b86b14eSAlexander Kabaev       /**
3051b86b14eSAlexander Kabaev        *  @brief  Getting the next character.
3061b86b14eSAlexander Kabaev        *  @return  The next character, or eof.
3071b86b14eSAlexander Kabaev        *
3081b86b14eSAlexander Kabaev        *  If the input read position is available, returns that character
3091b86b14eSAlexander Kabaev        *  and increments the read pointer, otherwise calls and returns
3101b86b14eSAlexander Kabaev        *  @c uflow().
3111b86b14eSAlexander Kabaev       */
31200db7afdSDavid E. O'Brien       int_type
sbumpc()313ffeaf689SAlexander Kabaev       sbumpc()
314ffeaf689SAlexander Kabaev       {
315ffeaf689SAlexander Kabaev 	int_type __ret;
316ffeaf689SAlexander Kabaev 	if (__builtin_expect(this->gptr() < this->egptr(), true))
317ffeaf689SAlexander Kabaev 	  {
318ffeaf689SAlexander Kabaev 	    __ret = traits_type::to_int_type(*this->gptr());
319ffeaf689SAlexander Kabaev 	    this->gbump(1);
320ffeaf689SAlexander Kabaev 	  }
321ffeaf689SAlexander Kabaev 	else
322ffeaf689SAlexander Kabaev 	  __ret = this->uflow();
323ffeaf689SAlexander Kabaev 	return __ret;
324ffeaf689SAlexander Kabaev       }
32500db7afdSDavid E. O'Brien 
3261b86b14eSAlexander Kabaev       /**
3271b86b14eSAlexander Kabaev        *  @brief  Getting the next character.
3281b86b14eSAlexander Kabaev        *  @return  The next character, or eof.
3291b86b14eSAlexander Kabaev        *
3301b86b14eSAlexander Kabaev        *  If the input read position is available, returns that character,
3311b86b14eSAlexander Kabaev        *  otherwise calls and returns @c underflow().  Does not move the
3321b86b14eSAlexander Kabaev        *  read position after fetching the character.
3331b86b14eSAlexander Kabaev       */
33400db7afdSDavid E. O'Brien       int_type
sgetc()33500db7afdSDavid E. O'Brien       sgetc()
33600db7afdSDavid E. O'Brien       {
33700db7afdSDavid E. O'Brien 	int_type __ret;
338ffeaf689SAlexander Kabaev 	if (__builtin_expect(this->gptr() < this->egptr(), true))
339ffeaf689SAlexander Kabaev 	  __ret = traits_type::to_int_type(*this->gptr());
34000db7afdSDavid E. O'Brien 	else
34100db7afdSDavid E. O'Brien 	  __ret = this->underflow();
34200db7afdSDavid E. O'Brien 	return __ret;
34300db7afdSDavid E. O'Brien       }
34400db7afdSDavid E. O'Brien 
3451b86b14eSAlexander Kabaev       /**
3461b86b14eSAlexander Kabaev        *  @brief  Entry point for xsgetn.
3471b86b14eSAlexander Kabaev        *  @param  s  A buffer area.
3481b86b14eSAlexander Kabaev        *  @param  n  A count.
3491b86b14eSAlexander Kabaev        *
3501b86b14eSAlexander Kabaev        *  Returns xsgetn(s,n).  The effect is to fill @a s[0] through
3511b86b14eSAlexander Kabaev        *  @a s[n-1] with characters from the input sequence, if possible.
3521b86b14eSAlexander Kabaev       */
35300db7afdSDavid E. O'Brien       streamsize
sgetn(char_type * __s,streamsize __n)35400db7afdSDavid E. O'Brien       sgetn(char_type* __s, streamsize __n)
35500db7afdSDavid E. O'Brien       { return this->xsgetn(__s, __n); }
35600db7afdSDavid E. O'Brien 
3571b86b14eSAlexander Kabaev       // [27.5.2.2.4] putback
3581b86b14eSAlexander Kabaev       /**
3591b86b14eSAlexander Kabaev        *  @brief  Pushing characters back into the input stream.
3601b86b14eSAlexander Kabaev        *  @param  c  The character to push back.
3611b86b14eSAlexander Kabaev        *  @return  The previous character, if possible.
3621b86b14eSAlexander Kabaev        *
3631b86b14eSAlexander Kabaev        *  Similar to sungetc(), but @a c is pushed onto the stream instead
3641b86b14eSAlexander Kabaev        *  of "the previous character".  If successful, the next character
3651b86b14eSAlexander Kabaev        *  fetched from the input stream will be @a c.
3661b86b14eSAlexander Kabaev       */
36700db7afdSDavid E. O'Brien       int_type
sputbackc(char_type __c)368ffeaf689SAlexander Kabaev       sputbackc(char_type __c)
369ffeaf689SAlexander Kabaev       {
370ffeaf689SAlexander Kabaev 	int_type __ret;
371ffeaf689SAlexander Kabaev 	const bool __testpos = this->eback() < this->gptr();
372ffeaf689SAlexander Kabaev 	if (__builtin_expect(!__testpos ||
373ffeaf689SAlexander Kabaev 			     !traits_type::eq(__c, this->gptr()[-1]), false))
374ffeaf689SAlexander Kabaev 	  __ret = this->pbackfail(traits_type::to_int_type(__c));
375ffeaf689SAlexander Kabaev 	else
376ffeaf689SAlexander Kabaev 	  {
377ffeaf689SAlexander Kabaev 	    this->gbump(-1);
378ffeaf689SAlexander Kabaev 	    __ret = traits_type::to_int_type(*this->gptr());
379ffeaf689SAlexander Kabaev 	  }
380ffeaf689SAlexander Kabaev 	return __ret;
381ffeaf689SAlexander Kabaev       }
38200db7afdSDavid E. O'Brien 
3831b86b14eSAlexander Kabaev       /**
3841b86b14eSAlexander Kabaev        *  @brief  Moving backwards in the input stream.
3851b86b14eSAlexander Kabaev        *  @return  The previous character, if possible.
3861b86b14eSAlexander Kabaev        *
3871b86b14eSAlexander Kabaev        *  If a putback position is available, this function decrements the
3881b86b14eSAlexander Kabaev        *  input pointer and returns that character.  Otherwise, calls and
3891b86b14eSAlexander Kabaev        *  returns pbackfail().  The effect is to "unget" the last character
3901b86b14eSAlexander Kabaev        *  "gotten".
3911b86b14eSAlexander Kabaev       */
39200db7afdSDavid E. O'Brien       int_type
sungetc()393ffeaf689SAlexander Kabaev       sungetc()
394ffeaf689SAlexander Kabaev       {
395ffeaf689SAlexander Kabaev 	int_type __ret;
396ffeaf689SAlexander Kabaev 	if (__builtin_expect(this->eback() < this->gptr(), true))
397ffeaf689SAlexander Kabaev 	  {
398ffeaf689SAlexander Kabaev 	    this->gbump(-1);
399ffeaf689SAlexander Kabaev 	    __ret = traits_type::to_int_type(*this->gptr());
400ffeaf689SAlexander Kabaev 	  }
401ffeaf689SAlexander Kabaev 	else
402ffeaf689SAlexander Kabaev 	  __ret = this->pbackfail();
403ffeaf689SAlexander Kabaev 	return __ret;
404ffeaf689SAlexander Kabaev       }
40500db7afdSDavid E. O'Brien 
4061b86b14eSAlexander Kabaev       // [27.5.2.2.5] put area
4071b86b14eSAlexander Kabaev       /**
4081b86b14eSAlexander Kabaev        *  @brief  Entry point for all single-character output functions.
4091b86b14eSAlexander Kabaev        *  @param  c  A character to output.
4101b86b14eSAlexander Kabaev        *  @return  @a c, if possible.
4111b86b14eSAlexander Kabaev        *
4121b86b14eSAlexander Kabaev        *  One of two public output functions.
4131b86b14eSAlexander Kabaev        *
4141b86b14eSAlexander Kabaev        *  If a write position is available for the output sequence (i.e.,
4151b86b14eSAlexander Kabaev        *  the buffer is not full), stores @a c in that position, increments
4161b86b14eSAlexander Kabaev        *  the position, and returns @c traits::to_int_type(c).  If a write
4171b86b14eSAlexander Kabaev        *  position is not available, returns @c overflow(c).
4181b86b14eSAlexander Kabaev       */
41900db7afdSDavid E. O'Brien       int_type
sputc(char_type __c)420ffeaf689SAlexander Kabaev       sputc(char_type __c)
421ffeaf689SAlexander Kabaev       {
422ffeaf689SAlexander Kabaev 	int_type __ret;
423ffeaf689SAlexander Kabaev 	if (__builtin_expect(this->pptr() < this->epptr(), true))
424ffeaf689SAlexander Kabaev 	  {
425ffeaf689SAlexander Kabaev 	    *this->pptr() = __c;
426ffeaf689SAlexander Kabaev 	    this->pbump(1);
427ffeaf689SAlexander Kabaev 	    __ret = traits_type::to_int_type(__c);
428ffeaf689SAlexander Kabaev 	  }
429ffeaf689SAlexander Kabaev 	else
430ffeaf689SAlexander Kabaev 	  __ret = this->overflow(traits_type::to_int_type(__c));
431ffeaf689SAlexander Kabaev 	return __ret;
432ffeaf689SAlexander Kabaev       }
43300db7afdSDavid E. O'Brien 
4341b86b14eSAlexander Kabaev       /**
4351b86b14eSAlexander Kabaev        *  @brief  Entry point for all single-character output functions.
4361b86b14eSAlexander Kabaev        *  @param  s  A buffer read area.
4371b86b14eSAlexander Kabaev        *  @param  n  A count.
4381b86b14eSAlexander Kabaev        *
4391b86b14eSAlexander Kabaev        *  One of two public output functions.
4401b86b14eSAlexander Kabaev        *
4411b86b14eSAlexander Kabaev        *
4421b86b14eSAlexander Kabaev        *  Returns xsputn(s,n).  The effect is to write @a s[0] through
4431b86b14eSAlexander Kabaev        *  @a s[n-1] to the output sequence, if possible.
4441b86b14eSAlexander Kabaev       */
44500db7afdSDavid E. O'Brien       streamsize
sputn(const char_type * __s,streamsize __n)44600db7afdSDavid E. O'Brien       sputn(const char_type* __s, streamsize __n)
44700db7afdSDavid E. O'Brien       { return this->xsputn(__s, __n); }
44800db7afdSDavid E. O'Brien 
44900db7afdSDavid E. O'Brien     protected:
4501b86b14eSAlexander Kabaev       /**
4511b86b14eSAlexander Kabaev        *  @brief  Base constructor.
4521b86b14eSAlexander Kabaev        *
4531b86b14eSAlexander Kabaev        *  Only called from derived constructors, and sets up all the
4541b86b14eSAlexander Kabaev        *  buffer data to zero, including the pointers described in the
4551b86b14eSAlexander Kabaev        *  basic_streambuf class description.  Note that, as a result,
4561b86b14eSAlexander Kabaev        *  - the class starts with no read nor write positions available,
4571b86b14eSAlexander Kabaev        *  - this is not an error
4581b86b14eSAlexander Kabaev       */
basic_streambuf()45900db7afdSDavid E. O'Brien       basic_streambuf()
460ffeaf689SAlexander Kabaev       : _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
461ca6500fcSAlexander Kabaev       _M_out_beg(0), _M_out_cur(0), _M_out_end(0),
462ffeaf689SAlexander Kabaev       _M_buf_locale(locale())
46300db7afdSDavid E. O'Brien       { }
46400db7afdSDavid E. O'Brien 
4651b86b14eSAlexander Kabaev       // [27.5.2.3.1] get area access
4661b86b14eSAlexander Kabaev       //@{
4671b86b14eSAlexander Kabaev       /**
4681b86b14eSAlexander Kabaev        *  @brief  Access to the get area.
4691b86b14eSAlexander Kabaev        *
4701b86b14eSAlexander Kabaev        *  These functions are only available to other protected functions,
4711b86b14eSAlexander Kabaev        *  including derived classes.
4721b86b14eSAlexander Kabaev        *
4731b86b14eSAlexander Kabaev        *  - eback() returns the beginning pointer for the input sequence
4741b86b14eSAlexander Kabaev        *  - gptr() returns the next pointer for the input sequence
4751b86b14eSAlexander Kabaev        *  - egptr() returns the end pointer for the input sequence
4761b86b14eSAlexander Kabaev       */
47700db7afdSDavid E. O'Brien       char_type*
eback()47800db7afdSDavid E. O'Brien       eback() const { return _M_in_beg; }
47900db7afdSDavid E. O'Brien 
48000db7afdSDavid E. O'Brien       char_type*
gptr()48100db7afdSDavid E. O'Brien       gptr()  const { return _M_in_cur;  }
48200db7afdSDavid E. O'Brien 
48300db7afdSDavid E. O'Brien       char_type*
egptr()48400db7afdSDavid E. O'Brien       egptr() const { return _M_in_end; }
4851b86b14eSAlexander Kabaev       //@}
48600db7afdSDavid E. O'Brien 
4871b86b14eSAlexander Kabaev       /**
4881b86b14eSAlexander Kabaev        *  @brief  Moving the read position.
4891b86b14eSAlexander Kabaev        *  @param  n  The delta by which to move.
4901b86b14eSAlexander Kabaev        *
4911b86b14eSAlexander Kabaev        *  This just advances the read position without returning any data.
4921b86b14eSAlexander Kabaev       */
49300db7afdSDavid E. O'Brien       void
gbump(int __n)49400db7afdSDavid E. O'Brien       gbump(int __n) { _M_in_cur += __n; }
49500db7afdSDavid E. O'Brien 
4961b86b14eSAlexander Kabaev       /**
4971b86b14eSAlexander Kabaev        *  @brief  Setting the three read area pointers.
4981b86b14eSAlexander Kabaev        *  @param  gbeg  A pointer.
4991b86b14eSAlexander Kabaev        *  @param  gnext  A pointer.
5001b86b14eSAlexander Kabaev        *  @param  gend  A pointer.
5011b86b14eSAlexander Kabaev        *  @post  @a gbeg == @c eback(), @a gnext == @c gptr(), and
5021b86b14eSAlexander Kabaev        *         @a gend == @c egptr()
5031b86b14eSAlexander Kabaev       */
50400db7afdSDavid E. O'Brien       void
setg(char_type * __gbeg,char_type * __gnext,char_type * __gend)50500db7afdSDavid E. O'Brien       setg(char_type* __gbeg, char_type* __gnext, char_type* __gend)
50600db7afdSDavid E. O'Brien       {
50700db7afdSDavid E. O'Brien 	_M_in_beg = __gbeg;
50800db7afdSDavid E. O'Brien 	_M_in_cur = __gnext;
50900db7afdSDavid E. O'Brien 	_M_in_end = __gend;
51000db7afdSDavid E. O'Brien       }
51100db7afdSDavid E. O'Brien 
5121b86b14eSAlexander Kabaev       // [27.5.2.3.2] put area access
5131b86b14eSAlexander Kabaev       //@{
5141b86b14eSAlexander Kabaev       /**
5151b86b14eSAlexander Kabaev        *  @brief  Access to the put area.
5161b86b14eSAlexander Kabaev        *
5171b86b14eSAlexander Kabaev        *  These functions are only available to other protected functions,
5181b86b14eSAlexander Kabaev        *  including derived classes.
5191b86b14eSAlexander Kabaev        *
5201b86b14eSAlexander Kabaev        *  - pbase() returns the beginning pointer for the output sequence
5211b86b14eSAlexander Kabaev        *  - pptr() returns the next pointer for the output sequence
5221b86b14eSAlexander Kabaev        *  - epptr() returns the end pointer for the output sequence
5231b86b14eSAlexander Kabaev       */
52400db7afdSDavid E. O'Brien       char_type*
pbase()52500db7afdSDavid E. O'Brien       pbase() const { return _M_out_beg; }
52600db7afdSDavid E. O'Brien 
52700db7afdSDavid E. O'Brien       char_type*
pptr()52800db7afdSDavid E. O'Brien       pptr() const { return _M_out_cur; }
52900db7afdSDavid E. O'Brien 
53000db7afdSDavid E. O'Brien       char_type*
epptr()53100db7afdSDavid E. O'Brien       epptr() const { return _M_out_end; }
5321b86b14eSAlexander Kabaev       //@}
53300db7afdSDavid E. O'Brien 
5341b86b14eSAlexander Kabaev       /**
5351b86b14eSAlexander Kabaev        *  @brief  Moving the write position.
5361b86b14eSAlexander Kabaev        *  @param  n  The delta by which to move.
5371b86b14eSAlexander Kabaev        *
5381b86b14eSAlexander Kabaev        *  This just advances the write position without returning any data.
5391b86b14eSAlexander Kabaev       */
54000db7afdSDavid E. O'Brien       void
pbump(int __n)54100db7afdSDavid E. O'Brien       pbump(int __n) { _M_out_cur += __n; }
54200db7afdSDavid E. O'Brien 
5431b86b14eSAlexander Kabaev       /**
5441b86b14eSAlexander Kabaev        *  @brief  Setting the three write area pointers.
5451b86b14eSAlexander Kabaev        *  @param  pbeg  A pointer.
5461b86b14eSAlexander Kabaev        *  @param  pend  A pointer.
5471b86b14eSAlexander Kabaev        *  @post  @a pbeg == @c pbase(), @a pbeg == @c pptr(), and
5481b86b14eSAlexander Kabaev        *         @a pend == @c epptr()
5491b86b14eSAlexander Kabaev       */
55000db7afdSDavid E. O'Brien       void
setp(char_type * __pbeg,char_type * __pend)55100db7afdSDavid E. O'Brien       setp(char_type* __pbeg, char_type* __pend)
55200db7afdSDavid E. O'Brien       {
55300db7afdSDavid E. O'Brien 	_M_out_beg = _M_out_cur = __pbeg;
55400db7afdSDavid E. O'Brien 	_M_out_end = __pend;
55500db7afdSDavid E. O'Brien       }
55600db7afdSDavid E. O'Brien 
5571b86b14eSAlexander Kabaev       // [27.5.2.4] virtual functions
5581b86b14eSAlexander Kabaev       // [27.5.2.4.1] locales
5591b86b14eSAlexander Kabaev       /**
5601b86b14eSAlexander Kabaev        *  @brief  Changes translations.
5611b86b14eSAlexander Kabaev        *  @param  loc  A new locale.
5621b86b14eSAlexander Kabaev        *
5631b86b14eSAlexander Kabaev        *  Translations done during I/O which depend on the current locale
5641b86b14eSAlexander Kabaev        *  are changed by this call.  The standard adds, "Between invocations
5651b86b14eSAlexander Kabaev        *  of this function a class derived from streambuf can safely cache
5661b86b14eSAlexander Kabaev        *  results of calls to locale functions and to members of facets
567ffeaf689SAlexander Kabaev        *  so obtained."
568ffeaf689SAlexander Kabaev        *
569ffeaf689SAlexander Kabaev        *  @note  Base class version does nothing.
5701b86b14eSAlexander Kabaev       */
57100db7afdSDavid E. O'Brien       virtual void
imbue(const locale &)572ffeaf689SAlexander Kabaev       imbue(const locale&)
573ffeaf689SAlexander Kabaev       { }
57400db7afdSDavid E. O'Brien 
5751b86b14eSAlexander Kabaev       // [27.5.2.4.2] buffer management and positioning
5761b86b14eSAlexander Kabaev       /**
5771b86b14eSAlexander Kabaev        *  @brief  Maniuplates the buffer.
5781b86b14eSAlexander Kabaev        *
5791b86b14eSAlexander Kabaev        *  Each derived class provides its own appropriate behavior.  See
5801b86b14eSAlexander Kabaev        *  the next-to-last paragraph of
5811b86b14eSAlexander Kabaev        *  http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#2 for
5821b86b14eSAlexander Kabaev        *  more on this function.
5831b86b14eSAlexander Kabaev        *
5841b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns @c this.
5851b86b14eSAlexander Kabaev       */
58600db7afdSDavid E. O'Brien       virtual basic_streambuf<char_type,_Traits>*
setbuf(char_type *,streamsize)58700db7afdSDavid E. O'Brien       setbuf(char_type*, streamsize)
58800db7afdSDavid E. O'Brien       {	return this; }
58900db7afdSDavid E. O'Brien 
5901b86b14eSAlexander Kabaev       /**
5911b86b14eSAlexander Kabaev        *  @brief  Alters the stream positions.
5921b86b14eSAlexander Kabaev        *
5931b86b14eSAlexander Kabaev        *  Each derived class provides its own appropriate behavior.
5941b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns a @c pos_type
5951b86b14eSAlexander Kabaev        *         that represents an invalid stream position.
5961b86b14eSAlexander Kabaev       */
59700db7afdSDavid E. O'Brien       virtual pos_type
59800db7afdSDavid E. O'Brien       seekoff(off_type, ios_base::seekdir,
59900db7afdSDavid E. O'Brien 	      ios_base::openmode /*__mode*/ = ios_base::in | ios_base::out)
60000db7afdSDavid E. O'Brien       { return pos_type(off_type(-1)); }
60100db7afdSDavid E. O'Brien 
6021b86b14eSAlexander Kabaev       /**
6031b86b14eSAlexander Kabaev        *  @brief  Alters the stream positions.
6041b86b14eSAlexander Kabaev        *
6051b86b14eSAlexander Kabaev        *  Each derived class provides its own appropriate behavior.
6061b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns a @c pos_type
6071b86b14eSAlexander Kabaev        *         that represents an invalid stream position.
6081b86b14eSAlexander Kabaev       */
60900db7afdSDavid E. O'Brien       virtual pos_type
61000db7afdSDavid E. O'Brien       seekpos(pos_type,
61100db7afdSDavid E. O'Brien 	      ios_base::openmode /*__mode*/ = ios_base::in | ios_base::out)
61200db7afdSDavid E. O'Brien       { return pos_type(off_type(-1)); }
61300db7afdSDavid E. O'Brien 
6141b86b14eSAlexander Kabaev       /**
6151b86b14eSAlexander Kabaev        *  @brief  Synchronizes the buffer arrays with the controlled sequences.
6161b86b14eSAlexander Kabaev        *  @return  -1 on failure.
6171b86b14eSAlexander Kabaev        *
6181b86b14eSAlexander Kabaev        *  Each derived class provides its own appropriate behavior,
6191b86b14eSAlexander Kabaev        *  including the definition of "failure".
6201b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns zero.
6211b86b14eSAlexander Kabaev       */
62200db7afdSDavid E. O'Brien       virtual int
sync()62300db7afdSDavid E. O'Brien       sync() { return 0; }
62400db7afdSDavid E. O'Brien 
6251b86b14eSAlexander Kabaev       // [27.5.2.4.3] get area
6261b86b14eSAlexander Kabaev       /**
6271b86b14eSAlexander Kabaev        *  @brief  Investigating the data available.
6281b86b14eSAlexander Kabaev        *  @return  An estimate of the number of characters available in the
6291b86b14eSAlexander Kabaev        *           input sequence, or -1.
6301b86b14eSAlexander Kabaev        *
6311b86b14eSAlexander Kabaev        *  "If it returns a positive value, then successive calls to
6321b86b14eSAlexander Kabaev        *  @c underflow() will not return @c traits::eof() until at least that
6331b86b14eSAlexander Kabaev        *  number of characters have been supplied.  If @c showmanyc()
6341b86b14eSAlexander Kabaev        *  returns -1, then calls to @c underflow() or @c uflow() will fail."
6351b86b14eSAlexander Kabaev        *  [27.5.2.4.3]/1
6361b86b14eSAlexander Kabaev        *
6371b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns zero.
6381b86b14eSAlexander Kabaev        *  @note  The standard adds that "the intention is not only that the
6391b86b14eSAlexander Kabaev        *         calls [to underflow or uflow] will not return @c eof() but
6401b86b14eSAlexander Kabaev        *         that they will return "immediately".
6411b86b14eSAlexander Kabaev        *  @note  The standard adds that "the morphemes of @c showmanyc are
6421b86b14eSAlexander Kabaev        *         "es-how-many-see", not "show-manic".
6431b86b14eSAlexander Kabaev       */
64400db7afdSDavid E. O'Brien       virtual streamsize
showmanyc()64500db7afdSDavid E. O'Brien       showmanyc() { return 0; }
64600db7afdSDavid E. O'Brien 
6471b86b14eSAlexander Kabaev       /**
6481b86b14eSAlexander Kabaev        *  @brief  Multiple character extraction.
6491b86b14eSAlexander Kabaev        *  @param  s  A buffer area.
6501b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to assign.
6511b86b14eSAlexander Kabaev        *  @return  The number of characters assigned.
6521b86b14eSAlexander Kabaev        *
6531b86b14eSAlexander Kabaev        *  Fills @a s[0] through @a s[n-1] with characters from the input
6541b86b14eSAlexander Kabaev        *  sequence, as if by @c sbumpc().  Stops when either @a n characters
6551b86b14eSAlexander Kabaev        *  have been copied, or when @c traits::eof() would be copied.
6561b86b14eSAlexander Kabaev        *
6571b86b14eSAlexander Kabaev        *  It is expected that derived classes provide a more efficient
6581b86b14eSAlexander Kabaev        *  implementation by overriding this definition.
6591b86b14eSAlexander Kabaev       */
66000db7afdSDavid E. O'Brien       virtual streamsize
66100db7afdSDavid E. O'Brien       xsgetn(char_type* __s, streamsize __n);
66200db7afdSDavid E. O'Brien 
6631b86b14eSAlexander Kabaev       /**
6641b86b14eSAlexander Kabaev        *  @brief  Fetches more data from the controlled sequence.
6651b86b14eSAlexander Kabaev        *  @return  The first character from the <em>pending sequence</em>.
6661b86b14eSAlexander Kabaev        *
6671b86b14eSAlexander Kabaev        *  Informally, this function is called when the input buffer is
6681b86b14eSAlexander Kabaev        *  exhausted (or does not exist, as buffering need not actually be
6691b86b14eSAlexander Kabaev        *  done).  If a buffer exists, it is "refilled".  In either case, the
6701b86b14eSAlexander Kabaev        *  next available character is returned, or @c traits::eof() to
6711b86b14eSAlexander Kabaev        *  indicate a null pending sequence.
6721b86b14eSAlexander Kabaev        *
6731b86b14eSAlexander Kabaev        *  For a formal definiton of the pending sequence, see a good text
6741b86b14eSAlexander Kabaev        *  such as Langer & Kreft, or [27.5.2.4.3]/7-14.
6751b86b14eSAlexander Kabaev        *
6761b86b14eSAlexander Kabaev        *  A functioning input streambuf can be created by overriding only
6771b86b14eSAlexander Kabaev        *  this function (no buffer area will be used).  For an example, see
6781b86b14eSAlexander Kabaev        *  http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#6
6791b86b14eSAlexander Kabaev        *
6801b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns eof().
6811b86b14eSAlexander Kabaev       */
68200db7afdSDavid E. O'Brien       virtual int_type
underflow()68300db7afdSDavid E. O'Brien       underflow()
68400db7afdSDavid E. O'Brien       { return traits_type::eof(); }
68500db7afdSDavid E. O'Brien 
6861b86b14eSAlexander Kabaev       /**
6871b86b14eSAlexander Kabaev        *  @brief  Fetches more data from the controlled sequence.
6881b86b14eSAlexander Kabaev        *  @return  The first character from the <em>pending sequence</em>.
6891b86b14eSAlexander Kabaev        *
6901b86b14eSAlexander Kabaev        *  Informally, this function does the same thing as @c underflow(),
6911b86b14eSAlexander Kabaev        *  and in fact is required to call that function.  It also returns
6921b86b14eSAlexander Kabaev        *  the new character, like @c underflow() does.  However, this
6931b86b14eSAlexander Kabaev        *  function also moves the read position forward by one.
6941b86b14eSAlexander Kabaev       */
69500db7afdSDavid E. O'Brien       virtual int_type
uflow()69600db7afdSDavid E. O'Brien       uflow()
69700db7afdSDavid E. O'Brien       {
69800db7afdSDavid E. O'Brien 	int_type __ret = traits_type::eof();
699ffeaf689SAlexander Kabaev 	const bool __testeof = traits_type::eq_int_type(this->underflow(),
700ffeaf689SAlexander Kabaev 							__ret);
701ffeaf689SAlexander Kabaev 	if (!__testeof)
70200db7afdSDavid E. O'Brien 	  {
703ffeaf689SAlexander Kabaev 	    __ret = traits_type::to_int_type(*this->gptr());
704ffeaf689SAlexander Kabaev 	    this->gbump(1);
70500db7afdSDavid E. O'Brien 	  }
70600db7afdSDavid E. O'Brien 	return __ret;
70700db7afdSDavid E. O'Brien       }
70800db7afdSDavid E. O'Brien 
7091b86b14eSAlexander Kabaev       // [27.5.2.4.4] putback
7101b86b14eSAlexander Kabaev       /**
7111b86b14eSAlexander Kabaev        *  @brief  Tries to back up the input sequence.
7121b86b14eSAlexander Kabaev        *  @param  c  The character to be inserted back into the sequence.
7131b86b14eSAlexander Kabaev        *  @return  eof() on failure, "some other value" on success
7141b86b14eSAlexander Kabaev        *  @post  The constraints of @c gptr(), @c eback(), and @c pptr()
7151b86b14eSAlexander Kabaev        *         are the same as for @c underflow().
7161b86b14eSAlexander Kabaev        *
7171b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns eof().
7181b86b14eSAlexander Kabaev       */
71900db7afdSDavid E. O'Brien       virtual int_type
72000db7afdSDavid E. O'Brien       pbackfail(int_type /* __c */  = traits_type::eof())
72100db7afdSDavid E. O'Brien       { return traits_type::eof(); }
72200db7afdSDavid E. O'Brien 
72300db7afdSDavid E. O'Brien       // Put area:
7241b86b14eSAlexander Kabaev       /**
7251b86b14eSAlexander Kabaev        *  @brief  Multiple character insertion.
7261b86b14eSAlexander Kabaev        *  @param  s  A buffer area.
7271b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to write.
7281b86b14eSAlexander Kabaev        *  @return  The number of characters written.
7291b86b14eSAlexander Kabaev        *
7301b86b14eSAlexander Kabaev        *  Writes @a s[0] through @a s[n-1] to the output sequence, as if
7311b86b14eSAlexander Kabaev        *  by @c sputc().  Stops when either @a n characters have been
7321b86b14eSAlexander Kabaev        *  copied, or when @c sputc() would return @c traits::eof().
7331b86b14eSAlexander Kabaev        *
7341b86b14eSAlexander Kabaev        *  It is expected that derived classes provide a more efficient
7351b86b14eSAlexander Kabaev        *  implementation by overriding this definition.
7361b86b14eSAlexander Kabaev       */
73700db7afdSDavid E. O'Brien       virtual streamsize
73800db7afdSDavid E. O'Brien       xsputn(const char_type* __s, streamsize __n);
73900db7afdSDavid E. O'Brien 
7401b86b14eSAlexander Kabaev       /**
7411b86b14eSAlexander Kabaev        *  @brief  Consumes data from the buffer; writes to the
7421b86b14eSAlexander Kabaev        *          controlled sequence.
7431b86b14eSAlexander Kabaev        *  @param  c  An additional character to consume.
7441b86b14eSAlexander Kabaev        *  @return  eof() to indicate failure, something else (usually
7451b86b14eSAlexander Kabaev        *           @a c, or not_eof())
7461b86b14eSAlexander Kabaev        *
7471b86b14eSAlexander Kabaev        *  Informally, this function is called when the output buffer is full
7481b86b14eSAlexander Kabaev        *  (or does not exist, as buffering need not actually be done).  If a
7491b86b14eSAlexander Kabaev        *  buffer exists, it is "consumed", with "some effect" on the
7501b86b14eSAlexander Kabaev        *  controlled sequence.  (Typically, the buffer is written out to the
7511b86b14eSAlexander Kabaev        *  sequence verbatim.)  In either case, the character @a c is also
7521b86b14eSAlexander Kabaev        *  written out, if @a c is not @c eof().
7531b86b14eSAlexander Kabaev        *
7541b86b14eSAlexander Kabaev        *  For a formal definiton of this function, see a good text
7551b86b14eSAlexander Kabaev        *  such as Langer & Kreft, or [27.5.2.4.5]/3-7.
7561b86b14eSAlexander Kabaev        *
7571b86b14eSAlexander Kabaev        *  A functioning output streambuf can be created by overriding only
7581b86b14eSAlexander Kabaev        *  this function (no buffer area will be used).
7591b86b14eSAlexander Kabaev        *
7601b86b14eSAlexander Kabaev        *  @note  Base class version does nothing, returns eof().
7611b86b14eSAlexander Kabaev       */
76200db7afdSDavid E. O'Brien       virtual int_type
76300db7afdSDavid E. O'Brien       overflow(int_type /* __c */ = traits_type::eof())
76400db7afdSDavid E. O'Brien       { return traits_type::eof(); }
76500db7afdSDavid E. O'Brien 
766ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_DEPRECATED
7671b86b14eSAlexander Kabaev     // Annex D.6
76800db7afdSDavid E. O'Brien     public:
7691b86b14eSAlexander Kabaev       /**
7701b86b14eSAlexander Kabaev        *  @brief  Tosses a character.
7711b86b14eSAlexander Kabaev        *
7721b86b14eSAlexander Kabaev        *  Advances the read pointer, ignoring the character that would have
7731b86b14eSAlexander Kabaev        *  been read.
7741b86b14eSAlexander Kabaev        *
7751b86b14eSAlexander Kabaev        *  See http://gcc.gnu.org/ml/libstdc++/2002-05/msg00168.html
7761b86b14eSAlexander Kabaev        *
7771b86b14eSAlexander Kabaev        *  @note  This function has been deprecated by the standard.  You
778ffeaf689SAlexander Kabaev        *         must define @c _GLIBCXX_DEPRECATED to make this visible; see
7791b86b14eSAlexander Kabaev        *         c++config.h.
7801b86b14eSAlexander Kabaev       */
78100db7afdSDavid E. O'Brien       void
stossc()78200db7afdSDavid E. O'Brien       stossc()
78300db7afdSDavid E. O'Brien       {
784ffeaf689SAlexander Kabaev 	if (this->gptr() < this->egptr())
785ffeaf689SAlexander Kabaev 	  this->gbump(1);
78600db7afdSDavid E. O'Brien 	else
78700db7afdSDavid E. O'Brien 	  this->uflow();
78800db7afdSDavid E. O'Brien       }
78900db7afdSDavid E. O'Brien #endif
79000db7afdSDavid E. O'Brien 
79100db7afdSDavid E. O'Brien     private:
792ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
793ffeaf689SAlexander Kabaev       // Side effect of DR 50.
basic_streambuf(const __streambuf_type & __sb)794ffeaf689SAlexander Kabaev       basic_streambuf(const __streambuf_type& __sb)
795ffeaf689SAlexander Kabaev       : _M_in_beg(__sb._M_in_beg), _M_in_cur(__sb._M_in_cur),
796ffeaf689SAlexander Kabaev       _M_in_end(__sb._M_in_end), _M_out_beg(__sb._M_out_beg),
797ffeaf689SAlexander Kabaev       _M_out_cur(__sb._M_out_cur), _M_out_end(__sb._M_out_cur),
798ffeaf689SAlexander Kabaev       _M_buf_locale(__sb._M_buf_locale)
799ffeaf689SAlexander Kabaev       { }
80000db7afdSDavid E. O'Brien 
80100db7afdSDavid E. O'Brien       __streambuf_type&
80200db7afdSDavid E. O'Brien       operator=(const __streambuf_type&) { return *this; };
80300db7afdSDavid E. O'Brien     };
804*f8a1b7d9SAlexander Kabaev 
805*f8a1b7d9SAlexander Kabaev   // Explicit specialization declarations, defined in src/streambuf.cc.
806*f8a1b7d9SAlexander Kabaev   template<>
807*f8a1b7d9SAlexander Kabaev     streamsize
808*f8a1b7d9SAlexander Kabaev     __copy_streambufs_eof(basic_streambuf<char>* __sbin,
809*f8a1b7d9SAlexander Kabaev 			  basic_streambuf<char>* __sbout, bool& __ineof);
810*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
811*f8a1b7d9SAlexander Kabaev   template<>
812*f8a1b7d9SAlexander Kabaev     streamsize
813*f8a1b7d9SAlexander Kabaev     __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
814*f8a1b7d9SAlexander Kabaev 			  basic_streambuf<wchar_t>* __sbout, bool& __ineof);
815*f8a1b7d9SAlexander Kabaev #endif
816*f8a1b7d9SAlexander Kabaev 
817*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
81800db7afdSDavid E. O'Brien 
819ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_EXPORT_TEMPLATE
82000db7afdSDavid E. O'Brien # include <bits/streambuf.tcc>
82100db7afdSDavid E. O'Brien #endif
82200db7afdSDavid E. O'Brien 
823ffeaf689SAlexander Kabaev #endif /* _GLIBCXX_STREAMBUF */
824