libstdc++
istream
1 // Input streams -*- C++ -*-
2 
3 // Copyright (C) 1997-2014 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 //
26 // ISO C++ 14882: 27.6.1 Input streams
27 //
28 
29 /** @file include/istream
30  * This is a Standard C++ Library header.
31  */
32 
33 #ifndef _GLIBCXX_ISTREAM
34 #define _GLIBCXX_ISTREAM 1
35 
36 #pragma GCC system_header
37 
38 #include <ios>
39 #include <ostream>
40 
41 namespace std _GLIBCXX_VISIBILITY(default)
42 {
43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
44 
45  /**
46  * @brief Template class basic_istream.
47  * @ingroup io
48  *
49  * @tparam _CharT Type of character stream.
50  * @tparam _Traits Traits for character type, defaults to
51  * char_traits<_CharT>.
52  *
53  * This is the base class for all input streams. It provides text
54  * formatting of all builtin types, and communicates with any class
55  * derived from basic_streambuf to do the actual input.
56  */
57  template<typename _CharT, typename _Traits>
58  class basic_istream : virtual public basic_ios<_CharT, _Traits>
59  {
60  public:
61  // Types (inherited from basic_ios (27.4.4)):
62  typedef _CharT char_type;
63  typedef typename _Traits::int_type int_type;
64  typedef typename _Traits::pos_type pos_type;
65  typedef typename _Traits::off_type off_type;
66  typedef _Traits traits_type;
67 
68  // Non-standard Types:
69  typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
70  typedef basic_ios<_CharT, _Traits> __ios_type;
71  typedef basic_istream<_CharT, _Traits> __istream_type;
72  typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
73  __num_get_type;
74  typedef ctype<_CharT> __ctype_type;
75 
76  protected:
77  // Data Members:
78  /**
79  * The number of characters extracted in the previous unformatted
80  * function; see gcount().
81  */
82  streamsize _M_gcount;
83 
84  public:
85  /**
86  * @brief Base constructor.
87  *
88  * This ctor is almost never called by the user directly, rather from
89  * derived classes' initialization lists, which pass a pointer to
90  * their own stream buffer.
91  */
92  explicit
93  basic_istream(__streambuf_type* __sb)
94  : _M_gcount(streamsize(0))
95  { this->init(__sb); }
96 
97  /**
98  * @brief Base destructor.
99  *
100  * This does very little apart from providing a virtual base dtor.
101  */
102  virtual
103  ~basic_istream()
104  { _M_gcount = streamsize(0); }
105 
106  /// Safe prefix/suffix operations.
107  class sentry;
108  friend class sentry;
109 
110  //@{
111  /**
112  * @brief Interface for manipulators.
113  *
114  * Manipulators such as @c std::ws and @c std::dec use these
115  * functions in constructs like
116  * <code>std::cin >> std::ws</code>.
117  * For more information, see the iomanip header.
118  */
119  __istream_type&
120  operator>>(__istream_type& (*__pf)(__istream_type&))
121  { return __pf(*this); }
122 
123  __istream_type&
124  operator>>(__ios_type& (*__pf)(__ios_type&))
125  {
126  __pf(*this);
127  return *this;
128  }
129 
130  __istream_type&
131  operator>>(ios_base& (*__pf)(ios_base&))
132  {
133  __pf(*this);
134  return *this;
135  }
136  //@}
137 
138  //@{
139  /**
140  * @name Extractors
141  *
142  * All the @c operator>> functions (aka <em>formatted input
143  * functions</em>) have some common behavior. Each starts by
144  * constructing a temporary object of type std::basic_istream::sentry
145  * with the second argument (noskipws) set to false. This has several
146  * effects, concluding with the setting of a status flag; see the
147  * sentry documentation for more.
148  *
149  * If the sentry status is good, the function tries to extract
150  * whatever data is appropriate for the type of the argument.
151  *
152  * If an exception is thrown during extraction, ios_base::badbit
153  * will be turned on in the stream's error state without causing an
154  * ios_base::failure to be thrown. The original exception will then
155  * be rethrown.
156  */
157 
158  //@{
159  /**
160  * @brief Integer arithmetic extractors
161  * @param __n A variable of builtin integral type.
162  * @return @c *this if successful
163  *
164  * These functions use the stream's current locale (specifically, the
165  * @c num_get facet) to parse the input data.
166  */
167  __istream_type&
168  operator>>(bool& __n)
169  { return _M_extract(__n); }
170 
171  __istream_type&
172  operator>>(short& __n);
173 
174  __istream_type&
175  operator>>(unsigned short& __n)
176  { return _M_extract(__n); }
177 
178  __istream_type&
179  operator>>(int& __n);
180 
181  __istream_type&
182  operator>>(unsigned int& __n)
183  { return _M_extract(__n); }
184 
185  __istream_type&
186  operator>>(long& __n)
187  { return _M_extract(__n); }
188 
189  __istream_type&
190  operator>>(unsigned long& __n)
191  { return _M_extract(__n); }
192 
193 #ifdef _GLIBCXX_USE_LONG_LONG
194  __istream_type&
195  operator>>(long long& __n)
196  { return _M_extract(__n); }
197 
198  __istream_type&
199  operator>>(unsigned long long& __n)
200  { return _M_extract(__n); }
201 #endif
202  //@}
203 
204  //@{
205  /**
206  * @brief Floating point arithmetic extractors
207  * @param __f A variable of builtin floating point type.
208  * @return @c *this if successful
209  *
210  * These functions use the stream's current locale (specifically, the
211  * @c num_get facet) to parse the input data.
212  */
213  __istream_type&
214  operator>>(float& __f)
215  { return _M_extract(__f); }
216 
217  __istream_type&
218  operator>>(double& __f)
219  { return _M_extract(__f); }
220 
221  __istream_type&
222  operator>>(long double& __f)
223  { return _M_extract(__f); }
224  //@}
225 
226  /**
227  * @brief Basic arithmetic extractors
228  * @param __p A variable of pointer type.
229  * @return @c *this if successful
230  *
231  * These functions use the stream's current locale (specifically, the
232  * @c num_get facet) to parse the input data.
233  */
234  __istream_type&
235  operator>>(void*& __p)
236  { return _M_extract(__p); }
237 
238  /**
239  * @brief Extracting into another streambuf.
240  * @param __sb A pointer to a streambuf
241  *
242  * This function behaves like one of the basic arithmetic extractors,
243  * in that it also constructs a sentry object and has the same error
244  * handling behavior.
245  *
246  * If @p __sb is NULL, the stream will set failbit in its error state.
247  *
248  * Characters are extracted from this stream and inserted into the
249  * @p __sb streambuf until one of the following occurs:
250  *
251  * - the input stream reaches end-of-file,
252  * - insertion into the output buffer fails (in this case, the
253  * character that would have been inserted is not extracted), or
254  * - an exception occurs (and in this case is caught)
255  *
256  * If the function inserts no characters, failbit is set.
257  */
258  __istream_type&
259  operator>>(__streambuf_type* __sb);
260  //@}
261 
262  // [27.6.1.3] unformatted input
263  /**
264  * @brief Character counting
265  * @return The number of characters extracted by the previous
266  * unformatted input function dispatched for this stream.
267  */
268  streamsize
269  gcount() const
270  { return _M_gcount; }
271 
272  //@{
273  /**
274  * @name Unformatted Input Functions
275  *
276  * All the unformatted input functions have some common behavior.
277  * Each starts by constructing a temporary object of type
278  * std::basic_istream::sentry with the second argument (noskipws)
279  * set to true. This has several effects, concluding with the
280  * setting of a status flag; see the sentry documentation for more.
281  *
282  * If the sentry status is good, the function tries to extract
283  * whatever data is appropriate for the type of the argument.
284  *
285  * The number of characters extracted is stored for later retrieval
286  * by gcount().
287  *
288  * If an exception is thrown during extraction, ios_base::badbit
289  * will be turned on in the stream's error state without causing an
290  * ios_base::failure to be thrown. The original exception will then
291  * be rethrown.
292  */
293 
294  /**
295  * @brief Simple extraction.
296  * @return A character, or eof().
297  *
298  * Tries to extract a character. If none are available, sets failbit
299  * and returns traits::eof().
300  */
301  int_type
302  get();
303 
304  /**
305  * @brief Simple extraction.
306  * @param __c The character in which to store data.
307  * @return *this
308  *
309  * Tries to extract a character and store it in @a __c. If none are
310  * available, sets failbit and returns traits::eof().
311  *
312  * @note This function is not overloaded on signed char and
313  * unsigned char.
314  */
315  __istream_type&
316  get(char_type& __c);
317 
318  /**
319  * @brief Simple multiple-character extraction.
320  * @param __s Pointer to an array.
321  * @param __n Maximum number of characters to store in @a __s.
322  * @param __delim A "stop" character.
323  * @return *this
324  *
325  * Characters are extracted and stored into @a __s until one of the
326  * following happens:
327  *
328  * - @c __n-1 characters are stored
329  * - the input sequence reaches EOF
330  * - the next character equals @a __delim, in which case the character
331  * is not extracted
332  *
333  * If no characters are stored, failbit is set in the stream's error
334  * state.
335  *
336  * In any case, a null character is stored into the next location in
337  * the array.
338  *
339  * @note This function is not overloaded on signed char and
340  * unsigned char.
341  */
342  __istream_type&
343  get(char_type* __s, streamsize __n, char_type __delim);
344 
345  /**
346  * @brief Simple multiple-character extraction.
347  * @param __s Pointer to an array.
348  * @param __n Maximum number of characters to store in @a s.
349  * @return *this
350  *
351  * Returns @c get(__s,__n,widen(&apos;\\n&apos;)).
352  */
353  __istream_type&
354  get(char_type* __s, streamsize __n)
355  { return this->get(__s, __n, this->widen('\n')); }
356 
357  /**
358  * @brief Extraction into another streambuf.
359  * @param __sb A streambuf in which to store data.
360  * @param __delim A "stop" character.
361  * @return *this
362  *
363  * Characters are extracted and inserted into @a __sb until one of the
364  * following happens:
365  *
366  * - the input sequence reaches EOF
367  * - insertion into the output buffer fails (in this case, the
368  * character that would have been inserted is not extracted)
369  * - the next character equals @a __delim (in this case, the character
370  * is not extracted)
371  * - an exception occurs (and in this case is caught)
372  *
373  * If no characters are stored, failbit is set in the stream's error
374  * state.
375  */
376  __istream_type&
377  get(__streambuf_type& __sb, char_type __delim);
378 
379  /**
380  * @brief Extraction into another streambuf.
381  * @param __sb A streambuf in which to store data.
382  * @return *this
383  *
384  * Returns @c get(__sb,widen(&apos;\\n&apos;)).
385  */
386  __istream_type&
387  get(__streambuf_type& __sb)
388  { return this->get(__sb, this->widen('\n')); }
389 
390  /**
391  * @brief String extraction.
392  * @param __s A character array in which to store the data.
393  * @param __n Maximum number of characters to extract.
394  * @param __delim A "stop" character.
395  * @return *this
396  *
397  * Extracts and stores characters into @a __s until one of the
398  * following happens. Note that these criteria are required to be
399  * tested in the order listed here, to allow an input line to exactly
400  * fill the @a __s array without setting failbit.
401  *
402  * -# the input sequence reaches end-of-file, in which case eofbit
403  * is set in the stream error state
404  * -# the next character equals @c __delim, in which case the character
405  * is extracted (and therefore counted in @c gcount()) but not stored
406  * -# @c __n-1 characters are stored, in which case failbit is set
407  * in the stream error state
408  *
409  * If no characters are extracted, failbit is set. (An empty line of
410  * input should therefore not cause failbit to be set.)
411  *
412  * In any case, a null character is stored in the next location in
413  * the array.
414  */
415  __istream_type&
416  getline(char_type* __s, streamsize __n, char_type __delim);
417 
418  /**
419  * @brief String extraction.
420  * @param __s A character array in which to store the data.
421  * @param __n Maximum number of characters to extract.
422  * @return *this
423  *
424  * Returns @c getline(__s,__n,widen(&apos;\\n&apos;)).
425  */
426  __istream_type&
427  getline(char_type* __s, streamsize __n)
428  { return this->getline(__s, __n, this->widen('\n')); }
429 
430  /**
431  * @brief Discarding characters
432  * @param __n Number of characters to discard.
433  * @param __delim A "stop" character.
434  * @return *this
435  *
436  * Extracts characters and throws them away until one of the
437  * following happens:
438  * - if @a __n @c != @c std::numeric_limits<int>::max(), @a __n
439  * characters are extracted
440  * - the input sequence reaches end-of-file
441  * - the next character equals @a __delim (in this case, the character
442  * is extracted); note that this condition will never occur if
443  * @a __delim equals @c traits::eof().
444  *
445  * NB: Provide three overloads, instead of the single function
446  * (with defaults) mandated by the Standard: this leads to a
447  * better performing implementation, while still conforming to
448  * the Standard.
449  */
450  __istream_type&
451  ignore(streamsize __n, int_type __delim);
452 
453  __istream_type&
454  ignore(streamsize __n);
455 
456  __istream_type&
457  ignore();
458 
459  /**
460  * @brief Looking ahead in the stream
461  * @return The next character, or eof().
462  *
463  * If, after constructing the sentry object, @c good() is false,
464  * returns @c traits::eof(). Otherwise reads but does not extract
465  * the next input character.
466  */
467  int_type
468  peek();
469 
470  /**
471  * @brief Extraction without delimiters.
472  * @param __s A character array.
473  * @param __n Maximum number of characters to store.
474  * @return *this
475  *
476  * If the stream state is @c good(), extracts characters and stores
477  * them into @a __s until one of the following happens:
478  * - @a __n characters are stored
479  * - the input sequence reaches end-of-file, in which case the error
480  * state is set to @c failbit|eofbit.
481  *
482  * @note This function is not overloaded on signed char and
483  * unsigned char.
484  */
485  __istream_type&
486  read(char_type* __s, streamsize __n);
487 
488  /**
489  * @brief Extraction until the buffer is exhausted, but no more.
490  * @param __s A character array.
491  * @param __n Maximum number of characters to store.
492  * @return The number of characters extracted.
493  *
494  * Extracts characters and stores them into @a __s depending on the
495  * number of characters remaining in the streambuf's buffer,
496  * @c rdbuf()->in_avail(), called @c A here:
497  * - if @c A @c == @c -1, sets eofbit and extracts no characters
498  * - if @c A @c == @c 0, extracts no characters
499  * - if @c A @c > @c 0, extracts @c min(A,n)
500  *
501  * The goal is to empty the current buffer, and to not request any
502  * more from the external input sequence controlled by the streambuf.
503  */
504  streamsize
505  readsome(char_type* __s, streamsize __n);
506 
507  /**
508  * @brief Unextracting a single character.
509  * @param __c The character to push back into the input stream.
510  * @return *this
511  *
512  * If @c rdbuf() is not null, calls @c rdbuf()->sputbackc(c).
513  *
514  * If @c rdbuf() is null or if @c sputbackc() fails, sets badbit in
515  * the error state.
516  *
517  * @note This function first clears eofbit. Since no characters
518  * are extracted, the next call to @c gcount() will return 0,
519  * as required by DR 60.
520  */
521  __istream_type&
522  putback(char_type __c);
523 
524  /**
525  * @brief Unextracting the previous character.
526  * @return *this
527  *
528  * If @c rdbuf() is not null, calls @c rdbuf()->sungetc(c).
529  *
530  * If @c rdbuf() is null or if @c sungetc() fails, sets badbit in
531  * the error state.
532  *
533  * @note This function first clears eofbit. Since no characters
534  * are extracted, the next call to @c gcount() will return 0,
535  * as required by DR 60.
536  */
537  __istream_type&
538  unget();
539 
540  /**
541  * @brief Synchronizing the stream buffer.
542  * @return 0 on success, -1 on failure
543  *
544  * If @c rdbuf() is a null pointer, returns -1.
545  *
546  * Otherwise, calls @c rdbuf()->pubsync(), and if that returns -1,
547  * sets badbit and returns -1.
548  *
549  * Otherwise, returns 0.
550  *
551  * @note This function does not count the number of characters
552  * extracted, if any, and therefore does not affect the next
553  * call to @c gcount().
554  */
555  int
556  sync();
557 
558  /**
559  * @brief Getting the current read position.
560  * @return A file position object.
561  *
562  * If @c fail() is not false, returns @c pos_type(-1) to indicate
563  * failure. Otherwise returns @c rdbuf()->pubseekoff(0,cur,in).
564  *
565  * @note This function does not count the number of characters
566  * extracted, if any, and therefore does not affect the next
567  * call to @c gcount(). At variance with putback, unget and
568  * seekg, eofbit is not cleared first.
569  */
570  pos_type
571  tellg();
572 
573  /**
574  * @brief Changing the current read position.
575  * @param __pos A file position object.
576  * @return *this
577  *
578  * If @c fail() is not true, calls @c rdbuf()->pubseekpos(__pos). If
579  * that function fails, sets failbit.
580  *
581  * @note This function first clears eofbit. It does not count the
582  * number of characters extracted, if any, and therefore does
583  * not affect the next call to @c gcount().
584  */
585  __istream_type&
586  seekg(pos_type);
587 
588  /**
589  * @brief Changing the current read position.
590  * @param __off A file offset object.
591  * @param __dir The direction in which to seek.
592  * @return *this
593  *
594  * If @c fail() is not true, calls @c rdbuf()->pubseekoff(__off,__dir).
595  * If that function fails, sets failbit.
596  *
597  * @note This function first clears eofbit. It does not count the
598  * number of characters extracted, if any, and therefore does
599  * not affect the next call to @c gcount().
600  */
601  __istream_type&
602  seekg(off_type, ios_base::seekdir);
603  //@}
604 
605  protected:
606  basic_istream()
607  : _M_gcount(streamsize(0))
608  { this->init(0); }
609 
610  template<typename _ValueT>
611  __istream_type&
612  _M_extract(_ValueT& __v);
613  };
614 
615  /// Explicit specialization declarations, defined in src/istream.cc.
616  template<>
617  basic_istream<char>&
618  basic_istream<char>::
619  getline(char_type* __s, streamsize __n, char_type __delim);
620 
621  template<>
622  basic_istream<char>&
623  basic_istream<char>::
624  ignore(streamsize __n);
625 
626  template<>
627  basic_istream<char>&
628  basic_istream<char>::
629  ignore(streamsize __n, int_type __delim);
630 
631 #ifdef _GLIBCXX_USE_WCHAR_T
632  template<>
633  basic_istream<wchar_t>&
634  basic_istream<wchar_t>::
635  getline(char_type* __s, streamsize __n, char_type __delim);
636 
637  template<>
638  basic_istream<wchar_t>&
639  basic_istream<wchar_t>::
640  ignore(streamsize __n);
641 
642  template<>
643  basic_istream<wchar_t>&
644  basic_istream<wchar_t>::
645  ignore(streamsize __n, int_type __delim);
646 #endif
647 
648  /**
649  * @brief Performs setup work for input streams.
650  *
651  * Objects of this class are created before all of the standard
652  * extractors are run. It is responsible for <em>exception-safe
653  * prefix and suffix operations,</em> although only prefix actions
654  * are currently required by the standard.
655  */
656  template<typename _CharT, typename _Traits>
657  class basic_istream<_CharT, _Traits>::sentry
658  {
659  // Data Members.
660  bool _M_ok;
661 
662  public:
663  /// Easy access to dependent types.
664  typedef _Traits traits_type;
665  typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
666  typedef basic_istream<_CharT, _Traits> __istream_type;
667  typedef typename __istream_type::__ctype_type __ctype_type;
668  typedef typename _Traits::int_type __int_type;
669 
670  /**
671  * @brief The constructor performs all the work.
672  * @param __is The input stream to guard.
673  * @param __noskipws Whether to consume whitespace or not.
674  *
675  * If the stream state is good (@a __is.good() is true), then the
676  * following actions are performed, otherwise the sentry state
677  * is false (<em>not okay</em>) and failbit is set in the
678  * stream state.
679  *
680  * The sentry's preparatory actions are:
681  *
682  * -# if the stream is tied to an output stream, @c is.tie()->flush()
683  * is called to synchronize the output sequence
684  * -# if @a __noskipws is false, and @c ios_base::skipws is set in
685  * @c is.flags(), the sentry extracts and discards whitespace
686  * characters from the stream. The currently imbued locale is
687  * used to determine whether each character is whitespace.
688  *
689  * If the stream state is still good, then the sentry state becomes
690  * true (@a okay).
691  */
692  explicit
693  sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
694 
695  /**
696  * @brief Quick status checking.
697  * @return The sentry state.
698  *
699  * For ease of use, sentries may be converted to booleans. The
700  * return value is that of the sentry state (true == okay).
701  */
702 #if __cplusplus >= 201103L
703  explicit
704 #endif
705  operator bool() const
706  { return _M_ok; }
707  };
708 
709  //@{
710  /**
711  * @brief Character extractors
712  * @param __in An input stream.
713  * @param __c A character reference.
714  * @return in
715  *
716  * Behaves like one of the formatted arithmetic extractors described in
717  * std::basic_istream. After constructing a sentry object with good
718  * status, this function extracts a character (if one is available) and
719  * stores it in @a __c. Otherwise, sets failbit in the input stream.
720  */
721  template<typename _CharT, typename _Traits>
722  basic_istream<_CharT, _Traits>&
723  operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c);
724 
725  template<class _Traits>
726  inline basic_istream<char, _Traits>&
727  operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
728  { return (__in >> reinterpret_cast<char&>(__c)); }
729 
730  template<class _Traits>
731  inline basic_istream<char, _Traits>&
732  operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
733  { return (__in >> reinterpret_cast<char&>(__c)); }
734  //@}
735 
736  //@{
737  /**
738  * @brief Character string extractors
739  * @param __in An input stream.
740  * @param __s A pointer to a character array.
741  * @return __in
742  *
743  * Behaves like one of the formatted arithmetic extractors described in
744  * std::basic_istream. After constructing a sentry object with good
745  * status, this function extracts up to @c n characters and stores them
746  * into the array starting at @a __s. @c n is defined as:
747  *
748  * - if @c width() is greater than zero, @c n is width() otherwise
749  * - @c n is <em>the number of elements of the largest array of *
750  * - @c char_type that can store a terminating @c eos.</em>
751  * - [27.6.1.2.3]/6
752  *
753  * Characters are extracted and stored until one of the following happens:
754  * - @c n-1 characters are stored
755  * - EOF is reached
756  * - the next character is whitespace according to the current locale
757  * - the next character is a null byte (i.e., @c charT() )
758  *
759  * @c width(0) is then called for the input stream.
760  *
761  * If no characters are extracted, sets failbit.
762  */
763  template<typename _CharT, typename _Traits>
764  basic_istream<_CharT, _Traits>&
765  operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);
766 
767  // Explicit specialization declaration, defined in src/istream.cc.
768  template<>
769  basic_istream<char>&
770  operator>>(basic_istream<char>& __in, char* __s);
771 
772  template<class _Traits>
773  inline basic_istream<char, _Traits>&
774  operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
775  { return (__in >> reinterpret_cast<char*>(__s)); }
776 
777  template<class _Traits>
778  inline basic_istream<char, _Traits>&
779  operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
780  { return (__in >> reinterpret_cast<char*>(__s)); }
781  //@}
782 
783  /**
784  * @brief Template class basic_iostream
785  * @ingroup io
786  *
787  * @tparam _CharT Type of character stream.
788  * @tparam _Traits Traits for character type, defaults to
789  * char_traits<_CharT>.
790  *
791  * This class multiply inherits from the input and output stream classes
792  * simply to provide a single interface.
793  */
794  template<typename _CharT, typename _Traits>
795  class basic_iostream
796  : public basic_istream<_CharT, _Traits>,
797  public basic_ostream<_CharT, _Traits>
798  {
799  public:
800  // _GLIBCXX_RESOLVE_LIB_DEFECTS
801  // 271. basic_iostream missing typedefs
802  // Types (inherited):
803  typedef _CharT char_type;
804  typedef typename _Traits::int_type int_type;
805  typedef typename _Traits::pos_type pos_type;
806  typedef typename _Traits::off_type off_type;
807  typedef _Traits traits_type;
808 
809  // Non-standard Types:
810  typedef basic_istream<_CharT, _Traits> __istream_type;
811  typedef basic_ostream<_CharT, _Traits> __ostream_type;
812 
813  /**
814  * @brief Constructor does nothing.
815  *
816  * Both of the parent classes are initialized with the same
817  * streambuf pointer passed to this constructor.
818  */
819  explicit
820  basic_iostream(basic_streambuf<_CharT, _Traits>* __sb)
821  : __istream_type(__sb), __ostream_type(__sb) { }
822 
823  /**
824  * @brief Destructor does nothing.
825  */
826  virtual
827  ~basic_iostream() { }
828 
829  protected:
830  basic_iostream()
831  : __istream_type(), __ostream_type() { }
832  };
833 
834  /**
835  * @brief Quick and easy way to eat whitespace
836  *
837  * This manipulator extracts whitespace characters, stopping when the
838  * next character is non-whitespace, or when the input sequence is empty.
839  * If the sequence is empty, @c eofbit is set in the stream, but not
840  * @c failbit.
841  *
842  * The current locale is used to distinguish whitespace characters.
843  *
844  * Example:
845  * @code
846  * MyClass mc;
847  *
848  * std::cin >> std::ws >> mc;
849  * @endcode
850  * will skip leading whitespace before calling operator>> on cin and your
851  * object. Note that the same effect can be achieved by creating a
852  * std::basic_istream::sentry inside your definition of operator>>.
853  */
854  template<typename _CharT, typename _Traits>
855  basic_istream<_CharT, _Traits>&
856  ws(basic_istream<_CharT, _Traits>& __is);
857 
858 #if __cplusplus >= 201103L
859  // [27.7.1.6] Rvalue stream extraction
860  /**
861  * @brief Generic extractor for rvalue stream
862  * @param __is An input stream.
863  * @param __x A reference to the extraction target.
864  * @return is
865  *
866  * This is just a forwarding function to allow extraction from
867  * rvalue streams since they won't bind to the extractor functions
868  * that take an lvalue reference.
869  */
870  template<typename _CharT, typename _Traits, typename _Tp>
871  inline basic_istream<_CharT, _Traits>&
872  operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
873  { return (__is >> __x); }
874 #endif // C++11
875 
876 _GLIBCXX_END_NAMESPACE_VERSION
877 } // namespace
878 
879 #include <bits/istream.tcc>
880 
881 #endif /* _GLIBCXX_ISTREAM */