xref: /freebsd/contrib/llvm-project/libcxx/include/istream (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_ISTREAM
110b57cec5SDimitry Andric#define _LIBCPP_ISTREAM
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    istream synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> >
170b57cec5SDimitry Andricclass basic_istream
180b57cec5SDimitry Andric    : virtual public basic_ios<charT,traits>
190b57cec5SDimitry Andric{
200b57cec5SDimitry Andricpublic:
210b57cec5SDimitry Andric    // types (inherited from basic_ios (27.5.4)):
220b57cec5SDimitry Andric    typedef charT                          char_type;
230b57cec5SDimitry Andric    typedef traits                         traits_type;
240b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
250b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
260b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric    // 27.7.1.1.1 Constructor/destructor:
290b57cec5SDimitry Andric    explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
300b57cec5SDimitry Andric    basic_istream(basic_istream&& rhs);
310b57cec5SDimitry Andric    virtual ~basic_istream();
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric    // 27.7.1.1.2 Assign/swap:
340b57cec5SDimitry Andric    basic_istream& operator=(basic_istream&& rhs);
350b57cec5SDimitry Andric    void swap(basic_istream& rhs);
360b57cec5SDimitry Andric
370b57cec5SDimitry Andric    // 27.7.1.1.3 Prefix/suffix:
380b57cec5SDimitry Andric    class sentry;
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric    // 27.7.1.2 Formatted input:
410b57cec5SDimitry Andric    basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
420b57cec5SDimitry Andric    basic_istream& operator>>(basic_ios<char_type, traits_type>&
430b57cec5SDimitry Andric                              (*pf)(basic_ios<char_type, traits_type>&));
440b57cec5SDimitry Andric    basic_istream& operator>>(ios_base& (*pf)(ios_base&));
450b57cec5SDimitry Andric    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
460b57cec5SDimitry Andric    basic_istream& operator>>(bool& n);
470b57cec5SDimitry Andric    basic_istream& operator>>(short& n);
480b57cec5SDimitry Andric    basic_istream& operator>>(unsigned short& n);
490b57cec5SDimitry Andric    basic_istream& operator>>(int& n);
500b57cec5SDimitry Andric    basic_istream& operator>>(unsigned int& n);
510b57cec5SDimitry Andric    basic_istream& operator>>(long& n);
520b57cec5SDimitry Andric    basic_istream& operator>>(unsigned long& n);
530b57cec5SDimitry Andric    basic_istream& operator>>(long long& n);
540b57cec5SDimitry Andric    basic_istream& operator>>(unsigned long long& n);
550b57cec5SDimitry Andric    basic_istream& operator>>(float& f);
560b57cec5SDimitry Andric    basic_istream& operator>>(double& f);
570b57cec5SDimitry Andric    basic_istream& operator>>(long double& f);
580b57cec5SDimitry Andric    basic_istream& operator>>(void*& p);
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric    // 27.7.1.3 Unformatted input:
610b57cec5SDimitry Andric    streamsize gcount() const;
620b57cec5SDimitry Andric    int_type get();
630b57cec5SDimitry Andric    basic_istream& get(char_type& c);
640b57cec5SDimitry Andric    basic_istream& get(char_type* s, streamsize n);
650b57cec5SDimitry Andric    basic_istream& get(char_type* s, streamsize n, char_type delim);
660b57cec5SDimitry Andric    basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
670b57cec5SDimitry Andric    basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
680b57cec5SDimitry Andric
690b57cec5SDimitry Andric    basic_istream& getline(char_type* s, streamsize n);
700b57cec5SDimitry Andric    basic_istream& getline(char_type* s, streamsize n, char_type delim);
710b57cec5SDimitry Andric
720b57cec5SDimitry Andric    basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
730b57cec5SDimitry Andric    int_type peek();
740b57cec5SDimitry Andric    basic_istream& read (char_type* s, streamsize n);
750b57cec5SDimitry Andric    streamsize readsome(char_type* s, streamsize n);
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric    basic_istream& putback(char_type c);
780b57cec5SDimitry Andric    basic_istream& unget();
790b57cec5SDimitry Andric    int sync();
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric    pos_type tellg();
820b57cec5SDimitry Andric    basic_istream& seekg(pos_type);
830b57cec5SDimitry Andric    basic_istream& seekg(off_type, ios_base::seekdir);
840b57cec5SDimitry Andricprotected:
850b57cec5SDimitry Andric    basic_istream(const basic_istream& rhs) = delete;
860b57cec5SDimitry Andric    basic_istream(basic_istream&& rhs);
870b57cec5SDimitry Andric    // 27.7.2.1.2 Assign/swap:
880b57cec5SDimitry Andric    basic_istream& operator=(const basic_istream& rhs) = delete;
890b57cec5SDimitry Andric    basic_istream& operator=(basic_istream&& rhs);
900b57cec5SDimitry Andric    void swap(basic_istream& rhs);
910b57cec5SDimitry Andric};
920b57cec5SDimitry Andric
930b57cec5SDimitry Andric// 27.7.1.2.3 character extraction templates:
940b57cec5SDimitry Andrictemplate<class charT, class traits>
950b57cec5SDimitry Andric  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
960b57cec5SDimitry Andric
970b57cec5SDimitry Andrictemplate<class traits>
980b57cec5SDimitry Andric  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
990b57cec5SDimitry Andric
1000b57cec5SDimitry Andrictemplate<class traits>
1010b57cec5SDimitry Andric  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andrictemplate<class charT, class traits>
1040b57cec5SDimitry Andric  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
1050b57cec5SDimitry Andric
1060b57cec5SDimitry Andrictemplate<class traits>
1070b57cec5SDimitry Andric  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
1080b57cec5SDimitry Andric
1090b57cec5SDimitry Andrictemplate<class traits>
1100b57cec5SDimitry Andric  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
1110b57cec5SDimitry Andric
1120b57cec5SDimitry Andrictemplate <class charT, class traits>
1130b57cec5SDimitry Andric  void
1140b57cec5SDimitry Andric  swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andrictypedef basic_istream<char> istream;
1170b57cec5SDimitry Andrictypedef basic_istream<wchar_t> wistream;
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> >
1200b57cec5SDimitry Andricclass basic_iostream :
1210b57cec5SDimitry Andric    public basic_istream<charT,traits>,
1220b57cec5SDimitry Andric    public basic_ostream<charT,traits>
1230b57cec5SDimitry Andric{
1240b57cec5SDimitry Andricpublic:
1250b57cec5SDimitry Andric    // types:
1260b57cec5SDimitry Andric    typedef charT                          char_type;
1270b57cec5SDimitry Andric    typedef traits                         traits_type;
1280b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
1290b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
1300b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
1310b57cec5SDimitry Andric
1320b57cec5SDimitry Andric    // constructor/destructor
1330b57cec5SDimitry Andric    explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
1340b57cec5SDimitry Andric    basic_iostream(basic_iostream&& rhs);
1350b57cec5SDimitry Andric    virtual ~basic_iostream();
1360b57cec5SDimitry Andric
1370b57cec5SDimitry Andric    // assign/swap
1380b57cec5SDimitry Andric    basic_iostream& operator=(basic_iostream&& rhs);
1390b57cec5SDimitry Andric    void swap(basic_iostream& rhs);
1400b57cec5SDimitry Andric};
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andrictemplate <class charT, class traits>
1430b57cec5SDimitry Andric  void
1440b57cec5SDimitry Andric  swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andrictypedef basic_iostream<char> iostream;
1470b57cec5SDimitry Andrictypedef basic_iostream<wchar_t> wiostream;
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andrictemplate <class charT, class traits>
1500b57cec5SDimitry Andric  basic_istream<charT,traits>&
1510b57cec5SDimitry Andric  ws(basic_istream<charT,traits>& is);
1520b57cec5SDimitry Andric
153e8d8bef9SDimitry Andric// rvalue stream extraction
154e8d8bef9SDimitry Andrictemplate <class Stream, class T>
155e8d8bef9SDimitry Andric  Stream&& operator>>(Stream&& is, T&& x);
1560b57cec5SDimitry Andric
1570b57cec5SDimitry Andric}  // std
1580b57cec5SDimitry Andric
1590b57cec5SDimitry Andric*/
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andric#include <__config>
16206c3fb27SDimitry Andric#include <__fwd/istream.h>
16381ad6265SDimitry Andric#include <__iterator/istreambuf_iterator.h>
164*0fca6ea1SDimitry Andric#include <__ostream/basic_ostream.h>
16506c3fb27SDimitry Andric#include <__type_traits/conjunction.h>
16606c3fb27SDimitry Andric#include <__type_traits/enable_if.h>
16706c3fb27SDimitry Andric#include <__type_traits/is_base_of.h>
16806c3fb27SDimitry Andric#include <__utility/declval.h>
169fe6060f1SDimitry Andric#include <__utility/forward.h>
170*0fca6ea1SDimitry Andric#include <bitset>
171*0fca6ea1SDimitry Andric#include <ios>
172*0fca6ea1SDimitry Andric#include <locale>
173fe6060f1SDimitry Andric#include <version>
1740b57cec5SDimitry Andric
1750b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1760b57cec5SDimitry Andric#  pragma GCC system_header
1770b57cec5SDimitry Andric#endif
1780b57cec5SDimitry Andric
1790b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
1800b57cec5SDimitry Andric#include <__undef_macros>
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
1830b57cec5SDimitry Andric
1840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
185cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream : virtual public basic_ios<_CharT, _Traits> {
1860b57cec5SDimitry Andric  streamsize __gc_;
1875f757f3fSDimitry Andric
1885f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void __inc_gcount() {
1895f757f3fSDimitry Andric    if (__gc_ < numeric_limits<streamsize>::max())
1905f757f3fSDimitry Andric      ++__gc_;
1915f757f3fSDimitry Andric  }
192cb14a3feSDimitry Andric
1930b57cec5SDimitry Andricpublic:
1940b57cec5SDimitry Andric  // types (inherited from basic_ios (27.5.4)):
1950b57cec5SDimitry Andric  typedef _CharT char_type;
1960b57cec5SDimitry Andric  typedef _Traits traits_type;
1970b57cec5SDimitry Andric  typedef typename traits_type::int_type int_type;
1980b57cec5SDimitry Andric  typedef typename traits_type::pos_type pos_type;
1990b57cec5SDimitry Andric  typedef typename traits_type::off_type off_type;
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric  // 27.7.1.1.1 Constructor/destructor:
202cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb)
203cb14a3feSDimitry Andric      : __gc_(0) {
204cb14a3feSDimitry Andric    this->init(__sb);
205cb14a3feSDimitry Andric  }
206bdd1243dSDimitry Andric  ~basic_istream() override;
207cb14a3feSDimitry Andric
2080b57cec5SDimitry Andricprotected:
209cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_istream(basic_istream&& __rhs);
2100b57cec5SDimitry Andric
2110b57cec5SDimitry Andric  // 27.7.1.1.2 Assign/swap:
212cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_istream& operator=(basic_istream&& __rhs);
2130b57cec5SDimitry Andric
214cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_istream& __rhs) {
2155f757f3fSDimitry Andric    std::swap(__gc_, __rhs.__gc_);
2160b57cec5SDimitry Andric    basic_ios<char_type, traits_type>::swap(__rhs);
2170b57cec5SDimitry Andric  }
2180b57cec5SDimitry Andric
219*0fca6ea1SDimitry Andricpublic:
2200b57cec5SDimitry Andric  basic_istream(const basic_istream& __rhs)            = delete;
2210b57cec5SDimitry Andric  basic_istream& operator=(const basic_istream& __rhs) = delete;
2220b57cec5SDimitry Andric
2230b57cec5SDimitry Andric  // 27.7.1.1.3 Prefix/suffix:
2240b57cec5SDimitry Andric  class _LIBCPP_TEMPLATE_VIS sentry;
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andric  // 27.7.1.2 Formatted input:
227cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)) {
228cb14a3feSDimitry Andric    return __pf(*this);
229cb14a3feSDimitry Andric  }
2300b57cec5SDimitry Andric
231cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream&
232cb14a3feSDimitry Andric  operator>>(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) {
233cb14a3feSDimitry Andric    __pf(*this);
234cb14a3feSDimitry Andric    return *this;
235cb14a3feSDimitry Andric  }
2360b57cec5SDimitry Andric
237cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(ios_base& (*__pf)(ios_base&)) {
238cb14a3feSDimitry Andric    __pf(*this);
239cb14a3feSDimitry Andric    return *this;
240cb14a3feSDimitry Andric  }
2410b57cec5SDimitry Andric
2420b57cec5SDimitry Andric  basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
2430b57cec5SDimitry Andric  basic_istream& operator>>(bool& __n);
2440b57cec5SDimitry Andric  basic_istream& operator>>(short& __n);
2450b57cec5SDimitry Andric  basic_istream& operator>>(unsigned short& __n);
2460b57cec5SDimitry Andric  basic_istream& operator>>(int& __n);
2470b57cec5SDimitry Andric  basic_istream& operator>>(unsigned int& __n);
2480b57cec5SDimitry Andric  basic_istream& operator>>(long& __n);
2490b57cec5SDimitry Andric  basic_istream& operator>>(unsigned long& __n);
2500b57cec5SDimitry Andric  basic_istream& operator>>(long long& __n);
2510b57cec5SDimitry Andric  basic_istream& operator>>(unsigned long long& __n);
2520b57cec5SDimitry Andric  basic_istream& operator>>(float& __f);
2530b57cec5SDimitry Andric  basic_istream& operator>>(double& __f);
2540b57cec5SDimitry Andric  basic_istream& operator>>(long double& __f);
2550b57cec5SDimitry Andric  basic_istream& operator>>(void*& __p);
2560b57cec5SDimitry Andric
2570b57cec5SDimitry Andric  // 27.7.1.3 Unformatted input:
258cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI streamsize gcount() const { return __gc_; }
2590b57cec5SDimitry Andric  int_type get();
2600b57cec5SDimitry Andric
261cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type& __c) {
2620b57cec5SDimitry Andric    int_type __ch = get();
2630b57cec5SDimitry Andric    if (__ch != traits_type::eof())
2640b57cec5SDimitry Andric      __c = traits_type::to_char_type(__ch);
2650b57cec5SDimitry Andric    return *this;
2660b57cec5SDimitry Andric  }
2670b57cec5SDimitry Andric
268cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type* __s, streamsize __n) {
269cb14a3feSDimitry Andric    return get(__s, __n, this->widen('\n'));
270cb14a3feSDimitry Andric  }
2710b57cec5SDimitry Andric
2720b57cec5SDimitry Andric  basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
2730b57cec5SDimitry Andric
274cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb) {
275cb14a3feSDimitry Andric    return get(__sb, this->widen('\n'));
276cb14a3feSDimitry Andric  }
2770b57cec5SDimitry Andric
2780b57cec5SDimitry Andric  basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
2790b57cec5SDimitry Andric
280cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& getline(char_type* __s, streamsize __n) {
281cb14a3feSDimitry Andric    return getline(__s, __n, this->widen('\n'));
282cb14a3feSDimitry Andric  }
2830b57cec5SDimitry Andric
2840b57cec5SDimitry Andric  basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andric  basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
2870b57cec5SDimitry Andric  int_type peek();
2880b57cec5SDimitry Andric  basic_istream& read(char_type* __s, streamsize __n);
2890b57cec5SDimitry Andric  streamsize readsome(char_type* __s, streamsize __n);
2900b57cec5SDimitry Andric
2910b57cec5SDimitry Andric  basic_istream& putback(char_type __c);
2920b57cec5SDimitry Andric  basic_istream& unget();
2930b57cec5SDimitry Andric  int sync();
2940b57cec5SDimitry Andric
2950b57cec5SDimitry Andric  pos_type tellg();
2960b57cec5SDimitry Andric  basic_istream& seekg(pos_type __pos);
2970b57cec5SDimitry Andric  basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
2980b57cec5SDimitry Andric};
2990b57cec5SDimitry Andric
3000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
301cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry {
3020b57cec5SDimitry Andric  bool __ok_;
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andricpublic:
3050b57cec5SDimitry Andric  explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
3060b57cec5SDimitry Andric  //    ~sentry() = default;
3070b57cec5SDimitry Andric
308cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; }
3090eae32dcSDimitry Andric
3100eae32dcSDimitry Andric  sentry(const sentry&)            = delete;
3110eae32dcSDimitry Andric  sentry& operator=(const sentry&) = delete;
3120b57cec5SDimitry Andric};
3130b57cec5SDimitry Andric
3140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
315cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws) : __ok_(false) {
316cb14a3feSDimitry Andric  if (__is.good()) {
3170b57cec5SDimitry Andric    if (__is.tie())
3180b57cec5SDimitry Andric      __is.tie()->flush();
319cb14a3feSDimitry Andric    if (!__noskipws && (__is.flags() & ios_base::skipws)) {
3200b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
321bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
3220b57cec5SDimitry Andric      _Ip __i(__is);
3230b57cec5SDimitry Andric      _Ip __eof;
3240b57cec5SDimitry Andric      for (; __i != __eof; ++__i)
3250b57cec5SDimitry Andric        if (!__ct.is(__ct.space, *__i))
3260b57cec5SDimitry Andric          break;
3270b57cec5SDimitry Andric      if (__i == __eof)
3280b57cec5SDimitry Andric        __is.setstate(ios_base::failbit | ios_base::eofbit);
3290b57cec5SDimitry Andric    }
3300b57cec5SDimitry Andric    __ok_ = __is.good();
331cb14a3feSDimitry Andric  } else
3320b57cec5SDimitry Andric    __is.setstate(ios_base::failbit);
3330b57cec5SDimitry Andric}
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
336cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs) : __gc_(__rhs.__gc_) {
3370b57cec5SDimitry Andric  __rhs.__gc_ = 0;
3380b57cec5SDimitry Andric  this->move(__rhs);
3390b57cec5SDimitry Andric}
3400b57cec5SDimitry Andric
3410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
342cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs) {
3430b57cec5SDimitry Andric  swap(__rhs);
3440b57cec5SDimitry Andric  return *this;
3450b57cec5SDimitry Andric}
3460b57cec5SDimitry Andric
3470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
348cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::~basic_istream() {}
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
351cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
3520b57cec5SDimitry Andric__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
3530b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
3540b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __s(__is);
355cb14a3feSDimitry Andric  if (__s) {
35606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
357cb14a3feSDimitry Andric    try {
35806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3590b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3600b57cec5SDimitry Andric      typedef num_get<_CharT, _Ip> _Fp;
361bdd1243dSDimitry Andric      std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
36206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
363cb14a3feSDimitry Andric    } catch (...) {
3640b57cec5SDimitry Andric      __state |= ios_base::badbit;
3650b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
366cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
3670b57cec5SDimitry Andric        throw;
3680b57cec5SDimitry Andric      }
3690b57cec5SDimitry Andric    }
3700b57cec5SDimitry Andric#endif
3710b57cec5SDimitry Andric    __is.setstate(__state);
3720b57cec5SDimitry Andric  }
3730b57cec5SDimitry Andric  return __is;
3740b57cec5SDimitry Andric}
3750b57cec5SDimitry Andric
3760b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
377cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) {
3785f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned short>(*this, __n);
3790b57cec5SDimitry Andric}
3800b57cec5SDimitry Andric
3810b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
382cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) {
3835f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned int>(*this, __n);
3840b57cec5SDimitry Andric}
3850b57cec5SDimitry Andric
3860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
387cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long& __n) {
3885f757f3fSDimitry Andric  return std::__input_arithmetic<long>(*this, __n);
3890b57cec5SDimitry Andric}
3900b57cec5SDimitry Andric
3910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
392cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) {
3935f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned long>(*this, __n);
3940b57cec5SDimitry Andric}
3950b57cec5SDimitry Andric
3960b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
397cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long long& __n) {
3985f757f3fSDimitry Andric  return std::__input_arithmetic<long long>(*this, __n);
3990b57cec5SDimitry Andric}
4000b57cec5SDimitry Andric
4010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
402cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) {
4035f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned long long>(*this, __n);
4040b57cec5SDimitry Andric}
4050b57cec5SDimitry Andric
4060b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
407cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(float& __n) {
4085f757f3fSDimitry Andric  return std::__input_arithmetic<float>(*this, __n);
4090b57cec5SDimitry Andric}
4100b57cec5SDimitry Andric
4110b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
412cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(double& __n) {
4135f757f3fSDimitry Andric  return std::__input_arithmetic<double>(*this, __n);
4140b57cec5SDimitry Andric}
4150b57cec5SDimitry Andric
4160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
417cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long double& __n) {
4185f757f3fSDimitry Andric  return std::__input_arithmetic<long double>(*this, __n);
4190b57cec5SDimitry Andric}
4200b57cec5SDimitry Andric
4210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
422cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(bool& __n) {
4235f757f3fSDimitry Andric  return std::__input_arithmetic<bool>(*this, __n);
4240b57cec5SDimitry Andric}
4250b57cec5SDimitry Andric
4260b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
427cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(void*& __n) {
4285f757f3fSDimitry Andric  return std::__input_arithmetic<void*>(*this, __n);
4290b57cec5SDimitry Andric}
4300b57cec5SDimitry Andric
4310b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
432cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
4330b57cec5SDimitry Andric__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
4340b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
4350b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __s(__is);
436cb14a3feSDimitry Andric  if (__s) {
43706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
438cb14a3feSDimitry Andric    try {
43906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4400b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
4410b57cec5SDimitry Andric      typedef num_get<_CharT, _Ip> _Fp;
4420b57cec5SDimitry Andric      long __temp;
443bdd1243dSDimitry Andric      std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
444cb14a3feSDimitry Andric      if (__temp < numeric_limits<_Tp>::min()) {
4450b57cec5SDimitry Andric        __state |= ios_base::failbit;
4460b57cec5SDimitry Andric        __n = numeric_limits<_Tp>::min();
447cb14a3feSDimitry Andric      } else if (__temp > numeric_limits<_Tp>::max()) {
4480b57cec5SDimitry Andric        __state |= ios_base::failbit;
4490b57cec5SDimitry Andric        __n = numeric_limits<_Tp>::max();
450cb14a3feSDimitry Andric      } else {
4510b57cec5SDimitry Andric        __n = static_cast<_Tp>(__temp);
4520b57cec5SDimitry Andric      }
45306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
454cb14a3feSDimitry Andric    } catch (...) {
4550b57cec5SDimitry Andric      __state |= ios_base::badbit;
4560b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
457cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
4580b57cec5SDimitry Andric        throw;
4590b57cec5SDimitry Andric      }
4600b57cec5SDimitry Andric    }
46106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4620b57cec5SDimitry Andric    __is.setstate(__state);
4630b57cec5SDimitry Andric  }
4640b57cec5SDimitry Andric  return __is;
4650b57cec5SDimitry Andric}
4660b57cec5SDimitry Andric
4670b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
468cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(short& __n) {
4695f757f3fSDimitry Andric  return std::__input_arithmetic_with_numeric_limits<short>(*this, __n);
4700b57cec5SDimitry Andric}
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
473cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(int& __n) {
4745f757f3fSDimitry Andric  return std::__input_arithmetic_with_numeric_limits<int>(*this, __n);
4750b57cec5SDimitry Andric}
4760b57cec5SDimitry Andric
4770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
478cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
479cb14a3feSDimitry Andric__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n) {
4800b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
4810b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
482cb14a3feSDimitry Andric  if (__sen) {
48306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
484cb14a3feSDimitry Andric    try {
4850b57cec5SDimitry Andric#endif
4860b57cec5SDimitry Andric      _CharT* __s               = __p;
487bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
488cb14a3feSDimitry Andric      while (__s != __p + (__n - 1)) {
4890b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
490cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
4910b57cec5SDimitry Andric          __state |= ios_base::eofbit;
4920b57cec5SDimitry Andric          break;
4930b57cec5SDimitry Andric        }
4940b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
4950b57cec5SDimitry Andric        if (__ct.is(__ct.space, __ch))
4960b57cec5SDimitry Andric          break;
4970b57cec5SDimitry Andric        *__s++ = __ch;
4980b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
4990b57cec5SDimitry Andric      }
5000b57cec5SDimitry Andric      *__s = _CharT();
5010b57cec5SDimitry Andric      __is.width(0);
5020b57cec5SDimitry Andric      if (__s == __p)
5030b57cec5SDimitry Andric        __state |= ios_base::failbit;
50406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
505cb14a3feSDimitry Andric    } catch (...) {
5060b57cec5SDimitry Andric      __state |= ios_base::badbit;
5070b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
508cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
5090b57cec5SDimitry Andric        throw;
5100b57cec5SDimitry Andric      }
5110b57cec5SDimitry Andric    }
5120b57cec5SDimitry Andric#endif
5130b57cec5SDimitry Andric    __is.setstate(__state);
5140b57cec5SDimitry Andric  }
5150b57cec5SDimitry Andric  return __is;
5160b57cec5SDimitry Andric}
5170b57cec5SDimitry Andric
51806c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20
5190b57cec5SDimitry Andric
5200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Np>
521cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
522cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np]) {
5230b57cec5SDimitry Andric  size_t __n = _Np;
5240b57cec5SDimitry Andric  if (__is.width() > 0)
5255f757f3fSDimitry Andric    __n = std::min(size_t(__is.width()), _Np);
5265f757f3fSDimitry Andric  return std::__input_c_string(__is, __buf, __n);
5270b57cec5SDimitry Andric}
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np>
530cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
531cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np]) {
5320b57cec5SDimitry Andric  return __is >> (char(&)[_Np])__buf;
5330b57cec5SDimitry Andric}
5340b57cec5SDimitry Andric
5350b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np>
536cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
537cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np]) {
5380b57cec5SDimitry Andric  return __is >> (char(&)[_Np])__buf;
5390b57cec5SDimitry Andric}
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andric#else
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
544cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
545cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s) {
5460b57cec5SDimitry Andric  streamsize __n = __is.width();
5470b57cec5SDimitry Andric  if (__n <= 0)
5480b57cec5SDimitry Andric    __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
5495f757f3fSDimitry Andric  return std::__input_c_string(__is, __s, size_t(__n));
5500b57cec5SDimitry Andric}
5510b57cec5SDimitry Andric
5520b57cec5SDimitry Andrictemplate <class _Traits>
553cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
554cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s) {
5550b57cec5SDimitry Andric  return __is >> (char*)__s;
5560b57cec5SDimitry Andric}
5570b57cec5SDimitry Andric
5580b57cec5SDimitry Andrictemplate <class _Traits>
559cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
560cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char* __s) {
5610b57cec5SDimitry Andric  return __is >> (char*)__s;
5620b57cec5SDimitry Andric}
5630b57cec5SDimitry Andric
56406c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 20
5650b57cec5SDimitry Andric
5660b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
567cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c) {
5680b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
5690b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
570cb14a3feSDimitry Andric  if (__sen) {
57106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
572cb14a3feSDimitry Andric    try {
5730b57cec5SDimitry Andric#endif
5740b57cec5SDimitry Andric      typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
5750b57cec5SDimitry Andric      if (_Traits::eq_int_type(__i, _Traits::eof()))
5760b57cec5SDimitry Andric        __state |= ios_base::eofbit | ios_base::failbit;
5770b57cec5SDimitry Andric      else
5780b57cec5SDimitry Andric        __c = _Traits::to_char_type(__i);
57906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
580cb14a3feSDimitry Andric    } catch (...) {
5810b57cec5SDimitry Andric      __state |= ios_base::badbit;
5820b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
583cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
5840b57cec5SDimitry Andric        throw;
5850b57cec5SDimitry Andric      }
5860b57cec5SDimitry Andric    }
5870b57cec5SDimitry Andric#endif
5880b57cec5SDimitry Andric    __is.setstate(__state);
5890b57cec5SDimitry Andric  }
5900b57cec5SDimitry Andric  return __is;
5910b57cec5SDimitry Andric}
5920b57cec5SDimitry Andric
5930b57cec5SDimitry Andrictemplate <class _Traits>
594cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
595cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c) {
5960b57cec5SDimitry Andric  return __is >> (char&)__c;
5970b57cec5SDimitry Andric}
5980b57cec5SDimitry Andric
5990b57cec5SDimitry Andrictemplate <class _Traits>
600cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
601cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char& __c) {
6020b57cec5SDimitry Andric  return __is >> (char&)__c;
6030b57cec5SDimitry Andric}
6040b57cec5SDimitry Andric
6050b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
6060b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
607cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb) {
6080b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
6090b57cec5SDimitry Andric  __gc_                     = 0;
6100b57cec5SDimitry Andric  sentry __s(*this, true);
611cb14a3feSDimitry Andric  if (__s) {
612cb14a3feSDimitry Andric    if (__sb) {
61306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
614cb14a3feSDimitry Andric      try {
61506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
616cb14a3feSDimitry Andric        while (true) {
6170b57cec5SDimitry Andric          typename traits_type::int_type __i = this->rdbuf()->sgetc();
618cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, _Traits::eof())) {
6190b57cec5SDimitry Andric            __state |= ios_base::eofbit;
6200b57cec5SDimitry Andric            break;
6210b57cec5SDimitry Andric          }
622cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__sb->sputc(traits_type::to_char_type(__i)), traits_type::eof()))
6230b57cec5SDimitry Andric            break;
6245f757f3fSDimitry Andric          __inc_gcount();
6250b57cec5SDimitry Andric          this->rdbuf()->sbumpc();
6260b57cec5SDimitry Andric        }
6270b57cec5SDimitry Andric        if (__gc_ == 0)
6280b57cec5SDimitry Andric          __state |= ios_base::failbit;
62906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
630cb14a3feSDimitry Andric      } catch (...) {
6310b57cec5SDimitry Andric        __state |= ios_base::badbit;
6320b57cec5SDimitry Andric        if (__gc_ == 0)
6330b57cec5SDimitry Andric          __state |= ios_base::failbit;
6340b57cec5SDimitry Andric
6350b57cec5SDimitry Andric        this->__setstate_nothrow(__state);
636cb14a3feSDimitry Andric        if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit) {
6370b57cec5SDimitry Andric          throw;
6380b57cec5SDimitry Andric        }
6390b57cec5SDimitry Andric      }
64006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
641cb14a3feSDimitry Andric    } else {
6420b57cec5SDimitry Andric      __state |= ios_base::failbit;
6430b57cec5SDimitry Andric    }
6440b57cec5SDimitry Andric    this->setstate(__state);
6450b57cec5SDimitry Andric  }
6460b57cec5SDimitry Andric  return *this;
6470b57cec5SDimitry Andric}
6480b57cec5SDimitry Andric
6490b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
650cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::get() {
6510b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
6520b57cec5SDimitry Andric  __gc_                     = 0;
6530b57cec5SDimitry Andric  int_type __r              = traits_type::eof();
6540b57cec5SDimitry Andric  sentry __s(*this, true);
655cb14a3feSDimitry Andric  if (__s) {
65606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
657cb14a3feSDimitry Andric    try {
6580b57cec5SDimitry Andric#endif
6590b57cec5SDimitry Andric      __r = this->rdbuf()->sbumpc();
6600b57cec5SDimitry Andric      if (traits_type::eq_int_type(__r, traits_type::eof()))
6610b57cec5SDimitry Andric        __state |= ios_base::failbit | ios_base::eofbit;
6620b57cec5SDimitry Andric      else
6630b57cec5SDimitry Andric        __gc_ = 1;
66406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
665cb14a3feSDimitry Andric    } catch (...) {
6660b57cec5SDimitry Andric      this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
667cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
6680b57cec5SDimitry Andric        throw;
6690b57cec5SDimitry Andric      }
6700b57cec5SDimitry Andric    }
6710b57cec5SDimitry Andric#endif
6720b57cec5SDimitry Andric    this->setstate(__state);
6730b57cec5SDimitry Andric  }
6740b57cec5SDimitry Andric  return __r;
6750b57cec5SDimitry Andric}
6760b57cec5SDimitry Andric
6770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
678cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm) {
6790b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
6800b57cec5SDimitry Andric  __gc_                     = 0;
6810b57cec5SDimitry Andric  sentry __sen(*this, true);
682cb14a3feSDimitry Andric  if (__sen) {
683cb14a3feSDimitry Andric    if (__n > 0) {
68406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
685cb14a3feSDimitry Andric      try {
6860b57cec5SDimitry Andric#endif
687cb14a3feSDimitry Andric        while (__gc_ < __n - 1) {
6880b57cec5SDimitry Andric          int_type __i = this->rdbuf()->sgetc();
689cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, traits_type::eof())) {
6900b57cec5SDimitry Andric            __state |= ios_base::eofbit;
6910b57cec5SDimitry Andric            break;
6920b57cec5SDimitry Andric          }
6930b57cec5SDimitry Andric          char_type __ch = traits_type::to_char_type(__i);
6940b57cec5SDimitry Andric          if (traits_type::eq(__ch, __dlm))
6950b57cec5SDimitry Andric            break;
6960b57cec5SDimitry Andric          *__s++ = __ch;
6975f757f3fSDimitry Andric          __inc_gcount();
6980b57cec5SDimitry Andric          this->rdbuf()->sbumpc();
6990b57cec5SDimitry Andric        }
7000b57cec5SDimitry Andric        if (__gc_ == 0)
7010b57cec5SDimitry Andric          __state |= ios_base::failbit;
70206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
703cb14a3feSDimitry Andric      } catch (...) {
7040b57cec5SDimitry Andric        __state |= ios_base::badbit;
7050b57cec5SDimitry Andric        this->__setstate_nothrow(__state);
706cb14a3feSDimitry Andric        if (this->exceptions() & ios_base::badbit) {
7070b57cec5SDimitry Andric          if (__n > 0)
7080b57cec5SDimitry Andric            *__s = char_type();
7090b57cec5SDimitry Andric          throw;
7100b57cec5SDimitry Andric        }
7110b57cec5SDimitry Andric      }
7120b57cec5SDimitry Andric#endif
713cb14a3feSDimitry Andric    } else {
7140b57cec5SDimitry Andric      __state |= ios_base::failbit;
7150b57cec5SDimitry Andric    }
7160b57cec5SDimitry Andric
7170b57cec5SDimitry Andric    if (__n > 0)
7180b57cec5SDimitry Andric      *__s = char_type();
7190b57cec5SDimitry Andric    this->setstate(__state);
7200b57cec5SDimitry Andric  }
7210b57cec5SDimitry Andric  if (__n > 0)
7220b57cec5SDimitry Andric    *__s = char_type();
7230b57cec5SDimitry Andric  return *this;
7240b57cec5SDimitry Andric}
7250b57cec5SDimitry Andric
7260b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
7270b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
728cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm) {
7290b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
7300b57cec5SDimitry Andric  __gc_                     = 0;
7310b57cec5SDimitry Andric  sentry __sen(*this, true);
732cb14a3feSDimitry Andric  if (__sen) {
73306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
734cb14a3feSDimitry Andric    try {
73506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
736cb14a3feSDimitry Andric      while (true) {
7370b57cec5SDimitry Andric        typename traits_type::int_type __i = this->rdbuf()->sgetc();
738cb14a3feSDimitry Andric        if (traits_type::eq_int_type(__i, traits_type::eof())) {
7390b57cec5SDimitry Andric          __state |= ios_base::eofbit;
7400b57cec5SDimitry Andric          break;
7410b57cec5SDimitry Andric        }
7420b57cec5SDimitry Andric        char_type __ch = traits_type::to_char_type(__i);
7430b57cec5SDimitry Andric        if (traits_type::eq(__ch, __dlm))
7440b57cec5SDimitry Andric          break;
7450b57cec5SDimitry Andric        if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
7460b57cec5SDimitry Andric          break;
7475f757f3fSDimitry Andric        __inc_gcount();
7480b57cec5SDimitry Andric        this->rdbuf()->sbumpc();
7490b57cec5SDimitry Andric      }
75006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
751cb14a3feSDimitry Andric    } catch (...) {
7520b57cec5SDimitry Andric      __state |= ios_base::badbit;
7530b57cec5SDimitry Andric      // according to the spec, exceptions here are caught but not rethrown
7540b57cec5SDimitry Andric    }
75506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
7560b57cec5SDimitry Andric    if (__gc_ == 0)
7570b57cec5SDimitry Andric      __state |= ios_base::failbit;
7580b57cec5SDimitry Andric    this->setstate(__state);
7590b57cec5SDimitry Andric  }
7600b57cec5SDimitry Andric  return *this;
7610b57cec5SDimitry Andric}
7620b57cec5SDimitry Andric
7630b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
7640b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
765cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm) {
7660b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
7670b57cec5SDimitry Andric  __gc_                     = 0;
7680b57cec5SDimitry Andric  sentry __sen(*this, true);
769cb14a3feSDimitry Andric  if (__sen) {
77006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
771cb14a3feSDimitry Andric    try {
77206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
773cb14a3feSDimitry Andric      while (true) {
7740b57cec5SDimitry Andric        typename traits_type::int_type __i = this->rdbuf()->sgetc();
775cb14a3feSDimitry Andric        if (traits_type::eq_int_type(__i, traits_type::eof())) {
7760b57cec5SDimitry Andric          __state |= ios_base::eofbit;
7770b57cec5SDimitry Andric          break;
7780b57cec5SDimitry Andric        }
7790b57cec5SDimitry Andric        char_type __ch = traits_type::to_char_type(__i);
780cb14a3feSDimitry Andric        if (traits_type::eq(__ch, __dlm)) {
7810b57cec5SDimitry Andric          this->rdbuf()->sbumpc();
7825f757f3fSDimitry Andric          __inc_gcount();
7830b57cec5SDimitry Andric          break;
7840b57cec5SDimitry Andric        }
785cb14a3feSDimitry Andric        if (__gc_ >= __n - 1) {
7860b57cec5SDimitry Andric          __state |= ios_base::failbit;
7870b57cec5SDimitry Andric          break;
7880b57cec5SDimitry Andric        }
7890b57cec5SDimitry Andric        *__s++ = __ch;
7900b57cec5SDimitry Andric        this->rdbuf()->sbumpc();
7915f757f3fSDimitry Andric        __inc_gcount();
7920b57cec5SDimitry Andric      }
79306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
794cb14a3feSDimitry Andric    } catch (...) {
7950b57cec5SDimitry Andric      __state |= ios_base::badbit;
7960b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
797cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
7980b57cec5SDimitry Andric        if (__n > 0)
7990b57cec5SDimitry Andric          *__s = char_type();
8000b57cec5SDimitry Andric        if (__gc_ == 0)
8010b57cec5SDimitry Andric          __state |= ios_base::failbit;
8020b57cec5SDimitry Andric        throw;
8030b57cec5SDimitry Andric      }
8040b57cec5SDimitry Andric    }
80506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8060b57cec5SDimitry Andric  }
8070b57cec5SDimitry Andric  if (__n > 0)
8080b57cec5SDimitry Andric    *__s = char_type();
8090b57cec5SDimitry Andric  if (__gc_ == 0)
8100b57cec5SDimitry Andric    __state |= ios_base::failbit;
8110b57cec5SDimitry Andric  this->setstate(__state);
8120b57cec5SDimitry Andric  return *this;
8130b57cec5SDimitry Andric}
8140b57cec5SDimitry Andric
8150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
816cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) {
8170b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
8180b57cec5SDimitry Andric  __gc_                     = 0;
8190b57cec5SDimitry Andric  sentry __sen(*this, true);
820cb14a3feSDimitry Andric  if (__sen) {
82106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
822cb14a3feSDimitry Andric    try {
82306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
824cb14a3feSDimitry Andric      if (__n == numeric_limits<streamsize>::max()) {
825cb14a3feSDimitry Andric        while (true) {
8260b57cec5SDimitry Andric          typename traits_type::int_type __i = this->rdbuf()->sbumpc();
827cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, traits_type::eof())) {
8280b57cec5SDimitry Andric            __state |= ios_base::eofbit;
8290b57cec5SDimitry Andric            break;
8300b57cec5SDimitry Andric          }
8315f757f3fSDimitry Andric          __inc_gcount();
8320b57cec5SDimitry Andric          if (traits_type::eq_int_type(__i, __dlm))
8330b57cec5SDimitry Andric            break;
8340b57cec5SDimitry Andric        }
835cb14a3feSDimitry Andric      } else {
836cb14a3feSDimitry Andric        while (__gc_ < __n) {
8370b57cec5SDimitry Andric          typename traits_type::int_type __i = this->rdbuf()->sbumpc();
838cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, traits_type::eof())) {
8390b57cec5SDimitry Andric            __state |= ios_base::eofbit;
8400b57cec5SDimitry Andric            break;
8410b57cec5SDimitry Andric          }
8425f757f3fSDimitry Andric          __inc_gcount();
8430b57cec5SDimitry Andric          if (traits_type::eq_int_type(__i, __dlm))
8440b57cec5SDimitry Andric            break;
8450b57cec5SDimitry Andric        }
8460b57cec5SDimitry Andric      }
84706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
848cb14a3feSDimitry Andric    } catch (...) {
8490b57cec5SDimitry Andric      __state |= ios_base::badbit;
8500b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
851cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
8520b57cec5SDimitry Andric        throw;
8530b57cec5SDimitry Andric      }
8540b57cec5SDimitry Andric    }
85506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8560b57cec5SDimitry Andric    this->setstate(__state);
8570b57cec5SDimitry Andric  }
8580b57cec5SDimitry Andric  return *this;
8590b57cec5SDimitry Andric}
8600b57cec5SDimitry Andric
8610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
862cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::peek() {
8630b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
8640b57cec5SDimitry Andric  __gc_                     = 0;
8650b57cec5SDimitry Andric  int_type __r              = traits_type::eof();
8660b57cec5SDimitry Andric  sentry __sen(*this, true);
867cb14a3feSDimitry Andric  if (__sen) {
86806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
869cb14a3feSDimitry Andric    try {
87006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8710b57cec5SDimitry Andric      __r = this->rdbuf()->sgetc();
8720b57cec5SDimitry Andric      if (traits_type::eq_int_type(__r, traits_type::eof()))
8730b57cec5SDimitry Andric        __state |= ios_base::eofbit;
87406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
875cb14a3feSDimitry Andric    } catch (...) {
8760b57cec5SDimitry Andric      __state |= ios_base::badbit;
8770b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
878cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
8790b57cec5SDimitry Andric        throw;
8800b57cec5SDimitry Andric      }
8810b57cec5SDimitry Andric    }
88206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8830b57cec5SDimitry Andric    this->setstate(__state);
8840b57cec5SDimitry Andric  }
8850b57cec5SDimitry Andric  return __r;
8860b57cec5SDimitry Andric}
8870b57cec5SDimitry Andric
8880b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
889cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) {
8900b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
8910b57cec5SDimitry Andric  __gc_                     = 0;
8920b57cec5SDimitry Andric  sentry __sen(*this, true);
893cb14a3feSDimitry Andric  if (__sen) {
89406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
895cb14a3feSDimitry Andric    try {
89606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8970b57cec5SDimitry Andric      __gc_ = this->rdbuf()->sgetn(__s, __n);
8980b57cec5SDimitry Andric      if (__gc_ != __n)
8990b57cec5SDimitry Andric        __state |= ios_base::failbit | ios_base::eofbit;
90006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
901cb14a3feSDimitry Andric    } catch (...) {
9020b57cec5SDimitry Andric      __state |= ios_base::badbit;
9030b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
904cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
9050b57cec5SDimitry Andric        throw;
9060b57cec5SDimitry Andric      }
9070b57cec5SDimitry Andric    }
90806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
909cb14a3feSDimitry Andric  } else {
9100b57cec5SDimitry Andric    __state |= ios_base::failbit;
9110b57cec5SDimitry Andric  }
9120b57cec5SDimitry Andric  this->setstate(__state);
9130b57cec5SDimitry Andric  return *this;
9140b57cec5SDimitry Andric}
9150b57cec5SDimitry Andric
9160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
917cb14a3feSDimitry Andricstreamsize basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n) {
9180b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
9190b57cec5SDimitry Andric  __gc_                     = 0;
9200b57cec5SDimitry Andric  sentry __sen(*this, true);
921cb14a3feSDimitry Andric  if (__sen) {
92206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
923cb14a3feSDimitry Andric    try {
92406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
9250b57cec5SDimitry Andric      streamsize __c = this->rdbuf()->in_avail();
926cb14a3feSDimitry Andric      switch (__c) {
9270b57cec5SDimitry Andric      case -1:
9280b57cec5SDimitry Andric        __state |= ios_base::eofbit;
9290b57cec5SDimitry Andric        break;
9300b57cec5SDimitry Andric      case 0:
9310b57cec5SDimitry Andric        break;
9320b57cec5SDimitry Andric      default:
9335f757f3fSDimitry Andric        __n   = std::min(__c, __n);
9340b57cec5SDimitry Andric        __gc_ = this->rdbuf()->sgetn(__s, __n);
9350b57cec5SDimitry Andric        if (__gc_ != __n)
9360b57cec5SDimitry Andric          __state |= ios_base::failbit | ios_base::eofbit;
9370b57cec5SDimitry Andric        break;
9380b57cec5SDimitry Andric      }
93906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
940cb14a3feSDimitry Andric    } catch (...) {
9410b57cec5SDimitry Andric      __state |= ios_base::badbit;
9420b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
943cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
9440b57cec5SDimitry Andric        throw;
9450b57cec5SDimitry Andric      }
9460b57cec5SDimitry Andric    }
94706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
948cb14a3feSDimitry Andric  } else {
9490b57cec5SDimitry Andric    __state |= ios_base::failbit;
9500b57cec5SDimitry Andric  }
9510b57cec5SDimitry Andric  this->setstate(__state);
9520b57cec5SDimitry Andric  return __gc_;
9530b57cec5SDimitry Andric}
9540b57cec5SDimitry Andric
9550b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
956cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::putback(char_type __c) {
9570b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
9580b57cec5SDimitry Andric  __gc_                     = 0;
9590b57cec5SDimitry Andric  this->clear(__state);
9600b57cec5SDimitry Andric  sentry __sen(*this, true);
961cb14a3feSDimitry Andric  if (__sen) {
96206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
963cb14a3feSDimitry Andric    try {
96406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
965e8d8bef9SDimitry Andric      if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
9660b57cec5SDimitry Andric        __state |= ios_base::badbit;
96706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
968cb14a3feSDimitry Andric    } catch (...) {
9690b57cec5SDimitry Andric      __state |= ios_base::badbit;
9700b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
971cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
9720b57cec5SDimitry Andric        throw;
9730b57cec5SDimitry Andric      }
9740b57cec5SDimitry Andric    }
97506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
976cb14a3feSDimitry Andric  } else {
9770b57cec5SDimitry Andric    __state |= ios_base::failbit;
9780b57cec5SDimitry Andric  }
9790b57cec5SDimitry Andric  this->setstate(__state);
9800b57cec5SDimitry Andric  return *this;
9810b57cec5SDimitry Andric}
9820b57cec5SDimitry Andric
9830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
984cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() {
9850b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
9860b57cec5SDimitry Andric  __gc_                     = 0;
9870b57cec5SDimitry Andric  this->clear(__state);
9880b57cec5SDimitry Andric  sentry __sen(*this, true);
989cb14a3feSDimitry Andric  if (__sen) {
99006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
991cb14a3feSDimitry Andric    try {
99206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
993e8d8bef9SDimitry Andric      if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
9940b57cec5SDimitry Andric        __state |= ios_base::badbit;
99506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
996cb14a3feSDimitry Andric    } catch (...) {
9970b57cec5SDimitry Andric      __state |= ios_base::badbit;
9980b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
999cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
10000b57cec5SDimitry Andric        throw;
10010b57cec5SDimitry Andric      }
10020b57cec5SDimitry Andric    }
100306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1004cb14a3feSDimitry Andric  } else {
10050b57cec5SDimitry Andric    __state |= ios_base::failbit;
10060b57cec5SDimitry Andric  }
10070b57cec5SDimitry Andric  this->setstate(__state);
10080b57cec5SDimitry Andric  return *this;
10090b57cec5SDimitry Andric}
10100b57cec5SDimitry Andric
10110b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1012cb14a3feSDimitry Andricint basic_istream<_CharT, _Traits>::sync() {
10130b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
10140b57cec5SDimitry Andric  sentry __sen(*this, true);
1015*0fca6ea1SDimitry Andric  if (this->rdbuf() == nullptr)
1016*0fca6ea1SDimitry Andric    return -1;
1017*0fca6ea1SDimitry Andric
1018*0fca6ea1SDimitry Andric  int __r = 0;
1019cb14a3feSDimitry Andric  if (__sen) {
102006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1021cb14a3feSDimitry Andric    try {
102206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1023cb14a3feSDimitry Andric      if (this->rdbuf()->pubsync() == -1) {
10240b57cec5SDimitry Andric        __state |= ios_base::badbit;
1025*0fca6ea1SDimitry Andric        __r = -1;
10260b57cec5SDimitry Andric      }
102706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1028cb14a3feSDimitry Andric    } catch (...) {
10290b57cec5SDimitry Andric      __state |= ios_base::badbit;
10300b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1031cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
10320b57cec5SDimitry Andric        throw;
10330b57cec5SDimitry Andric      }
10340b57cec5SDimitry Andric    }
103506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10360b57cec5SDimitry Andric    this->setstate(__state);
10370b57cec5SDimitry Andric  }
10380b57cec5SDimitry Andric  return __r;
10390b57cec5SDimitry Andric}
10400b57cec5SDimitry Andric
10410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1042cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::pos_type basic_istream<_CharT, _Traits>::tellg() {
10430b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
10440b57cec5SDimitry Andric  pos_type __r(-1);
10450b57cec5SDimitry Andric  sentry __sen(*this, true);
1046cb14a3feSDimitry Andric  if (__sen) {
104706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1048cb14a3feSDimitry Andric    try {
104906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10500b57cec5SDimitry Andric      __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
105106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1052cb14a3feSDimitry Andric    } catch (...) {
10530b57cec5SDimitry Andric      __state |= ios_base::badbit;
10540b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1055cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
10560b57cec5SDimitry Andric        throw;
10570b57cec5SDimitry Andric      }
10580b57cec5SDimitry Andric    }
105906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10600b57cec5SDimitry Andric    this->setstate(__state);
10610b57cec5SDimitry Andric  }
10620b57cec5SDimitry Andric  return __r;
10630b57cec5SDimitry Andric}
10640b57cec5SDimitry Andric
10650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1066cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(pos_type __pos) {
10670b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
10680b57cec5SDimitry Andric  this->clear(__state);
10690b57cec5SDimitry Andric  sentry __sen(*this, true);
1070cb14a3feSDimitry Andric  if (__sen) {
107106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1072cb14a3feSDimitry Andric    try {
107306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10740b57cec5SDimitry Andric      if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
10750b57cec5SDimitry Andric        __state |= ios_base::failbit;
107606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1077cb14a3feSDimitry Andric    } catch (...) {
10780b57cec5SDimitry Andric      __state |= ios_base::badbit;
10790b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1080cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
10810b57cec5SDimitry Andric        throw;
10820b57cec5SDimitry Andric      }
10830b57cec5SDimitry Andric    }
108406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10850b57cec5SDimitry Andric    this->setstate(__state);
10860b57cec5SDimitry Andric  }
10870b57cec5SDimitry Andric  return *this;
10880b57cec5SDimitry Andric}
10890b57cec5SDimitry Andric
10900b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1091cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) {
10920b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
10930b57cec5SDimitry Andric  this->clear(__state);
10940b57cec5SDimitry Andric  sentry __sen(*this, true);
1095cb14a3feSDimitry Andric  if (__sen) {
109606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1097cb14a3feSDimitry Andric    try {
109806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10990b57cec5SDimitry Andric      if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
11000b57cec5SDimitry Andric        __state |= ios_base::failbit;
110106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1102cb14a3feSDimitry Andric    } catch (...) {
11030b57cec5SDimitry Andric      __state |= ios_base::badbit;
11040b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1105cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
11060b57cec5SDimitry Andric        throw;
11070b57cec5SDimitry Andric      }
11080b57cec5SDimitry Andric    }
110906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
11100b57cec5SDimitry Andric    this->setstate(__state);
11110b57cec5SDimitry Andric  }
11120b57cec5SDimitry Andric  return *this;
11130b57cec5SDimitry Andric}
11140b57cec5SDimitry Andric
11150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1116cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& ws(basic_istream<_CharT, _Traits>& __is) {
11170b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
11180b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1119cb14a3feSDimitry Andric  if (__sen) {
112006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1121cb14a3feSDimitry Andric    try {
112206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1123bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
1124cb14a3feSDimitry Andric      while (true) {
11250b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1126cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
11270b57cec5SDimitry Andric          __state |= ios_base::eofbit;
11280b57cec5SDimitry Andric          break;
11290b57cec5SDimitry Andric        }
11300b57cec5SDimitry Andric        if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
11310b57cec5SDimitry Andric          break;
11320b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
11330b57cec5SDimitry Andric      }
113406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1135cb14a3feSDimitry Andric    } catch (...) {
11360b57cec5SDimitry Andric      __state |= ios_base::badbit;
11370b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1138cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
11390b57cec5SDimitry Andric        throw;
11400b57cec5SDimitry Andric      }
11410b57cec5SDimitry Andric    }
114206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
11430b57cec5SDimitry Andric    __is.setstate(__state);
11440b57cec5SDimitry Andric  }
11450b57cec5SDimitry Andric  return __is;
11460b57cec5SDimitry Andric}
11470b57cec5SDimitry Andric
1148e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = void>
1149e8d8bef9SDimitry Andricstruct __is_istreamable : false_type {};
1150e8d8bef9SDimitry Andric
1151e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp>
1152cb14a3feSDimitry Andricstruct __is_istreamable<_Stream, _Tp, decltype(std::declval<_Stream>() >> std::declval<_Tp>(), void())> : true_type {};
1153e8d8bef9SDimitry Andric
1154cb14a3feSDimitry Andrictemplate <class _Stream,
1155cb14a3feSDimitry Andric          class _Tp,
1156cb14a3feSDimitry Andric          __enable_if_t< _And<is_base_of<ios_base, _Stream>, __is_istreamable<_Stream&, _Tp&&> >::value, int> = 0>
1157cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI _Stream&& operator>>(_Stream&& __is, _Tp&& __x) {
11585f757f3fSDimitry Andric  __is >> std::forward<_Tp>(__x);
11595f757f3fSDimitry Andric  return std::move(__is);
11600b57cec5SDimitry Andric}
11610b57cec5SDimitry Andric
11620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
11630b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_iostream
11640b57cec5SDimitry Andric    : public basic_istream<_CharT, _Traits>,
1165cb14a3feSDimitry Andric      public basic_ostream<_CharT, _Traits> {
11660b57cec5SDimitry Andricpublic:
11670b57cec5SDimitry Andric  // types:
11680b57cec5SDimitry Andric  typedef _CharT char_type;
11690b57cec5SDimitry Andric  typedef _Traits traits_type;
11700b57cec5SDimitry Andric  typedef typename traits_type::int_type int_type;
11710b57cec5SDimitry Andric  typedef typename traits_type::pos_type pos_type;
11720b57cec5SDimitry Andric  typedef typename traits_type::off_type off_type;
11730b57cec5SDimitry Andric
11740b57cec5SDimitry Andric  // constructor/destructor
1175cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1176cb14a3feSDimitry Andric      : basic_istream<_CharT, _Traits>(__sb) {}
11770b57cec5SDimitry Andric
1178bdd1243dSDimitry Andric  ~basic_iostream() override;
1179cb14a3feSDimitry Andric
11800b57cec5SDimitry Andricprotected:
1181cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_iostream(basic_iostream&& __rhs);
11820b57cec5SDimitry Andric
11830b57cec5SDimitry Andric  // assign/swap
1184cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_iostream& operator=(basic_iostream&& __rhs);
1185fe6060f1SDimitry Andric
1186cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_iostream& __rhs) {
1187cb14a3feSDimitry Andric    basic_istream<char_type, traits_type>::swap(__rhs);
1188cb14a3feSDimitry Andric  }
11890b57cec5SDimitry Andric};
11900b57cec5SDimitry Andric
11910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
11920b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
1193cb14a3feSDimitry Andric    : basic_istream<_CharT, _Traits>(std::move(__rhs)) {}
11940b57cec5SDimitry Andric
11950b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1196cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>& basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs) {
11970b57cec5SDimitry Andric  swap(__rhs);
11980b57cec5SDimitry Andric  return *this;
11990b57cec5SDimitry Andric}
12000b57cec5SDimitry Andric
12010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1202cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>::~basic_iostream() {}
12030b57cec5SDimitry Andric
12040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1205bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1206cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) {
12070b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
12080b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1209cb14a3feSDimitry Andric  if (__sen) {
121006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1211cb14a3feSDimitry Andric    try {
12120b57cec5SDimitry Andric#endif
12130b57cec5SDimitry Andric      __str.clear();
12140b57cec5SDimitry Andric      streamsize __n = __is.width();
12150b57cec5SDimitry Andric      if (__n <= 0)
12160b57cec5SDimitry Andric        __n = __str.max_size();
12170b57cec5SDimitry Andric      if (__n <= 0)
12180b57cec5SDimitry Andric        __n = numeric_limits<streamsize>::max();
12190b57cec5SDimitry Andric      streamsize __c            = 0;
1220bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
1221cb14a3feSDimitry Andric      while (__c < __n) {
12220b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1223cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
12240b57cec5SDimitry Andric          __state |= ios_base::eofbit;
12250b57cec5SDimitry Andric          break;
12260b57cec5SDimitry Andric        }
12270b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
12280b57cec5SDimitry Andric        if (__ct.is(__ct.space, __ch))
12290b57cec5SDimitry Andric          break;
12300b57cec5SDimitry Andric        __str.push_back(__ch);
12310b57cec5SDimitry Andric        ++__c;
12320b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
12330b57cec5SDimitry Andric      }
12340b57cec5SDimitry Andric      __is.width(0);
12350b57cec5SDimitry Andric      if (__c == 0)
12360b57cec5SDimitry Andric        __state |= ios_base::failbit;
123706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1238cb14a3feSDimitry Andric    } catch (...) {
12390b57cec5SDimitry Andric      __state |= ios_base::badbit;
12400b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1241cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
12420b57cec5SDimitry Andric        throw;
12430b57cec5SDimitry Andric      }
12440b57cec5SDimitry Andric    }
12450b57cec5SDimitry Andric#endif
12460b57cec5SDimitry Andric    __is.setstate(__state);
12470b57cec5SDimitry Andric  }
12480b57cec5SDimitry Andric  return __is;
12490b57cec5SDimitry Andric}
12500b57cec5SDimitry Andric
12510b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1252bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1253cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) {
12540b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
12550b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1256cb14a3feSDimitry Andric  if (__sen) {
125706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1258cb14a3feSDimitry Andric    try {
12590b57cec5SDimitry Andric#endif
12600b57cec5SDimitry Andric      __str.clear();
12610b57cec5SDimitry Andric      streamsize __extr = 0;
1262cb14a3feSDimitry Andric      while (true) {
12630b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1264cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
12650b57cec5SDimitry Andric          __state |= ios_base::eofbit;
12660b57cec5SDimitry Andric          break;
12670b57cec5SDimitry Andric        }
12680b57cec5SDimitry Andric        ++__extr;
12690b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
12700b57cec5SDimitry Andric        if (_Traits::eq(__ch, __dlm))
12710b57cec5SDimitry Andric          break;
12720b57cec5SDimitry Andric        __str.push_back(__ch);
1273cb14a3feSDimitry Andric        if (__str.size() == __str.max_size()) {
12740b57cec5SDimitry Andric          __state |= ios_base::failbit;
12750b57cec5SDimitry Andric          break;
12760b57cec5SDimitry Andric        }
12770b57cec5SDimitry Andric      }
12780b57cec5SDimitry Andric      if (__extr == 0)
12790b57cec5SDimitry Andric        __state |= ios_base::failbit;
128006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1281cb14a3feSDimitry Andric    } catch (...) {
12820b57cec5SDimitry Andric      __state |= ios_base::badbit;
12830b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1284cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
12850b57cec5SDimitry Andric        throw;
12860b57cec5SDimitry Andric      }
12870b57cec5SDimitry Andric    }
12880b57cec5SDimitry Andric#endif
12890b57cec5SDimitry Andric    __is.setstate(__state);
12900b57cec5SDimitry Andric  }
12910b57cec5SDimitry Andric  return __is;
12920b57cec5SDimitry Andric}
12930b57cec5SDimitry Andric
12940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1295cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1296cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) {
1297bdd1243dSDimitry Andric  return std::getline(__is, __str, __is.widen('\n'));
12980b57cec5SDimitry Andric}
12990b57cec5SDimitry Andric
13000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1301cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1302cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) {
1303bdd1243dSDimitry Andric  return std::getline(__is, __str, __dlm);
13040b57cec5SDimitry Andric}
13050b57cec5SDimitry Andric
13060b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1307cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1308cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str) {
1309bdd1243dSDimitry Andric  return std::getline(__is, __str, __is.widen('\n'));
13100b57cec5SDimitry Andric}
13110b57cec5SDimitry Andric
13120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Size>
1313bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1314cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) {
13150b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
13160b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1317cb14a3feSDimitry Andric  if (__sen) {
131806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1319cb14a3feSDimitry Andric    try {
13200b57cec5SDimitry Andric#endif
13210b57cec5SDimitry Andric      basic_string<_CharT, _Traits> __str;
1322bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
13230b57cec5SDimitry Andric      size_t __c                = 0;
13240b57cec5SDimitry Andric      _CharT __zero             = __ct.widen('0');
13250b57cec5SDimitry Andric      _CharT __one              = __ct.widen('1');
1326cb14a3feSDimitry Andric      while (__c != _Size) {
13270b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1328cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
13290b57cec5SDimitry Andric          __state |= ios_base::eofbit;
13300b57cec5SDimitry Andric          break;
13310b57cec5SDimitry Andric        }
13320b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
13330b57cec5SDimitry Andric        if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
13340b57cec5SDimitry Andric          break;
13350b57cec5SDimitry Andric        __str.push_back(__ch);
13360b57cec5SDimitry Andric        ++__c;
13370b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
13380b57cec5SDimitry Andric      }
13390b57cec5SDimitry Andric      __x = bitset<_Size>(__str);
1340e40139ffSDimitry Andric      if (_Size > 0 && __c == 0)
13410b57cec5SDimitry Andric        __state |= ios_base::failbit;
134206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1343cb14a3feSDimitry Andric    } catch (...) {
13440b57cec5SDimitry Andric      __state |= ios_base::badbit;
13450b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1346cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
13470b57cec5SDimitry Andric        throw;
13480b57cec5SDimitry Andric      }
13490b57cec5SDimitry Andric    }
13500b57cec5SDimitry Andric#endif
13510b57cec5SDimitry Andric    __is.setstate(__state);
13520b57cec5SDimitry Andric  }
13530b57cec5SDimitry Andric  return __is;
13540b57cec5SDimitry Andric}
13550b57cec5SDimitry Andric
135681ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>;
1357349cc55cSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
135881ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>;
1359349cc55cSDimitry Andric#endif
136081ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>;
13610b57cec5SDimitry Andric
13620b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
13630b57cec5SDimitry Andric
1364bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1365bdd1243dSDimitry Andric#  include <concepts>
13665f757f3fSDimitry Andric#  include <iosfwd>
1367*0fca6ea1SDimitry Andric#  include <ostream>
1368bdd1243dSDimitry Andric#  include <type_traits>
1369bdd1243dSDimitry Andric#endif
1370bdd1243dSDimitry Andric
13710b57cec5SDimitry Andric_LIBCPP_POP_MACROS
13720b57cec5SDimitry Andric
13730b57cec5SDimitry Andric#endif // _LIBCPP_ISTREAM
1374