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