100db7afdSDavid E. O'Brien // Input streams -*- C++ -*-
200db7afdSDavid E. O'Brien 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
4ffeaf689SAlexander Kabaev // 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 
3100db7afdSDavid E. O'Brien //
3200db7afdSDavid E. O'Brien // ISO C++ 14882: 27.6.1  Input streams
3300db7afdSDavid E. O'Brien //
3400db7afdSDavid E. O'Brien 
3500db7afdSDavid E. O'Brien /** @file istream
36*f8a1b7d9SAlexander Kabaev  *  This is a Standard C++ Library header.
3700db7afdSDavid E. O'Brien  */
3800db7afdSDavid E. O'Brien 
39ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_ISTREAM
40ffeaf689SAlexander Kabaev #define _GLIBCXX_ISTREAM 1
4100db7afdSDavid E. O'Brien 
4200db7afdSDavid E. O'Brien #pragma GCC system_header
4300db7afdSDavid E. O'Brien 
4400db7afdSDavid E. O'Brien #include <ios>
4500db7afdSDavid E. O'Brien #include <limits> // For numeric_limits
4600db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NAMESPACE(std)47*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
48*f8a1b7d9SAlexander Kabaev 
491b86b14eSAlexander Kabaev   // [27.6.1.1] Template class basic_istream
501b86b14eSAlexander Kabaev   /**
511b86b14eSAlexander Kabaev    *  @brief  Controlling input.
521b86b14eSAlexander Kabaev    *
531b86b14eSAlexander Kabaev    *  This is the base class for all input streams.  It provides text
541b86b14eSAlexander Kabaev    *  formatting of all builtin types, and communicates with any class
551b86b14eSAlexander Kabaev    *  derived from basic_streambuf to do the actual input.
561b86b14eSAlexander Kabaev   */
5700db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
5800db7afdSDavid E. O'Brien     class basic_istream : virtual public basic_ios<_CharT, _Traits>
5900db7afdSDavid E. O'Brien     {
6000db7afdSDavid E. O'Brien     public:
6100db7afdSDavid E. O'Brien       // Types (inherited from basic_ios (27.4.4)):
6200db7afdSDavid E. O'Brien       typedef _CharT                     		char_type;
6300db7afdSDavid E. O'Brien       typedef typename _Traits::int_type 		int_type;
6400db7afdSDavid E. O'Brien       typedef typename _Traits::pos_type 		pos_type;
6500db7afdSDavid E. O'Brien       typedef typename _Traits::off_type 		off_type;
6600db7afdSDavid E. O'Brien       typedef _Traits                    		traits_type;
6700db7afdSDavid E. O'Brien 
6800db7afdSDavid E. O'Brien       // Non-standard Types:
6900db7afdSDavid E. O'Brien       typedef basic_streambuf<_CharT, _Traits> 		__streambuf_type;
7000db7afdSDavid E. O'Brien       typedef basic_ios<_CharT, _Traits>		__ios_type;
7100db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits>		__istream_type;
72ffeaf689SAlexander Kabaev       typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
73ffeaf689SAlexander Kabaev  							__num_get_type;
7400db7afdSDavid E. O'Brien       typedef ctype<_CharT>           			__ctype_type;
7500db7afdSDavid E. O'Brien 
761b86b14eSAlexander Kabaev       template<typename _CharT2, typename _Traits2>
771b86b14eSAlexander Kabaev         friend basic_istream<_CharT2, _Traits2>&
781b86b14eSAlexander Kabaev         operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2&);
791b86b14eSAlexander Kabaev 
801b86b14eSAlexander Kabaev       template<typename _CharT2, typename _Traits2>
811b86b14eSAlexander Kabaev         friend basic_istream<_CharT2, _Traits2>&
821b86b14eSAlexander Kabaev         operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*);
831b86b14eSAlexander Kabaev 
8400db7afdSDavid E. O'Brien     protected:
8500db7afdSDavid E. O'Brien       // Data Members:
861b86b14eSAlexander Kabaev       /**
871b86b14eSAlexander Kabaev        *  @if maint
881b86b14eSAlexander Kabaev        *  The number of characters extracted in the previous unformatted
891b86b14eSAlexander Kabaev        *  function; see gcount().
901b86b14eSAlexander Kabaev        *  @endif
911b86b14eSAlexander Kabaev       */
9200db7afdSDavid E. O'Brien       streamsize 		_M_gcount;
9300db7afdSDavid E. O'Brien 
9400db7afdSDavid E. O'Brien     public:
951b86b14eSAlexander Kabaev       // [27.6.1.1.1] constructor/destructor
961b86b14eSAlexander Kabaev       /**
971b86b14eSAlexander Kabaev        *  @brief  Base constructor.
981b86b14eSAlexander Kabaev        *
991b86b14eSAlexander Kabaev        *  This ctor is almost never called by the user directly, rather from
1001b86b14eSAlexander Kabaev        *  derived classes' initialization lists, which pass a pointer to
1011b86b14eSAlexander Kabaev        *  their own stream buffer.
1021b86b14eSAlexander Kabaev       */
10300db7afdSDavid E. O'Brien       explicit
104ffeaf689SAlexander Kabaev       basic_istream(__streambuf_type* __sb): _M_gcount(streamsize(0))
105ffeaf689SAlexander Kabaev       { this->init(__sb); }
10600db7afdSDavid E. O'Brien 
1071b86b14eSAlexander Kabaev       /**
1081b86b14eSAlexander Kabaev        *  @brief  Base destructor.
1091b86b14eSAlexander Kabaev        *
1101b86b14eSAlexander Kabaev        *  This does very little apart from providing a virtual base dtor.
1111b86b14eSAlexander Kabaev       */
11200db7afdSDavid E. O'Brien       virtual
11300db7afdSDavid E. O'Brien       ~basic_istream()
11400db7afdSDavid E. O'Brien       { _M_gcount = streamsize(0); }
11500db7afdSDavid E. O'Brien 
1161b86b14eSAlexander Kabaev       // [27.6.1.1.2] prefix/suffix
11700db7afdSDavid E. O'Brien       class sentry;
11800db7afdSDavid E. O'Brien       friend class sentry;
11900db7afdSDavid E. O'Brien 
1201b86b14eSAlexander Kabaev       // [27.6.1.2] formatted input
1211b86b14eSAlexander Kabaev       // [27.6.1.2.3] basic_istream::operator>>
1221b86b14eSAlexander Kabaev       //@{
1231b86b14eSAlexander Kabaev       /**
1241b86b14eSAlexander Kabaev        *  @brief  Interface for manipulators.
1251b86b14eSAlexander Kabaev        *
1261b86b14eSAlexander Kabaev        *  Manuipulators such as @c std::ws and @c std::dec use these
1271b86b14eSAlexander Kabaev        *  functions in constructs like "std::cin >> std::ws".  For more
1281b86b14eSAlexander Kabaev        *  information, see the iomanip header.
1291b86b14eSAlexander Kabaev       */
130*f8a1b7d9SAlexander Kabaev       __istream_type&
131*f8a1b7d9SAlexander Kabaev       operator>>(__istream_type& (*__pf)(__istream_type&))
132*f8a1b7d9SAlexander Kabaev       { return __pf(*this); }
13300db7afdSDavid E. O'Brien 
134*f8a1b7d9SAlexander Kabaev       __istream_type&
135*f8a1b7d9SAlexander Kabaev       operator>>(__ios_type& (*__pf)(__ios_type&))
136*f8a1b7d9SAlexander Kabaev       {
137*f8a1b7d9SAlexander Kabaev 	__pf(*this);
138*f8a1b7d9SAlexander Kabaev 	return *this;
139*f8a1b7d9SAlexander Kabaev       }
14000db7afdSDavid E. O'Brien 
141*f8a1b7d9SAlexander Kabaev       __istream_type&
142*f8a1b7d9SAlexander Kabaev       operator>>(ios_base& (*__pf)(ios_base&))
143*f8a1b7d9SAlexander Kabaev       {
144*f8a1b7d9SAlexander Kabaev 	__pf(*this);
145*f8a1b7d9SAlexander Kabaev 	return *this;
146*f8a1b7d9SAlexander Kabaev       }
1471b86b14eSAlexander Kabaev       //@}
14800db7afdSDavid E. O'Brien 
1491b86b14eSAlexander Kabaev       // [27.6.1.2.2] arithmetic extractors
1501b86b14eSAlexander Kabaev       /**
1511b86b14eSAlexander Kabaev        *  @name Arithmetic Extractors
1521b86b14eSAlexander Kabaev        *
1531b86b14eSAlexander Kabaev        *  All the @c operator>> functions (aka <em>formatted input
1541b86b14eSAlexander Kabaev        *  functions</em>) have some common behavior.  Each starts by
1551b86b14eSAlexander Kabaev        *  constructing a temporary object of type std::basic_istream::sentry
1561b86b14eSAlexander Kabaev        *  with the second argument (noskipws) set to false.  This has several
1571b86b14eSAlexander Kabaev        *  effects, concluding with the setting of a status flag; see the
1581b86b14eSAlexander Kabaev        *  sentry documentation for more.
1591b86b14eSAlexander Kabaev        *
1601b86b14eSAlexander Kabaev        *  If the sentry status is good, the function tries to extract
1611b86b14eSAlexander Kabaev        *  whatever data is appropriate for the type of the argument.
1621b86b14eSAlexander Kabaev        *
1631b86b14eSAlexander Kabaev        *  If an exception is thrown during extraction, ios_base::badbit
1641b86b14eSAlexander Kabaev        *  will be turned on in the stream's error state without causing an
1651b86b14eSAlexander Kabaev        *  ios_base::failure to be thrown.  The original exception will then
1661b86b14eSAlexander Kabaev        *  be rethrown.
1671b86b14eSAlexander Kabaev       */
1681b86b14eSAlexander Kabaev       //@{
1691b86b14eSAlexander Kabaev       /**
1701b86b14eSAlexander Kabaev        *  @brief  Basic arithmetic extractors
1711b86b14eSAlexander Kabaev        *  @param  A variable of builtin type.
1721b86b14eSAlexander Kabaev        *  @return  @c *this if successful
1731b86b14eSAlexander Kabaev        *
1741b86b14eSAlexander Kabaev        *  These functions use the stream's current locale (specifically, the
1751b86b14eSAlexander Kabaev        *  @c num_get facet) to parse the input data.
1761b86b14eSAlexander Kabaev       */
17700db7afdSDavid E. O'Brien       __istream_type&
178*f8a1b7d9SAlexander Kabaev       operator>>(bool& __n)
179*f8a1b7d9SAlexander Kabaev       { return _M_extract(__n); }
18000db7afdSDavid E. O'Brien 
18100db7afdSDavid E. O'Brien       __istream_type&
18200db7afdSDavid E. O'Brien       operator>>(short& __n);
18300db7afdSDavid E. O'Brien 
18400db7afdSDavid E. O'Brien       __istream_type&
185*f8a1b7d9SAlexander Kabaev       operator>>(unsigned short& __n)
186*f8a1b7d9SAlexander Kabaev       { return _M_extract(__n); }
18700db7afdSDavid E. O'Brien 
18800db7afdSDavid E. O'Brien       __istream_type&
18900db7afdSDavid E. O'Brien       operator>>(int& __n);
19000db7afdSDavid E. O'Brien 
19100db7afdSDavid E. O'Brien       __istream_type&
192*f8a1b7d9SAlexander Kabaev       operator>>(unsigned int& __n)
193*f8a1b7d9SAlexander Kabaev       { return _M_extract(__n); }
19400db7afdSDavid E. O'Brien 
19500db7afdSDavid E. O'Brien       __istream_type&
196*f8a1b7d9SAlexander Kabaev       operator>>(long& __n)
197*f8a1b7d9SAlexander Kabaev       { return _M_extract(__n); }
19800db7afdSDavid E. O'Brien 
19900db7afdSDavid E. O'Brien       __istream_type&
200*f8a1b7d9SAlexander Kabaev       operator>>(unsigned long& __n)
201*f8a1b7d9SAlexander Kabaev       { return _M_extract(__n); }
20200db7afdSDavid E. O'Brien 
203ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
20400db7afdSDavid E. O'Brien       __istream_type&
205*f8a1b7d9SAlexander Kabaev       operator>>(long long& __n)
206*f8a1b7d9SAlexander Kabaev       { return _M_extract(__n); }
20700db7afdSDavid E. O'Brien 
20800db7afdSDavid E. O'Brien       __istream_type&
209*f8a1b7d9SAlexander Kabaev       operator>>(unsigned long long& __n)
210*f8a1b7d9SAlexander Kabaev       { return _M_extract(__n); }
21100db7afdSDavid E. O'Brien #endif
21200db7afdSDavid E. O'Brien 
21300db7afdSDavid E. O'Brien       __istream_type&
214*f8a1b7d9SAlexander Kabaev       operator>>(float& __f)
215*f8a1b7d9SAlexander Kabaev       { return _M_extract(__f); }
21600db7afdSDavid E. O'Brien 
21700db7afdSDavid E. O'Brien       __istream_type&
218*f8a1b7d9SAlexander Kabaev       operator>>(double& __f)
219*f8a1b7d9SAlexander Kabaev       { return _M_extract(__f); }
22000db7afdSDavid E. O'Brien 
22100db7afdSDavid E. O'Brien       __istream_type&
222*f8a1b7d9SAlexander Kabaev       operator>>(long double& __f)
223*f8a1b7d9SAlexander Kabaev       { return _M_extract(__f); }
22400db7afdSDavid E. O'Brien 
22500db7afdSDavid E. O'Brien       __istream_type&
226*f8a1b7d9SAlexander Kabaev       operator>>(void*& __p)
227*f8a1b7d9SAlexander Kabaev       { return _M_extract(__p); }
22800db7afdSDavid E. O'Brien 
2291b86b14eSAlexander Kabaev       /**
2301b86b14eSAlexander Kabaev        *  @brief  Extracting into another streambuf.
2311b86b14eSAlexander Kabaev        *  @param  sb  A pointer to a streambuf
2321b86b14eSAlexander Kabaev        *
2331b86b14eSAlexander Kabaev        *  This function behaves like one of the basic arithmetic extractors,
234ffeaf689SAlexander Kabaev        *  in that it also constructs a sentry object and has the same error
2351b86b14eSAlexander Kabaev        *  handling behavior.
2361b86b14eSAlexander Kabaev        *
2371b86b14eSAlexander Kabaev        *  If @a sb is NULL, the stream will set failbit in its error state.
2381b86b14eSAlexander Kabaev        *
2391b86b14eSAlexander Kabaev        *  Characters are extracted from this stream and inserted into the
2401b86b14eSAlexander Kabaev        *  @a sb streambuf until one of the following occurs:
2411b86b14eSAlexander Kabaev        *
2421b86b14eSAlexander Kabaev        *  - the input stream reaches end-of-file,
2431b86b14eSAlexander Kabaev        *  - insertion into the output buffer fails (in this case, the
2441b86b14eSAlexander Kabaev        *    character that would have been inserted is not extracted), or
2451b86b14eSAlexander Kabaev        *  - an exception occurs (and in this case is caught)
2461b86b14eSAlexander Kabaev        *
2471b86b14eSAlexander Kabaev        *  If the function inserts no characters, failbit is set.
2481b86b14eSAlexander Kabaev       */
24900db7afdSDavid E. O'Brien       __istream_type&
25000db7afdSDavid E. O'Brien       operator>>(__streambuf_type* __sb);
2511b86b14eSAlexander Kabaev       //@}
25200db7afdSDavid E. O'Brien 
2531b86b14eSAlexander Kabaev       // [27.6.1.3] unformatted input
2541b86b14eSAlexander Kabaev       /**
2551b86b14eSAlexander Kabaev        *  @brief  Character counting
2561b86b14eSAlexander Kabaev        *  @return  The number of characters extracted by the previous
2571b86b14eSAlexander Kabaev        *           unformatted input function dispatched for this stream.
2581b86b14eSAlexander Kabaev       */
259*f8a1b7d9SAlexander Kabaev       streamsize
2601b86b14eSAlexander Kabaev       gcount() const
26100db7afdSDavid E. O'Brien       { return _M_gcount; }
26200db7afdSDavid E. O'Brien 
2631b86b14eSAlexander Kabaev       /**
2641b86b14eSAlexander Kabaev        *  @name Unformatted Input Functions
2651b86b14eSAlexander Kabaev        *
2661b86b14eSAlexander Kabaev        *  All the unformatted input functions have some common behavior.
2671b86b14eSAlexander Kabaev        *  Each starts by constructing a temporary object of type
2681b86b14eSAlexander Kabaev        *  std::basic_istream::sentry with the second argument (noskipws)
2691b86b14eSAlexander Kabaev        *  set to true.  This has several effects, concluding with the
2701b86b14eSAlexander Kabaev        *  setting of a status flag; see the sentry documentation for more.
2711b86b14eSAlexander Kabaev        *
2721b86b14eSAlexander Kabaev        *  If the sentry status is good, the function tries to extract
2731b86b14eSAlexander Kabaev        *  whatever data is appropriate for the type of the argument.
2741b86b14eSAlexander Kabaev        *
2751b86b14eSAlexander Kabaev        *  The number of characters extracted is stored for later retrieval
2761b86b14eSAlexander Kabaev        *  by gcount().
2771b86b14eSAlexander Kabaev        *
2781b86b14eSAlexander Kabaev        *  If an exception is thrown during extraction, ios_base::badbit
2791b86b14eSAlexander Kabaev        *  will be turned on in the stream's error state without causing an
2801b86b14eSAlexander Kabaev        *  ios_base::failure to be thrown.  The original exception will then
2811b86b14eSAlexander Kabaev        *  be rethrown.
2821b86b14eSAlexander Kabaev       */
2831b86b14eSAlexander Kabaev       //@{
2841b86b14eSAlexander Kabaev       /**
2851b86b14eSAlexander Kabaev        *  @brief  Simple extraction.
2861b86b14eSAlexander Kabaev        *  @return  A character, or eof().
2871b86b14eSAlexander Kabaev        *
2881b86b14eSAlexander Kabaev        *  Tries to extract a character.  If none are available, sets failbit
2891b86b14eSAlexander Kabaev        *  and returns traits::eof().
2901b86b14eSAlexander Kabaev       */
29100db7afdSDavid E. O'Brien       int_type
2921b86b14eSAlexander Kabaev       get();
29300db7afdSDavid E. O'Brien 
2941b86b14eSAlexander Kabaev       /**
2951b86b14eSAlexander Kabaev        *  @brief  Simple extraction.
2961b86b14eSAlexander Kabaev        *  @param  c  The character in which to store data.
2971b86b14eSAlexander Kabaev        *  @return  *this
2981b86b14eSAlexander Kabaev        *
2991b86b14eSAlexander Kabaev        *  Tries to extract a character and store it in @a c.  If none are
3001b86b14eSAlexander Kabaev        *  available, sets failbit and returns traits::eof().
3011b86b14eSAlexander Kabaev        *
3021b86b14eSAlexander Kabaev        *  @note  This function is not overloaded on signed char and
3031b86b14eSAlexander Kabaev        *         unsigned char.
3041b86b14eSAlexander Kabaev       */
30500db7afdSDavid E. O'Brien       __istream_type&
30600db7afdSDavid E. O'Brien       get(char_type& __c);
30700db7afdSDavid E. O'Brien 
3081b86b14eSAlexander Kabaev       /**
3091b86b14eSAlexander Kabaev        *  @brief  Simple multiple-character extraction.
3101b86b14eSAlexander Kabaev        *  @param  s  Pointer to an array.
3111b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to store in @a s.
3121b86b14eSAlexander Kabaev        *  @param  delim  A "stop" character.
3131b86b14eSAlexander Kabaev        *  @return  *this
3141b86b14eSAlexander Kabaev        *
3151b86b14eSAlexander Kabaev        *  Characters are extracted and stored into @a s until one of the
3161b86b14eSAlexander Kabaev        *  following happens:
3171b86b14eSAlexander Kabaev        *
3181b86b14eSAlexander Kabaev        *  - @c n-1 characters are stored
3191b86b14eSAlexander Kabaev        *  - the input sequence reaches EOF
3201b86b14eSAlexander Kabaev        *  - the next character equals @a delim, in which case the character
3211b86b14eSAlexander Kabaev        *    is not extracted
3221b86b14eSAlexander Kabaev        *
3231b86b14eSAlexander Kabaev        * If no characters are stored, failbit is set in the stream's error
3241b86b14eSAlexander Kabaev        * state.
3251b86b14eSAlexander Kabaev        *
3261b86b14eSAlexander Kabaev        * In any case, a null character is stored into the next location in
3271b86b14eSAlexander Kabaev        * the array.
3281b86b14eSAlexander Kabaev        *
3291b86b14eSAlexander Kabaev        *  @note  This function is not overloaded on signed char and
3301b86b14eSAlexander Kabaev        *         unsigned char.
3311b86b14eSAlexander Kabaev       */
33200db7afdSDavid E. O'Brien       __istream_type&
33300db7afdSDavid E. O'Brien       get(char_type* __s, streamsize __n, char_type __delim);
33400db7afdSDavid E. O'Brien 
3351b86b14eSAlexander Kabaev       /**
3361b86b14eSAlexander Kabaev        *  @brief  Simple multiple-character extraction.
3371b86b14eSAlexander Kabaev        *  @param  s  Pointer to an array.
3381b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to store in @a s.
3391b86b14eSAlexander Kabaev        *  @return  *this
3401b86b14eSAlexander Kabaev        *
3411b86b14eSAlexander Kabaev        *  Returns @c get(s,n,widen('\n')).
3421b86b14eSAlexander Kabaev       */
343*f8a1b7d9SAlexander Kabaev       __istream_type&
34400db7afdSDavid E. O'Brien       get(char_type* __s, streamsize __n)
34500db7afdSDavid E. O'Brien       { return this->get(__s, __n, this->widen('\n')); }
34600db7afdSDavid E. O'Brien 
3471b86b14eSAlexander Kabaev       /**
3481b86b14eSAlexander Kabaev        *  @brief  Extraction into another streambuf.
3491b86b14eSAlexander Kabaev        *  @param  sb  A streambuf in which to store data.
3501b86b14eSAlexander Kabaev        *  @param  delim  A "stop" character.
3511b86b14eSAlexander Kabaev        *  @return  *this
3521b86b14eSAlexander Kabaev        *
3531b86b14eSAlexander Kabaev        *  Characters are extracted and inserted into @a sb until one of the
3541b86b14eSAlexander Kabaev        *  following happens:
3551b86b14eSAlexander Kabaev        *
3561b86b14eSAlexander Kabaev        *  - the input sequence reaches EOF
3571b86b14eSAlexander Kabaev        *  - insertion into the output buffer fails (in this case, the
3581b86b14eSAlexander Kabaev        *    character that would have been inserted is not extracted)
3591b86b14eSAlexander Kabaev        *  - the next character equals @a delim (in this case, the character
3601b86b14eSAlexander Kabaev        *    is not extracted)
3611b86b14eSAlexander Kabaev        *  - an exception occurs (and in this case is caught)
3621b86b14eSAlexander Kabaev        *
3631b86b14eSAlexander Kabaev        * If no characters are stored, failbit is set in the stream's error
3641b86b14eSAlexander Kabaev        * state.
3651b86b14eSAlexander Kabaev       */
36600db7afdSDavid E. O'Brien       __istream_type&
36700db7afdSDavid E. O'Brien       get(__streambuf_type& __sb, char_type __delim);
36800db7afdSDavid E. O'Brien 
3691b86b14eSAlexander Kabaev       /**
3701b86b14eSAlexander Kabaev        *  @brief  Extraction into another streambuf.
3711b86b14eSAlexander Kabaev        *  @param  sb  A streambuf in which to store data.
3721b86b14eSAlexander Kabaev        *  @return  *this
3731b86b14eSAlexander Kabaev        *
3741b86b14eSAlexander Kabaev        *  Returns @c get(sb,widen('\n')).
3751b86b14eSAlexander Kabaev       */
376*f8a1b7d9SAlexander Kabaev       __istream_type&
37700db7afdSDavid E. O'Brien       get(__streambuf_type& __sb)
37800db7afdSDavid E. O'Brien       { return this->get(__sb, this->widen('\n')); }
37900db7afdSDavid E. O'Brien 
3801b86b14eSAlexander Kabaev       /**
3811b86b14eSAlexander Kabaev        *  @brief  String extraction.
3821b86b14eSAlexander Kabaev        *  @param  s  A character array in which to store the data.
3831b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to extract.
3841b86b14eSAlexander Kabaev        *  @param  delim  A "stop" character.
3851b86b14eSAlexander Kabaev        *  @return  *this
3861b86b14eSAlexander Kabaev        *
3871b86b14eSAlexander Kabaev        *  Extracts and stores characters into @a s until one of the
3881b86b14eSAlexander Kabaev        *  following happens.  Note that these criteria are required to be
3891b86b14eSAlexander Kabaev        *  tested in the order listed here, to allow an input line to exactly
3901b86b14eSAlexander Kabaev        *  fill the @a s array without setting failbit.
3911b86b14eSAlexander Kabaev        *
3921b86b14eSAlexander Kabaev        *  -# the input sequence reaches end-of-file, in which case eofbit
3931b86b14eSAlexander Kabaev        *     is set in the stream error state
3941b86b14eSAlexander Kabaev        *  -# the next character equals @c delim, in which case the character
3951b86b14eSAlexander Kabaev        *     is extracted (and therefore counted in @c gcount()) but not stored
3961b86b14eSAlexander Kabaev        *  -# @c n-1 characters are stored, in which case failbit is set
3971b86b14eSAlexander Kabaev        *     in the stream error state
3981b86b14eSAlexander Kabaev        *
3991b86b14eSAlexander Kabaev        *  If no characters are extracted, failbit is set.  (An empty line of
4001b86b14eSAlexander Kabaev        *  input should therefore not cause failbit to be set.)
4011b86b14eSAlexander Kabaev        *
4021b86b14eSAlexander Kabaev        *  In any case, a null character is stored in the next location in
4031b86b14eSAlexander Kabaev        *  the array.
4041b86b14eSAlexander Kabaev       */
40500db7afdSDavid E. O'Brien       __istream_type&
40600db7afdSDavid E. O'Brien       getline(char_type* __s, streamsize __n, char_type __delim);
40700db7afdSDavid E. O'Brien 
4081b86b14eSAlexander Kabaev       /**
4091b86b14eSAlexander Kabaev        *  @brief  String extraction.
4101b86b14eSAlexander Kabaev        *  @param  s  A character array in which to store the data.
4111b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to extract.
4121b86b14eSAlexander Kabaev        *  @return  *this
4131b86b14eSAlexander Kabaev        *
4141b86b14eSAlexander Kabaev        *  Returns @c getline(s,n,widen('\n')).
4151b86b14eSAlexander Kabaev       */
416*f8a1b7d9SAlexander Kabaev       __istream_type&
41700db7afdSDavid E. O'Brien       getline(char_type* __s, streamsize __n)
41800db7afdSDavid E. O'Brien       { return this->getline(__s, __n, this->widen('\n')); }
41900db7afdSDavid E. O'Brien 
4201b86b14eSAlexander Kabaev       /**
4211b86b14eSAlexander Kabaev        *  @brief  Discarding characters
4221b86b14eSAlexander Kabaev        *  @param  n  Number of characters to discard.
4231b86b14eSAlexander Kabaev        *  @param  delim  A "stop" character.
4241b86b14eSAlexander Kabaev        *  @return  *this
4251b86b14eSAlexander Kabaev        *
4261b86b14eSAlexander Kabaev        *  Extracts characters and throws them away until one of the
4271b86b14eSAlexander Kabaev        *  following happens:
4281b86b14eSAlexander Kabaev        *  - if @a n @c != @c std::numeric_limits<int>::max(), @a n
4291b86b14eSAlexander Kabaev        *    characters are extracted
4301b86b14eSAlexander Kabaev        *  - the input sequence reaches end-of-file
4311b86b14eSAlexander Kabaev        *  - the next character equals @a delim (in this case, the character
4321b86b14eSAlexander Kabaev        *    is extracted); note that this condition will never occur if
4331b86b14eSAlexander Kabaev        *    @a delim equals @c traits::eof().
434*f8a1b7d9SAlexander Kabaev        *
435*f8a1b7d9SAlexander Kabaev        *  NB: Provide three overloads, instead of the single function
436*f8a1b7d9SAlexander Kabaev        *  (with defaults) mandated by the Standard: this leads to a
437*f8a1b7d9SAlexander Kabaev        *  better performing implementation, while still conforming to
438*f8a1b7d9SAlexander Kabaev        *  the Standard.
4391b86b14eSAlexander Kabaev       */
44000db7afdSDavid E. O'Brien       __istream_type&
441*f8a1b7d9SAlexander Kabaev       ignore();
442*f8a1b7d9SAlexander Kabaev 
443*f8a1b7d9SAlexander Kabaev       __istream_type&
444*f8a1b7d9SAlexander Kabaev       ignore(streamsize __n);
445*f8a1b7d9SAlexander Kabaev 
446*f8a1b7d9SAlexander Kabaev       __istream_type&
447*f8a1b7d9SAlexander Kabaev       ignore(streamsize __n, int_type __delim);
44800db7afdSDavid E. O'Brien 
4491b86b14eSAlexander Kabaev       /**
4501b86b14eSAlexander Kabaev        *  @brief  Looking ahead in the stream
4511b86b14eSAlexander Kabaev        *  @return  The next character, or eof().
4521b86b14eSAlexander Kabaev        *
4531b86b14eSAlexander Kabaev        *  If, after constructing the sentry object, @c good() is false,
4541b86b14eSAlexander Kabaev        *  returns @c traits::eof().  Otherwise reads but does not extract
4551b86b14eSAlexander Kabaev        *  the next input character.
4561b86b14eSAlexander Kabaev       */
45700db7afdSDavid E. O'Brien       int_type
4581b86b14eSAlexander Kabaev       peek();
45900db7afdSDavid E. O'Brien 
4601b86b14eSAlexander Kabaev       /**
4611b86b14eSAlexander Kabaev        *  @brief  Extraction without delimiters.
4621b86b14eSAlexander Kabaev        *  @param  s  A character array.
4631b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to store.
4641b86b14eSAlexander Kabaev        *  @return  *this
4651b86b14eSAlexander Kabaev        *
4661b86b14eSAlexander Kabaev        *  If the stream state is @c good(), extracts characters and stores
4671b86b14eSAlexander Kabaev        *  them into @a s until one of the following happens:
4681b86b14eSAlexander Kabaev        *  - @a n characters are stored
4691b86b14eSAlexander Kabaev        *  - the input sequence reaches end-of-file, in which case the error
4701b86b14eSAlexander Kabaev        *    state is set to @c failbit|eofbit.
4711b86b14eSAlexander Kabaev        *
4721b86b14eSAlexander Kabaev        *  @note  This function is not overloaded on signed char and
4731b86b14eSAlexander Kabaev        *         unsigned char.
4741b86b14eSAlexander Kabaev       */
47500db7afdSDavid E. O'Brien       __istream_type&
47600db7afdSDavid E. O'Brien       read(char_type* __s, streamsize __n);
47700db7afdSDavid E. O'Brien 
4781b86b14eSAlexander Kabaev       /**
4791b86b14eSAlexander Kabaev        *  @brief  Extraction until the buffer is exhausted, but no more.
4801b86b14eSAlexander Kabaev        *  @param  s  A character array.
4811b86b14eSAlexander Kabaev        *  @param  n  Maximum number of characters to store.
4821b86b14eSAlexander Kabaev        *  @return  The number of characters extracted.
4831b86b14eSAlexander Kabaev        *
4841b86b14eSAlexander Kabaev        *  Extracts characters and stores them into @a s depending on the
4851b86b14eSAlexander Kabaev        *  number of characters remaining in the streambuf's buffer,
4861b86b14eSAlexander Kabaev        *  @c rdbuf()->in_avail(), called @c A here:
4871b86b14eSAlexander Kabaev        *  - if @c A @c == @c -1, sets eofbit and extracts no characters
4881b86b14eSAlexander Kabaev        *  - if @c A @c == @c 0, extracts no characters
4891b86b14eSAlexander Kabaev        *  - if @c A @c > @c 0, extracts @c min(A,n)
4901b86b14eSAlexander Kabaev        *
4911b86b14eSAlexander Kabaev        *  The goal is to empty the current buffer, and to not request any
4921b86b14eSAlexander Kabaev        *  more from the external input sequence controlled by the streambuf.
4931b86b14eSAlexander Kabaev       */
49400db7afdSDavid E. O'Brien       streamsize
49500db7afdSDavid E. O'Brien       readsome(char_type* __s, streamsize __n);
49600db7afdSDavid E. O'Brien 
4971b86b14eSAlexander Kabaev       /**
4981b86b14eSAlexander Kabaev        *  @brief  Unextracting a single character.
4991b86b14eSAlexander Kabaev        *  @param  c  The character to push back into the input stream.
5001b86b14eSAlexander Kabaev        *  @return  *this
5011b86b14eSAlexander Kabaev        *
5021b86b14eSAlexander Kabaev        *  If @c rdbuf() is not null, calls @c rdbuf()->sputbackc(c).
5031b86b14eSAlexander Kabaev        *
5041b86b14eSAlexander Kabaev        *  If @c rdbuf() is null or if @c sputbackc() fails, sets badbit in
5051b86b14eSAlexander Kabaev        *  the error state.
5061b86b14eSAlexander Kabaev        *
5071b86b14eSAlexander Kabaev        *  @note  Since no characters are extracted, the next call to
5081b86b14eSAlexander Kabaev        *         @c gcount() will return 0, as required by DR 60.
5091b86b14eSAlexander Kabaev       */
51000db7afdSDavid E. O'Brien       __istream_type&
51100db7afdSDavid E. O'Brien       putback(char_type __c);
51200db7afdSDavid E. O'Brien 
5131b86b14eSAlexander Kabaev       /**
5141b86b14eSAlexander Kabaev        *  @brief  Unextracting the previous character.
5151b86b14eSAlexander Kabaev        *  @return  *this
5161b86b14eSAlexander Kabaev        *
5171b86b14eSAlexander Kabaev        *  If @c rdbuf() is not null, calls @c rdbuf()->sungetc(c).
5181b86b14eSAlexander Kabaev        *
5191b86b14eSAlexander Kabaev        *  If @c rdbuf() is null or if @c sungetc() fails, sets badbit in
5201b86b14eSAlexander Kabaev        *  the error state.
5211b86b14eSAlexander Kabaev        *
5221b86b14eSAlexander Kabaev        *  @note  Since no characters are extracted, the next call to
5231b86b14eSAlexander Kabaev        *         @c gcount() will return 0, as required by DR 60.
5241b86b14eSAlexander Kabaev       */
52500db7afdSDavid E. O'Brien       __istream_type&
5261b86b14eSAlexander Kabaev       unget();
52700db7afdSDavid E. O'Brien 
5281b86b14eSAlexander Kabaev       /**
5291b86b14eSAlexander Kabaev        *  @brief  Synchronizing the stream buffer.
5301b86b14eSAlexander Kabaev        *  @return  0 on success, -1 on failure
5311b86b14eSAlexander Kabaev        *
5321b86b14eSAlexander Kabaev        *  If @c rdbuf() is a null pointer, returns -1.
5331b86b14eSAlexander Kabaev        *
5341b86b14eSAlexander Kabaev        *  Otherwise, calls @c rdbuf()->pubsync(), and if that returns -1,
5351b86b14eSAlexander Kabaev        *  sets badbit and returns -1.
5361b86b14eSAlexander Kabaev        *
5371b86b14eSAlexander Kabaev        *  Otherwise, returns 0.
5381b86b14eSAlexander Kabaev        *
5391b86b14eSAlexander Kabaev        *  @note  This function does not count the number of characters
5401b86b14eSAlexander Kabaev        *         extracted, if any, and therefore does not affect the next
5411b86b14eSAlexander Kabaev        *         call to @c gcount().
5421b86b14eSAlexander Kabaev       */
54300db7afdSDavid E. O'Brien       int
5441b86b14eSAlexander Kabaev       sync();
54500db7afdSDavid E. O'Brien 
5461b86b14eSAlexander Kabaev       /**
5471b86b14eSAlexander Kabaev        *  @brief  Getting the current read position.
5481b86b14eSAlexander Kabaev        *  @return  A file position object.
5491b86b14eSAlexander Kabaev        *
5501b86b14eSAlexander Kabaev        *  If @c fail() is not false, returns @c pos_type(-1) to indicate
5511b86b14eSAlexander Kabaev        *  failure.  Otherwise returns @c rdbuf()->pubseekoff(0,cur,in).
5521b86b14eSAlexander Kabaev        *
5531b86b14eSAlexander Kabaev        *  @note  This function does not count the number of characters
5541b86b14eSAlexander Kabaev        *         extracted, if any, and therefore does not affect the next
5551b86b14eSAlexander Kabaev        *         call to @c gcount().
5561b86b14eSAlexander Kabaev       */
55700db7afdSDavid E. O'Brien       pos_type
5581b86b14eSAlexander Kabaev       tellg();
55900db7afdSDavid E. O'Brien 
5601b86b14eSAlexander Kabaev       /**
5611b86b14eSAlexander Kabaev        *  @brief  Changing the current read position.
5621b86b14eSAlexander Kabaev        *  @param  pos  A file position object.
5631b86b14eSAlexander Kabaev        *  @return  *this
5641b86b14eSAlexander Kabaev        *
5651b86b14eSAlexander Kabaev        *  If @c fail() is not true, calls @c rdbuf()->pubseekpos(pos).  If
5661b86b14eSAlexander Kabaev        *  that function fails, sets failbit.
5671b86b14eSAlexander Kabaev        *
5681b86b14eSAlexander Kabaev        *  @note  This function does not count the number of characters
5691b86b14eSAlexander Kabaev        *         extracted, if any, and therefore does not affect the next
5701b86b14eSAlexander Kabaev        *         call to @c gcount().
5711b86b14eSAlexander Kabaev       */
57200db7afdSDavid E. O'Brien       __istream_type&
57300db7afdSDavid E. O'Brien       seekg(pos_type);
57400db7afdSDavid E. O'Brien 
5751b86b14eSAlexander Kabaev       /**
5761b86b14eSAlexander Kabaev        *  @brief  Changing the current read position.
5771b86b14eSAlexander Kabaev        *  @param  off  A file offset object.
5781b86b14eSAlexander Kabaev        *  @param  dir  The direction in which to seek.
5791b86b14eSAlexander Kabaev        *  @return  *this
5801b86b14eSAlexander Kabaev        *
5811b86b14eSAlexander Kabaev        *  If @c fail() is not true, calls @c rdbuf()->pubseekoff(off,dir).
5821b86b14eSAlexander Kabaev        *  If that function fails, sets failbit.
5831b86b14eSAlexander Kabaev        *
5841b86b14eSAlexander Kabaev        *  @note  This function does not count the number of characters
5851b86b14eSAlexander Kabaev        *         extracted, if any, and therefore does not affect the next
5861b86b14eSAlexander Kabaev        *         call to @c gcount().
5871b86b14eSAlexander Kabaev       */
58800db7afdSDavid E. O'Brien       __istream_type&
58900db7afdSDavid E. O'Brien       seekg(off_type, ios_base::seekdir);
5901b86b14eSAlexander Kabaev       //@}
591ffeaf689SAlexander Kabaev 
592ffeaf689SAlexander Kabaev     protected:
593ffeaf689SAlexander Kabaev       explicit
594ffeaf689SAlexander Kabaev       basic_istream(): _M_gcount(streamsize(0)) { }
595*f8a1b7d9SAlexander Kabaev 
596*f8a1b7d9SAlexander Kabaev       template<typename _ValueT>
597*f8a1b7d9SAlexander Kabaev         __istream_type&
598*f8a1b7d9SAlexander Kabaev         _M_extract(_ValueT& __v);
59900db7afdSDavid E. O'Brien     };
60000db7afdSDavid E. O'Brien 
601*f8a1b7d9SAlexander Kabaev   // Explicit specialization declarations, defined in src/istream.cc.
602*f8a1b7d9SAlexander Kabaev   template<>
603*f8a1b7d9SAlexander Kabaev     basic_istream<char>&
604*f8a1b7d9SAlexander Kabaev     basic_istream<char>::
605*f8a1b7d9SAlexander Kabaev     getline(char_type* __s, streamsize __n, char_type __delim);
606*f8a1b7d9SAlexander Kabaev 
607*f8a1b7d9SAlexander Kabaev   template<>
608*f8a1b7d9SAlexander Kabaev     basic_istream<char>&
609*f8a1b7d9SAlexander Kabaev     basic_istream<char>::
610*f8a1b7d9SAlexander Kabaev     ignore(streamsize __n);
611*f8a1b7d9SAlexander Kabaev 
612*f8a1b7d9SAlexander Kabaev   template<>
613*f8a1b7d9SAlexander Kabaev     basic_istream<char>&
614*f8a1b7d9SAlexander Kabaev     basic_istream<char>::
615*f8a1b7d9SAlexander Kabaev     ignore(streamsize __n, int_type __delim);
616*f8a1b7d9SAlexander Kabaev 
617*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
618*f8a1b7d9SAlexander Kabaev   template<>
619*f8a1b7d9SAlexander Kabaev     basic_istream<wchar_t>&
620*f8a1b7d9SAlexander Kabaev     basic_istream<wchar_t>::
621*f8a1b7d9SAlexander Kabaev     getline(char_type* __s, streamsize __n, char_type __delim);
622*f8a1b7d9SAlexander Kabaev 
623*f8a1b7d9SAlexander Kabaev   template<>
624*f8a1b7d9SAlexander Kabaev     basic_istream<wchar_t>&
625*f8a1b7d9SAlexander Kabaev     basic_istream<wchar_t>::
626*f8a1b7d9SAlexander Kabaev     ignore(streamsize __n);
627*f8a1b7d9SAlexander Kabaev 
628*f8a1b7d9SAlexander Kabaev   template<>
629*f8a1b7d9SAlexander Kabaev     basic_istream<wchar_t>&
630*f8a1b7d9SAlexander Kabaev     basic_istream<wchar_t>::
631*f8a1b7d9SAlexander Kabaev     ignore(streamsize __n, int_type __delim);
632*f8a1b7d9SAlexander Kabaev #endif
633*f8a1b7d9SAlexander Kabaev 
6341b86b14eSAlexander Kabaev   /**
6351b86b14eSAlexander Kabaev    *  @brief  Performs setup work for input streams.
6361b86b14eSAlexander Kabaev    *
6371b86b14eSAlexander Kabaev    *  Objects of this class are created before all of the standard
6381b86b14eSAlexander Kabaev    *  extractors are run.  It is responsible for "exception-safe prefix and
6391b86b14eSAlexander Kabaev    *  suffix operations," although only prefix actions are currently required
6401b86b14eSAlexander Kabaev    *  by the standard.  Additional actions may be added by the
6411b86b14eSAlexander Kabaev    *  implementation, and we list them in
6421b86b14eSAlexander Kabaev    *  http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/howto.html#5
6431b86b14eSAlexander Kabaev    *  under [27.6] notes.
6441b86b14eSAlexander Kabaev   */
64500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
64600db7afdSDavid E. O'Brien     class basic_istream<_CharT, _Traits>::sentry
64700db7afdSDavid E. O'Brien     {
64800db7afdSDavid E. O'Brien     public:
6491b86b14eSAlexander Kabaev       /// Easy access to dependant types.
65000db7afdSDavid E. O'Brien       typedef _Traits 					traits_type;
65100db7afdSDavid E. O'Brien       typedef basic_streambuf<_CharT, _Traits> 		__streambuf_type;
65200db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits> 		__istream_type;
65300db7afdSDavid E. O'Brien       typedef typename __istream_type::__ctype_type 	__ctype_type;
65400db7afdSDavid E. O'Brien       typedef typename _Traits::int_type		__int_type;
65500db7afdSDavid E. O'Brien 
6561b86b14eSAlexander Kabaev       /**
6571b86b14eSAlexander Kabaev        *  @brief  The constructor performs all the work.
6581b86b14eSAlexander Kabaev        *  @param  is  The input stream to guard.
6591b86b14eSAlexander Kabaev        *  @param  noskipws  Whether to consume whitespace or not.
6601b86b14eSAlexander Kabaev        *
6611b86b14eSAlexander Kabaev        *  If the stream state is good (@a is.good() is true), then the
6621b86b14eSAlexander Kabaev        *  following actions are performed, otherwise the sentry state is
6631b86b14eSAlexander Kabaev        *  false ("not okay") and failbit is set in the stream state.
6641b86b14eSAlexander Kabaev        *
6651b86b14eSAlexander Kabaev        *  The sentry's preparatory actions are:
6661b86b14eSAlexander Kabaev        *
6671b86b14eSAlexander Kabaev        *  -# if the stream is tied to an output stream, @c is.tie()->flush()
6681b86b14eSAlexander Kabaev        *     is called to synchronize the output sequence
6691b86b14eSAlexander Kabaev        *  -# if @a noskipws is false, and @c ios_base::skipws is set in
6701b86b14eSAlexander Kabaev        *     @c is.flags(), the sentry extracts and discards whitespace
6711b86b14eSAlexander Kabaev        *     characters from the stream.  The currently imbued locale is
6721b86b14eSAlexander Kabaev        *     used to determine whether each character is whitespace.
6731b86b14eSAlexander Kabaev        *
6741b86b14eSAlexander Kabaev        *  If the stream state is still good, then the sentry state becomes
6751b86b14eSAlexander Kabaev        *  true ("okay").
6761b86b14eSAlexander Kabaev       */
67700db7afdSDavid E. O'Brien       explicit
67800db7afdSDavid E. O'Brien       sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
67900db7afdSDavid E. O'Brien 
6801b86b14eSAlexander Kabaev       /**
6811b86b14eSAlexander Kabaev        *  @brief  Quick status checking.
6821b86b14eSAlexander Kabaev        *  @return  The sentry state.
6831b86b14eSAlexander Kabaev        *
6841b86b14eSAlexander Kabaev        *  For ease of use, sentries may be converted to booleans.  The
6851b86b14eSAlexander Kabaev        *  return value is that of the sentry state (true == okay).
6861b86b14eSAlexander Kabaev       */
687*f8a1b7d9SAlexander Kabaev       operator bool() const
688*f8a1b7d9SAlexander Kabaev       { return _M_ok; }
68900db7afdSDavid E. O'Brien 
69000db7afdSDavid E. O'Brien     private:
69100db7afdSDavid E. O'Brien       bool _M_ok;
69200db7afdSDavid E. O'Brien     };
69300db7afdSDavid E. O'Brien 
6941b86b14eSAlexander Kabaev   // [27.6.1.2.3] character extraction templates
6951b86b14eSAlexander Kabaev   //@{
6961b86b14eSAlexander Kabaev   /**
6971b86b14eSAlexander Kabaev    *  @brief  Character extractors
6981b86b14eSAlexander Kabaev    *  @param  in  An input stream.
6991b86b14eSAlexander Kabaev    *  @param  c  A character reference.
7001b86b14eSAlexander Kabaev    *  @return  in
7011b86b14eSAlexander Kabaev    *
7021b86b14eSAlexander Kabaev    *  Behaves like one of the formatted arithmetic extractors described in
7031b86b14eSAlexander Kabaev    *  std::basic_istream.  After constructing a sentry object with good
7041b86b14eSAlexander Kabaev    *  status, this function extracts a character (if one is available) and
7051b86b14eSAlexander Kabaev    *  stores it in @a c.  Otherwise, sets failbit in the input stream.
7061b86b14eSAlexander Kabaev   */
70700db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
70800db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
70900db7afdSDavid E. O'Brien     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c);
71000db7afdSDavid E. O'Brien 
71100db7afdSDavid E. O'Brien   template<class _Traits>
712*f8a1b7d9SAlexander Kabaev     inline basic_istream<char, _Traits>&
71300db7afdSDavid E. O'Brien     operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
71400db7afdSDavid E. O'Brien     { return (__in >> reinterpret_cast<char&>(__c)); }
71500db7afdSDavid E. O'Brien 
71600db7afdSDavid E. O'Brien   template<class _Traits>
717*f8a1b7d9SAlexander Kabaev     inline basic_istream<char, _Traits>&
71800db7afdSDavid E. O'Brien     operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
71900db7afdSDavid E. O'Brien     { return (__in >> reinterpret_cast<char&>(__c)); }
7201b86b14eSAlexander Kabaev   //@}
72100db7afdSDavid E. O'Brien 
7221b86b14eSAlexander Kabaev   //@{
7231b86b14eSAlexander Kabaev   /**
7241b86b14eSAlexander Kabaev    *  @brief  Character string extractors
7251b86b14eSAlexander Kabaev    *  @param  in  An input stream.
7261b86b14eSAlexander Kabaev    *  @param  s  A pointer to a character array.
7271b86b14eSAlexander Kabaev    *  @return  in
7281b86b14eSAlexander Kabaev    *
7291b86b14eSAlexander Kabaev    *  Behaves like one of the formatted arithmetic extractors described in
7301b86b14eSAlexander Kabaev    *  std::basic_istream.  After constructing a sentry object with good
7311b86b14eSAlexander Kabaev    *  status, this function extracts up to @c n characters and stores them
7321b86b14eSAlexander Kabaev    *  into the array starting at @a s.  @c n is defined as:
7331b86b14eSAlexander Kabaev    *
7341b86b14eSAlexander Kabaev    *  - if @c width() is greater than zero, @c n is width()
7351b86b14eSAlexander Kabaev    *  - otherwise @c n is "the number of elements of the largest array of
7361b86b14eSAlexander Kabaev    *    @c char_type that can store a terminating @c eos." [27.6.1.2.3]/6
7371b86b14eSAlexander Kabaev    *
7381b86b14eSAlexander Kabaev    *  Characters are extracted and stored until one of the following happens:
7391b86b14eSAlexander Kabaev    *  - @c n-1 characters are stored
7401b86b14eSAlexander Kabaev    *  - EOF is reached
7411b86b14eSAlexander Kabaev    *  - the next character is whitespace according to the current locale
7421b86b14eSAlexander Kabaev    *  - the next character is a null byte (i.e., @c charT() )
7431b86b14eSAlexander Kabaev    *
7441b86b14eSAlexander Kabaev    *  @c width(0) is then called for the input stream.
7451b86b14eSAlexander Kabaev    *
7461b86b14eSAlexander Kabaev    *  If no characters are extracted, sets failbit.
7471b86b14eSAlexander Kabaev   */
74800db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
74900db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
75000db7afdSDavid E. O'Brien     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);
75100db7afdSDavid E. O'Brien 
752*f8a1b7d9SAlexander Kabaev   // Explicit specialization declaration, defined in src/istream.cc.
753*f8a1b7d9SAlexander Kabaev   template<>
754*f8a1b7d9SAlexander Kabaev     basic_istream<char>&
755*f8a1b7d9SAlexander Kabaev     operator>>(basic_istream<char>& __in, char* __s);
756*f8a1b7d9SAlexander Kabaev 
75700db7afdSDavid E. O'Brien   template<class _Traits>
758*f8a1b7d9SAlexander Kabaev     inline basic_istream<char, _Traits>&
75900db7afdSDavid E. O'Brien     operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
76000db7afdSDavid E. O'Brien     { return (__in >> reinterpret_cast<char*>(__s)); }
76100db7afdSDavid E. O'Brien 
76200db7afdSDavid E. O'Brien   template<class _Traits>
763*f8a1b7d9SAlexander Kabaev     inline basic_istream<char, _Traits>&
76400db7afdSDavid E. O'Brien     operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
76500db7afdSDavid E. O'Brien     { return (__in >> reinterpret_cast<char*>(__s)); }
7661b86b14eSAlexander Kabaev   //@}
76700db7afdSDavid E. O'Brien 
76800db7afdSDavid E. O'Brien   // 27.6.1.5 Template class basic_iostream
7691b86b14eSAlexander Kabaev   /**
7701b86b14eSAlexander Kabaev    *  @brief  Merging istream and ostream capabilities.
7711b86b14eSAlexander Kabaev    *
7721b86b14eSAlexander Kabaev    *  This class multiply inherits from the input and output stream classes
7731b86b14eSAlexander Kabaev    *  simply to provide a single interface.
7741b86b14eSAlexander Kabaev   */
77500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
77600db7afdSDavid E. O'Brien     class basic_iostream
77700db7afdSDavid E. O'Brien     : public basic_istream<_CharT, _Traits>,
77800db7afdSDavid E. O'Brien       public basic_ostream<_CharT, _Traits>
77900db7afdSDavid E. O'Brien     {
78000db7afdSDavid E. O'Brien     public:
781ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
782ca6500fcSAlexander Kabaev       // 271. basic_iostream missing typedefs
783ca6500fcSAlexander Kabaev       // Types (inherited):
784ca6500fcSAlexander Kabaev       typedef _CharT                     		char_type;
785ca6500fcSAlexander Kabaev       typedef typename _Traits::int_type 		int_type;
786ca6500fcSAlexander Kabaev       typedef typename _Traits::pos_type 		pos_type;
787ca6500fcSAlexander Kabaev       typedef typename _Traits::off_type 		off_type;
788ca6500fcSAlexander Kabaev       typedef _Traits                    		traits_type;
789ca6500fcSAlexander Kabaev 
79000db7afdSDavid E. O'Brien       // Non-standard Types:
79100db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits>		__istream_type;
79200db7afdSDavid E. O'Brien       typedef basic_ostream<_CharT, _Traits>		__ostream_type;
79300db7afdSDavid E. O'Brien 
7941b86b14eSAlexander Kabaev       /**
7951b86b14eSAlexander Kabaev        *  @brief  Constructor does nothing.
7961b86b14eSAlexander Kabaev        *
7971b86b14eSAlexander Kabaev        *  Both of the parent classes are initialized with the same
7981b86b14eSAlexander Kabaev        *  streambuf pointer passed to this constructor.
7991b86b14eSAlexander Kabaev       */
80000db7afdSDavid E. O'Brien       explicit
basic_iostream(basic_streambuf<_CharT,_Traits> * __sb)80100db7afdSDavid E. O'Brien       basic_iostream(basic_streambuf<_CharT, _Traits>* __sb)
802ffeaf689SAlexander Kabaev       : __istream_type(), __ostream_type()
803ffeaf689SAlexander Kabaev       { this->init(__sb); }
80400db7afdSDavid E. O'Brien 
8051b86b14eSAlexander Kabaev       /**
8061b86b14eSAlexander Kabaev        *  @brief  Destructor does nothing.
8071b86b14eSAlexander Kabaev       */
80800db7afdSDavid E. O'Brien       virtual
~basic_iostream()80900db7afdSDavid E. O'Brien       ~basic_iostream() { }
810ffeaf689SAlexander Kabaev 
811ffeaf689SAlexander Kabaev     protected:
812ffeaf689SAlexander Kabaev       explicit
basic_iostream()813ffeaf689SAlexander Kabaev       basic_iostream() : __istream_type(), __ostream_type()
814ffeaf689SAlexander Kabaev       { }
81500db7afdSDavid E. O'Brien     };
81600db7afdSDavid E. O'Brien 
8171b86b14eSAlexander Kabaev   // [27.6.1.4] standard basic_istream manipulators
8181b86b14eSAlexander Kabaev   /**
8191b86b14eSAlexander Kabaev    *  @brief  Quick and easy way to eat whitespace
8201b86b14eSAlexander Kabaev    *
8211b86b14eSAlexander Kabaev    *  This manipulator extracts whitespace characters, stopping when the
8221b86b14eSAlexander Kabaev    *  next character is non-whitespace, or when the input sequence is empty.
8231b86b14eSAlexander Kabaev    *  If the sequence is empty, @c eofbit is set in the stream, but not
8241b86b14eSAlexander Kabaev    *  @c failbit.
8251b86b14eSAlexander Kabaev    *
8261b86b14eSAlexander Kabaev    *  The current locale is used to distinguish whitespace characters.
8271b86b14eSAlexander Kabaev    *
8281b86b14eSAlexander Kabaev    *  Example:
8291b86b14eSAlexander Kabaev    *  @code
8301b86b14eSAlexander Kabaev    *     MyClass   mc;
8311b86b14eSAlexander Kabaev    *
8321b86b14eSAlexander Kabaev    *     std::cin >> std::ws >> mc;
8331b86b14eSAlexander Kabaev    *  @endcode
8341b86b14eSAlexander Kabaev    *  will skip leading whitespace before calling operator>> on cin and your
8351b86b14eSAlexander Kabaev    *  object.  Note that the same effect can be achieved by creating a
8361b86b14eSAlexander Kabaev    *  std::basic_istream::sentry inside your definition of operator>>.
8371b86b14eSAlexander Kabaev   */
83800db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
83900db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
84000db7afdSDavid E. O'Brien     ws(basic_istream<_CharT, _Traits>& __is);
841*f8a1b7d9SAlexander Kabaev 
842*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
84300db7afdSDavid E. O'Brien 
844ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_EXPORT_TEMPLATE
84500db7afdSDavid E. O'Brien # include <bits/istream.tcc>
84600db7afdSDavid E. O'Brien #endif
84700db7afdSDavid E. O'Brien 
848ffeaf689SAlexander Kabaev #endif	/* _GLIBCXX_ISTREAM */
849