xref: /freebsd/contrib/llvm-project/libcxx/include/istream (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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
16181ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
1620b57cec5SDimitry Andric#include <__config>
16306c3fb27SDimitry Andric#include <__fwd/istream.h>
16481ad6265SDimitry Andric#include <__iterator/istreambuf_iterator.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>
1700b57cec5SDimitry Andric#include <ostream>
171fe6060f1SDimitry Andric#include <version>
1720b57cec5SDimitry Andric
1730b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1740b57cec5SDimitry Andric#  pragma GCC system_header
1750b57cec5SDimitry Andric#endif
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
1780b57cec5SDimitry Andric#include <__undef_macros>
1790b57cec5SDimitry Andric
1800b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
183*cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream : virtual public basic_ios<_CharT, _Traits> {
1840b57cec5SDimitry Andric  streamsize __gc_;
1855f757f3fSDimitry Andric
1865f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void __inc_gcount() {
1875f757f3fSDimitry Andric    if (__gc_ < numeric_limits<streamsize>::max())
1885f757f3fSDimitry Andric      ++__gc_;
1895f757f3fSDimitry Andric  }
190*cb14a3feSDimitry Andric
1910b57cec5SDimitry Andricpublic:
1920b57cec5SDimitry Andric  // types (inherited from basic_ios (27.5.4)):
1930b57cec5SDimitry Andric  typedef _CharT char_type;
1940b57cec5SDimitry Andric  typedef _Traits traits_type;
1950b57cec5SDimitry Andric  typedef typename traits_type::int_type int_type;
1960b57cec5SDimitry Andric  typedef typename traits_type::pos_type pos_type;
1970b57cec5SDimitry Andric  typedef typename traits_type::off_type off_type;
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andric  // 27.7.1.1.1 Constructor/destructor:
200*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb)
201*cb14a3feSDimitry Andric      : __gc_(0) {
202*cb14a3feSDimitry Andric    this->init(__sb);
203*cb14a3feSDimitry Andric  }
204bdd1243dSDimitry Andric  ~basic_istream() override;
205*cb14a3feSDimitry Andric
2060b57cec5SDimitry Andricprotected:
207*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_istream(basic_istream&& __rhs);
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andric  // 27.7.1.1.2 Assign/swap:
210*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_istream& operator=(basic_istream&& __rhs);
2110b57cec5SDimitry Andric
212*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_istream& __rhs) {
2135f757f3fSDimitry Andric    std::swap(__gc_, __rhs.__gc_);
2140b57cec5SDimitry Andric    basic_ios<char_type, traits_type>::swap(__rhs);
2150b57cec5SDimitry Andric  }
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andric  basic_istream(const basic_istream& __rhs)            = delete;
2180b57cec5SDimitry Andric  basic_istream& operator=(const basic_istream& __rhs) = delete;
2190b57cec5SDimitry Andric
220*cb14a3feSDimitry Andricpublic:
2210b57cec5SDimitry Andric  // 27.7.1.1.3 Prefix/suffix:
2220b57cec5SDimitry Andric  class _LIBCPP_TEMPLATE_VIS sentry;
2230b57cec5SDimitry Andric
2240b57cec5SDimitry Andric  // 27.7.1.2 Formatted input:
225*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)) {
226*cb14a3feSDimitry Andric    return __pf(*this);
227*cb14a3feSDimitry Andric  }
2280b57cec5SDimitry Andric
229*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream&
230*cb14a3feSDimitry Andric  operator>>(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) {
231*cb14a3feSDimitry Andric    __pf(*this);
232*cb14a3feSDimitry Andric    return *this;
233*cb14a3feSDimitry Andric  }
2340b57cec5SDimitry Andric
235*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(ios_base& (*__pf)(ios_base&)) {
236*cb14a3feSDimitry Andric    __pf(*this);
237*cb14a3feSDimitry Andric    return *this;
238*cb14a3feSDimitry Andric  }
2390b57cec5SDimitry Andric
2400b57cec5SDimitry Andric  basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
2410b57cec5SDimitry Andric  basic_istream& operator>>(bool& __n);
2420b57cec5SDimitry Andric  basic_istream& operator>>(short& __n);
2430b57cec5SDimitry Andric  basic_istream& operator>>(unsigned short& __n);
2440b57cec5SDimitry Andric  basic_istream& operator>>(int& __n);
2450b57cec5SDimitry Andric  basic_istream& operator>>(unsigned int& __n);
2460b57cec5SDimitry Andric  basic_istream& operator>>(long& __n);
2470b57cec5SDimitry Andric  basic_istream& operator>>(unsigned long& __n);
2480b57cec5SDimitry Andric  basic_istream& operator>>(long long& __n);
2490b57cec5SDimitry Andric  basic_istream& operator>>(unsigned long long& __n);
2500b57cec5SDimitry Andric  basic_istream& operator>>(float& __f);
2510b57cec5SDimitry Andric  basic_istream& operator>>(double& __f);
2520b57cec5SDimitry Andric  basic_istream& operator>>(long double& __f);
2530b57cec5SDimitry Andric  basic_istream& operator>>(void*& __p);
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andric  // 27.7.1.3 Unformatted input:
256*cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI streamsize gcount() const { return __gc_; }
2570b57cec5SDimitry Andric  int_type get();
2580b57cec5SDimitry Andric
259*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type& __c) {
2600b57cec5SDimitry Andric    int_type __ch = get();
2610b57cec5SDimitry Andric    if (__ch != traits_type::eof())
2620b57cec5SDimitry Andric      __c = traits_type::to_char_type(__ch);
2630b57cec5SDimitry Andric    return *this;
2640b57cec5SDimitry Andric  }
2650b57cec5SDimitry Andric
266*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type* __s, streamsize __n) {
267*cb14a3feSDimitry Andric    return get(__s, __n, this->widen('\n'));
268*cb14a3feSDimitry Andric  }
2690b57cec5SDimitry Andric
2700b57cec5SDimitry Andric  basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
2710b57cec5SDimitry Andric
272*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb) {
273*cb14a3feSDimitry Andric    return get(__sb, this->widen('\n'));
274*cb14a3feSDimitry Andric  }
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andric  basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
2770b57cec5SDimitry Andric
278*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& getline(char_type* __s, streamsize __n) {
279*cb14a3feSDimitry Andric    return getline(__s, __n, this->widen('\n'));
280*cb14a3feSDimitry Andric  }
2810b57cec5SDimitry Andric
2820b57cec5SDimitry Andric  basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
2830b57cec5SDimitry Andric
2840b57cec5SDimitry Andric  basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
2850b57cec5SDimitry Andric  int_type peek();
2860b57cec5SDimitry Andric  basic_istream& read(char_type* __s, streamsize __n);
2870b57cec5SDimitry Andric  streamsize readsome(char_type* __s, streamsize __n);
2880b57cec5SDimitry Andric
2890b57cec5SDimitry Andric  basic_istream& putback(char_type __c);
2900b57cec5SDimitry Andric  basic_istream& unget();
2910b57cec5SDimitry Andric  int sync();
2920b57cec5SDimitry Andric
2930b57cec5SDimitry Andric  pos_type tellg();
2940b57cec5SDimitry Andric  basic_istream& seekg(pos_type __pos);
2950b57cec5SDimitry Andric  basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
2960b57cec5SDimitry Andric};
2970b57cec5SDimitry Andric
2980b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
299*cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry {
3000b57cec5SDimitry Andric  bool __ok_;
3010b57cec5SDimitry Andric
3020b57cec5SDimitry Andricpublic:
3030b57cec5SDimitry Andric  explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
3040b57cec5SDimitry Andric  //    ~sentry() = default;
3050b57cec5SDimitry Andric
306*cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; }
3070eae32dcSDimitry Andric
3080eae32dcSDimitry Andric  sentry(const sentry&)            = delete;
3090eae32dcSDimitry Andric  sentry& operator=(const sentry&) = delete;
3100b57cec5SDimitry Andric};
3110b57cec5SDimitry Andric
3120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
313*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws) : __ok_(false) {
314*cb14a3feSDimitry Andric  if (__is.good()) {
3150b57cec5SDimitry Andric    if (__is.tie())
3160b57cec5SDimitry Andric      __is.tie()->flush();
317*cb14a3feSDimitry Andric    if (!__noskipws && (__is.flags() & ios_base::skipws)) {
3180b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
319bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
3200b57cec5SDimitry Andric      _Ip __i(__is);
3210b57cec5SDimitry Andric      _Ip __eof;
3220b57cec5SDimitry Andric      for (; __i != __eof; ++__i)
3230b57cec5SDimitry Andric        if (!__ct.is(__ct.space, *__i))
3240b57cec5SDimitry Andric          break;
3250b57cec5SDimitry Andric      if (__i == __eof)
3260b57cec5SDimitry Andric        __is.setstate(ios_base::failbit | ios_base::eofbit);
3270b57cec5SDimitry Andric    }
3280b57cec5SDimitry Andric    __ok_ = __is.good();
329*cb14a3feSDimitry Andric  } else
3300b57cec5SDimitry Andric    __is.setstate(ios_base::failbit);
3310b57cec5SDimitry Andric}
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
334*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs) : __gc_(__rhs.__gc_) {
3350b57cec5SDimitry Andric  __rhs.__gc_ = 0;
3360b57cec5SDimitry Andric  this->move(__rhs);
3370b57cec5SDimitry Andric}
3380b57cec5SDimitry Andric
3390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
340*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs) {
3410b57cec5SDimitry Andric  swap(__rhs);
3420b57cec5SDimitry Andric  return *this;
3430b57cec5SDimitry Andric}
3440b57cec5SDimitry Andric
3450b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
346*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::~basic_istream() {}
3470b57cec5SDimitry Andric
3480b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
349*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
3500b57cec5SDimitry Andric__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
3510b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
3520b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __s(__is);
353*cb14a3feSDimitry Andric  if (__s) {
35406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
355*cb14a3feSDimitry Andric    try {
35606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3570b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3580b57cec5SDimitry Andric      typedef num_get<_CharT, _Ip> _Fp;
359bdd1243dSDimitry Andric      std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
36006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
361*cb14a3feSDimitry Andric    } catch (...) {
3620b57cec5SDimitry Andric      __state |= ios_base::badbit;
3630b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
364*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
3650b57cec5SDimitry Andric        throw;
3660b57cec5SDimitry Andric      }
3670b57cec5SDimitry Andric    }
3680b57cec5SDimitry Andric#endif
3690b57cec5SDimitry Andric    __is.setstate(__state);
3700b57cec5SDimitry Andric  }
3710b57cec5SDimitry Andric  return __is;
3720b57cec5SDimitry Andric}
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
375*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) {
3765f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned short>(*this, __n);
3770b57cec5SDimitry Andric}
3780b57cec5SDimitry Andric
3790b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
380*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) {
3815f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned int>(*this, __n);
3820b57cec5SDimitry Andric}
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
385*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long& __n) {
3865f757f3fSDimitry Andric  return std::__input_arithmetic<long>(*this, __n);
3870b57cec5SDimitry Andric}
3880b57cec5SDimitry Andric
3890b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
390*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) {
3915f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned long>(*this, __n);
3920b57cec5SDimitry Andric}
3930b57cec5SDimitry Andric
3940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
395*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long long& __n) {
3965f757f3fSDimitry Andric  return std::__input_arithmetic<long long>(*this, __n);
3970b57cec5SDimitry Andric}
3980b57cec5SDimitry Andric
3990b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
400*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) {
4015f757f3fSDimitry Andric  return std::__input_arithmetic<unsigned long long>(*this, __n);
4020b57cec5SDimitry Andric}
4030b57cec5SDimitry Andric
4040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
405*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(float& __n) {
4065f757f3fSDimitry Andric  return std::__input_arithmetic<float>(*this, __n);
4070b57cec5SDimitry Andric}
4080b57cec5SDimitry Andric
4090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
410*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(double& __n) {
4115f757f3fSDimitry Andric  return std::__input_arithmetic<double>(*this, __n);
4120b57cec5SDimitry Andric}
4130b57cec5SDimitry Andric
4140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
415*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long double& __n) {
4165f757f3fSDimitry Andric  return std::__input_arithmetic<long double>(*this, __n);
4170b57cec5SDimitry Andric}
4180b57cec5SDimitry Andric
4190b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
420*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(bool& __n) {
4215f757f3fSDimitry Andric  return std::__input_arithmetic<bool>(*this, __n);
4220b57cec5SDimitry Andric}
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
425*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(void*& __n) {
4265f757f3fSDimitry Andric  return std::__input_arithmetic<void*>(*this, __n);
4270b57cec5SDimitry Andric}
4280b57cec5SDimitry Andric
4290b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
430*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
4310b57cec5SDimitry Andric__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
4320b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
4330b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __s(__is);
434*cb14a3feSDimitry Andric  if (__s) {
43506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
436*cb14a3feSDimitry Andric    try {
43706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4380b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
4390b57cec5SDimitry Andric      typedef num_get<_CharT, _Ip> _Fp;
4400b57cec5SDimitry Andric      long __temp;
441bdd1243dSDimitry Andric      std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
442*cb14a3feSDimitry Andric      if (__temp < numeric_limits<_Tp>::min()) {
4430b57cec5SDimitry Andric        __state |= ios_base::failbit;
4440b57cec5SDimitry Andric        __n = numeric_limits<_Tp>::min();
445*cb14a3feSDimitry Andric      } else if (__temp > numeric_limits<_Tp>::max()) {
4460b57cec5SDimitry Andric        __state |= ios_base::failbit;
4470b57cec5SDimitry Andric        __n = numeric_limits<_Tp>::max();
448*cb14a3feSDimitry Andric      } else {
4490b57cec5SDimitry Andric        __n = static_cast<_Tp>(__temp);
4500b57cec5SDimitry Andric      }
45106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
452*cb14a3feSDimitry Andric    } catch (...) {
4530b57cec5SDimitry Andric      __state |= ios_base::badbit;
4540b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
455*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
4560b57cec5SDimitry Andric        throw;
4570b57cec5SDimitry Andric      }
4580b57cec5SDimitry Andric    }
45906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4600b57cec5SDimitry Andric    __is.setstate(__state);
4610b57cec5SDimitry Andric  }
4620b57cec5SDimitry Andric  return __is;
4630b57cec5SDimitry Andric}
4640b57cec5SDimitry Andric
4650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
466*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(short& __n) {
4675f757f3fSDimitry Andric  return std::__input_arithmetic_with_numeric_limits<short>(*this, __n);
4680b57cec5SDimitry Andric}
4690b57cec5SDimitry Andric
4700b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
471*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(int& __n) {
4725f757f3fSDimitry Andric  return std::__input_arithmetic_with_numeric_limits<int>(*this, __n);
4730b57cec5SDimitry Andric}
4740b57cec5SDimitry Andric
4750b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
476*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
477*cb14a3feSDimitry Andric__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n) {
4780b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
4790b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
480*cb14a3feSDimitry Andric  if (__sen) {
48106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
482*cb14a3feSDimitry Andric    try {
4830b57cec5SDimitry Andric#endif
4840b57cec5SDimitry Andric      _CharT* __s               = __p;
485bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
486*cb14a3feSDimitry Andric      while (__s != __p + (__n - 1)) {
4870b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
488*cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
4890b57cec5SDimitry Andric          __state |= ios_base::eofbit;
4900b57cec5SDimitry Andric          break;
4910b57cec5SDimitry Andric        }
4920b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
4930b57cec5SDimitry Andric        if (__ct.is(__ct.space, __ch))
4940b57cec5SDimitry Andric          break;
4950b57cec5SDimitry Andric        *__s++ = __ch;
4960b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
4970b57cec5SDimitry Andric      }
4980b57cec5SDimitry Andric      *__s = _CharT();
4990b57cec5SDimitry Andric      __is.width(0);
5000b57cec5SDimitry Andric      if (__s == __p)
5010b57cec5SDimitry Andric        __state |= ios_base::failbit;
50206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
503*cb14a3feSDimitry Andric    } catch (...) {
5040b57cec5SDimitry Andric      __state |= ios_base::badbit;
5050b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
506*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
5070b57cec5SDimitry Andric        throw;
5080b57cec5SDimitry Andric      }
5090b57cec5SDimitry Andric    }
5100b57cec5SDimitry Andric#endif
5110b57cec5SDimitry Andric    __is.setstate(__state);
5120b57cec5SDimitry Andric  }
5130b57cec5SDimitry Andric  return __is;
5140b57cec5SDimitry Andric}
5150b57cec5SDimitry Andric
51606c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20
5170b57cec5SDimitry Andric
5180b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Np>
519*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
520*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np]) {
5210b57cec5SDimitry Andric  size_t __n = _Np;
5220b57cec5SDimitry Andric  if (__is.width() > 0)
5235f757f3fSDimitry Andric    __n = std::min(size_t(__is.width()), _Np);
5245f757f3fSDimitry Andric  return std::__input_c_string(__is, __buf, __n);
5250b57cec5SDimitry Andric}
5260b57cec5SDimitry Andric
5270b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np>
528*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
529*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np]) {
5300b57cec5SDimitry Andric  return __is >> (char(&)[_Np])__buf;
5310b57cec5SDimitry Andric}
5320b57cec5SDimitry Andric
5330b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np>
534*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
535*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np]) {
5360b57cec5SDimitry Andric  return __is >> (char(&)[_Np])__buf;
5370b57cec5SDimitry Andric}
5380b57cec5SDimitry Andric
5390b57cec5SDimitry Andric#else
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
542*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
543*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s) {
5440b57cec5SDimitry Andric  streamsize __n = __is.width();
5450b57cec5SDimitry Andric  if (__n <= 0)
5460b57cec5SDimitry Andric    __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
5475f757f3fSDimitry Andric  return std::__input_c_string(__is, __s, size_t(__n));
5480b57cec5SDimitry Andric}
5490b57cec5SDimitry Andric
5500b57cec5SDimitry Andrictemplate <class _Traits>
551*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
552*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s) {
5530b57cec5SDimitry Andric  return __is >> (char*)__s;
5540b57cec5SDimitry Andric}
5550b57cec5SDimitry Andric
5560b57cec5SDimitry Andrictemplate <class _Traits>
557*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
558*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char* __s) {
5590b57cec5SDimitry Andric  return __is >> (char*)__s;
5600b57cec5SDimitry Andric}
5610b57cec5SDimitry Andric
56206c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 20
5630b57cec5SDimitry Andric
5640b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
565*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c) {
5660b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
5670b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
568*cb14a3feSDimitry Andric  if (__sen) {
56906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
570*cb14a3feSDimitry Andric    try {
5710b57cec5SDimitry Andric#endif
5720b57cec5SDimitry Andric      typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
5730b57cec5SDimitry Andric      if (_Traits::eq_int_type(__i, _Traits::eof()))
5740b57cec5SDimitry Andric        __state |= ios_base::eofbit | ios_base::failbit;
5750b57cec5SDimitry Andric      else
5760b57cec5SDimitry Andric        __c = _Traits::to_char_type(__i);
57706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
578*cb14a3feSDimitry Andric    } catch (...) {
5790b57cec5SDimitry Andric      __state |= ios_base::badbit;
5800b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
581*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
5820b57cec5SDimitry Andric        throw;
5830b57cec5SDimitry Andric      }
5840b57cec5SDimitry Andric    }
5850b57cec5SDimitry Andric#endif
5860b57cec5SDimitry Andric    __is.setstate(__state);
5870b57cec5SDimitry Andric  }
5880b57cec5SDimitry Andric  return __is;
5890b57cec5SDimitry Andric}
5900b57cec5SDimitry Andric
5910b57cec5SDimitry Andrictemplate <class _Traits>
592*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
593*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c) {
5940b57cec5SDimitry Andric  return __is >> (char&)__c;
5950b57cec5SDimitry Andric}
5960b57cec5SDimitry Andric
5970b57cec5SDimitry Andrictemplate <class _Traits>
598*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>&
599*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char& __c) {
6000b57cec5SDimitry Andric  return __is >> (char&)__c;
6010b57cec5SDimitry Andric}
6020b57cec5SDimitry Andric
6030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
6040b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
605*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb) {
6060b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
6070b57cec5SDimitry Andric  __gc_                     = 0;
6080b57cec5SDimitry Andric  sentry __s(*this, true);
609*cb14a3feSDimitry Andric  if (__s) {
610*cb14a3feSDimitry Andric    if (__sb) {
61106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
612*cb14a3feSDimitry Andric      try {
61306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
614*cb14a3feSDimitry Andric        while (true) {
6150b57cec5SDimitry Andric          typename traits_type::int_type __i = this->rdbuf()->sgetc();
616*cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, _Traits::eof())) {
6170b57cec5SDimitry Andric            __state |= ios_base::eofbit;
6180b57cec5SDimitry Andric            break;
6190b57cec5SDimitry Andric          }
620*cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__sb->sputc(traits_type::to_char_type(__i)), traits_type::eof()))
6210b57cec5SDimitry Andric            break;
6225f757f3fSDimitry Andric          __inc_gcount();
6230b57cec5SDimitry Andric          this->rdbuf()->sbumpc();
6240b57cec5SDimitry Andric        }
6250b57cec5SDimitry Andric        if (__gc_ == 0)
6260b57cec5SDimitry Andric          __state |= ios_base::failbit;
62706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
628*cb14a3feSDimitry Andric      } catch (...) {
6290b57cec5SDimitry Andric        __state |= ios_base::badbit;
6300b57cec5SDimitry Andric        if (__gc_ == 0)
6310b57cec5SDimitry Andric          __state |= ios_base::failbit;
6320b57cec5SDimitry Andric
6330b57cec5SDimitry Andric        this->__setstate_nothrow(__state);
634*cb14a3feSDimitry Andric        if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit) {
6350b57cec5SDimitry Andric          throw;
6360b57cec5SDimitry Andric        }
6370b57cec5SDimitry Andric      }
63806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
639*cb14a3feSDimitry Andric    } else {
6400b57cec5SDimitry Andric      __state |= ios_base::failbit;
6410b57cec5SDimitry Andric    }
6420b57cec5SDimitry Andric    this->setstate(__state);
6430b57cec5SDimitry Andric  }
6440b57cec5SDimitry Andric  return *this;
6450b57cec5SDimitry Andric}
6460b57cec5SDimitry Andric
6470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
648*cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::get() {
6490b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
6500b57cec5SDimitry Andric  __gc_                     = 0;
6510b57cec5SDimitry Andric  int_type __r              = traits_type::eof();
6520b57cec5SDimitry Andric  sentry __s(*this, true);
653*cb14a3feSDimitry Andric  if (__s) {
65406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
655*cb14a3feSDimitry Andric    try {
6560b57cec5SDimitry Andric#endif
6570b57cec5SDimitry Andric      __r = this->rdbuf()->sbumpc();
6580b57cec5SDimitry Andric      if (traits_type::eq_int_type(__r, traits_type::eof()))
6590b57cec5SDimitry Andric        __state |= ios_base::failbit | ios_base::eofbit;
6600b57cec5SDimitry Andric      else
6610b57cec5SDimitry Andric        __gc_ = 1;
66206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
663*cb14a3feSDimitry Andric    } catch (...) {
6640b57cec5SDimitry Andric      this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
665*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
6660b57cec5SDimitry Andric        throw;
6670b57cec5SDimitry Andric      }
6680b57cec5SDimitry Andric    }
6690b57cec5SDimitry Andric#endif
6700b57cec5SDimitry Andric    this->setstate(__state);
6710b57cec5SDimitry Andric  }
6720b57cec5SDimitry Andric  return __r;
6730b57cec5SDimitry Andric}
6740b57cec5SDimitry Andric
6750b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
676*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm) {
6770b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
6780b57cec5SDimitry Andric  __gc_                     = 0;
6790b57cec5SDimitry Andric  sentry __sen(*this, true);
680*cb14a3feSDimitry Andric  if (__sen) {
681*cb14a3feSDimitry Andric    if (__n > 0) {
68206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
683*cb14a3feSDimitry Andric      try {
6840b57cec5SDimitry Andric#endif
685*cb14a3feSDimitry Andric        while (__gc_ < __n - 1) {
6860b57cec5SDimitry Andric          int_type __i = this->rdbuf()->sgetc();
687*cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, traits_type::eof())) {
6880b57cec5SDimitry Andric            __state |= ios_base::eofbit;
6890b57cec5SDimitry Andric            break;
6900b57cec5SDimitry Andric          }
6910b57cec5SDimitry Andric          char_type __ch = traits_type::to_char_type(__i);
6920b57cec5SDimitry Andric          if (traits_type::eq(__ch, __dlm))
6930b57cec5SDimitry Andric            break;
6940b57cec5SDimitry Andric          *__s++ = __ch;
6955f757f3fSDimitry Andric          __inc_gcount();
6960b57cec5SDimitry Andric          this->rdbuf()->sbumpc();
6970b57cec5SDimitry Andric        }
6980b57cec5SDimitry Andric        if (__gc_ == 0)
6990b57cec5SDimitry Andric          __state |= ios_base::failbit;
70006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
701*cb14a3feSDimitry Andric      } catch (...) {
7020b57cec5SDimitry Andric        __state |= ios_base::badbit;
7030b57cec5SDimitry Andric        this->__setstate_nothrow(__state);
704*cb14a3feSDimitry Andric        if (this->exceptions() & ios_base::badbit) {
7050b57cec5SDimitry Andric          if (__n > 0)
7060b57cec5SDimitry Andric            *__s = char_type();
7070b57cec5SDimitry Andric          throw;
7080b57cec5SDimitry Andric        }
7090b57cec5SDimitry Andric      }
7100b57cec5SDimitry Andric#endif
711*cb14a3feSDimitry Andric    } else {
7120b57cec5SDimitry Andric      __state |= ios_base::failbit;
7130b57cec5SDimitry Andric    }
7140b57cec5SDimitry Andric
7150b57cec5SDimitry Andric    if (__n > 0)
7160b57cec5SDimitry Andric      *__s = char_type();
7170b57cec5SDimitry Andric    this->setstate(__state);
7180b57cec5SDimitry Andric  }
7190b57cec5SDimitry Andric  if (__n > 0)
7200b57cec5SDimitry Andric    *__s = char_type();
7210b57cec5SDimitry Andric  return *this;
7220b57cec5SDimitry Andric}
7230b57cec5SDimitry Andric
7240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
7250b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
726*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm) {
7270b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
7280b57cec5SDimitry Andric  __gc_                     = 0;
7290b57cec5SDimitry Andric  sentry __sen(*this, true);
730*cb14a3feSDimitry Andric  if (__sen) {
73106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
732*cb14a3feSDimitry Andric    try {
73306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
734*cb14a3feSDimitry Andric      while (true) {
7350b57cec5SDimitry Andric        typename traits_type::int_type __i = this->rdbuf()->sgetc();
736*cb14a3feSDimitry Andric        if (traits_type::eq_int_type(__i, traits_type::eof())) {
7370b57cec5SDimitry Andric          __state |= ios_base::eofbit;
7380b57cec5SDimitry Andric          break;
7390b57cec5SDimitry Andric        }
7400b57cec5SDimitry Andric        char_type __ch = traits_type::to_char_type(__i);
7410b57cec5SDimitry Andric        if (traits_type::eq(__ch, __dlm))
7420b57cec5SDimitry Andric          break;
7430b57cec5SDimitry Andric        if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
7440b57cec5SDimitry Andric          break;
7455f757f3fSDimitry Andric        __inc_gcount();
7460b57cec5SDimitry Andric        this->rdbuf()->sbumpc();
7470b57cec5SDimitry Andric      }
74806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
749*cb14a3feSDimitry Andric    } catch (...) {
7500b57cec5SDimitry Andric      __state |= ios_base::badbit;
7510b57cec5SDimitry Andric      // according to the spec, exceptions here are caught but not rethrown
7520b57cec5SDimitry Andric    }
75306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
7540b57cec5SDimitry Andric    if (__gc_ == 0)
7550b57cec5SDimitry Andric      __state |= ios_base::failbit;
7560b57cec5SDimitry Andric    this->setstate(__state);
7570b57cec5SDimitry Andric  }
7580b57cec5SDimitry Andric  return *this;
7590b57cec5SDimitry Andric}
7600b57cec5SDimitry Andric
7610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
7620b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
763*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm) {
7640b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
7650b57cec5SDimitry Andric  __gc_                     = 0;
7660b57cec5SDimitry Andric  sentry __sen(*this, true);
767*cb14a3feSDimitry Andric  if (__sen) {
76806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
769*cb14a3feSDimitry Andric    try {
77006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
771*cb14a3feSDimitry Andric      while (true) {
7720b57cec5SDimitry Andric        typename traits_type::int_type __i = this->rdbuf()->sgetc();
773*cb14a3feSDimitry Andric        if (traits_type::eq_int_type(__i, traits_type::eof())) {
7740b57cec5SDimitry Andric          __state |= ios_base::eofbit;
7750b57cec5SDimitry Andric          break;
7760b57cec5SDimitry Andric        }
7770b57cec5SDimitry Andric        char_type __ch = traits_type::to_char_type(__i);
778*cb14a3feSDimitry Andric        if (traits_type::eq(__ch, __dlm)) {
7790b57cec5SDimitry Andric          this->rdbuf()->sbumpc();
7805f757f3fSDimitry Andric          __inc_gcount();
7810b57cec5SDimitry Andric          break;
7820b57cec5SDimitry Andric        }
783*cb14a3feSDimitry Andric        if (__gc_ >= __n - 1) {
7840b57cec5SDimitry Andric          __state |= ios_base::failbit;
7850b57cec5SDimitry Andric          break;
7860b57cec5SDimitry Andric        }
7870b57cec5SDimitry Andric        *__s++ = __ch;
7880b57cec5SDimitry Andric        this->rdbuf()->sbumpc();
7895f757f3fSDimitry Andric        __inc_gcount();
7900b57cec5SDimitry Andric      }
79106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
792*cb14a3feSDimitry Andric    } catch (...) {
7930b57cec5SDimitry Andric      __state |= ios_base::badbit;
7940b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
795*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
7960b57cec5SDimitry Andric        if (__n > 0)
7970b57cec5SDimitry Andric          *__s = char_type();
7980b57cec5SDimitry Andric        if (__gc_ == 0)
7990b57cec5SDimitry Andric          __state |= ios_base::failbit;
8000b57cec5SDimitry Andric        throw;
8010b57cec5SDimitry Andric      }
8020b57cec5SDimitry Andric    }
80306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8040b57cec5SDimitry Andric  }
8050b57cec5SDimitry Andric  if (__n > 0)
8060b57cec5SDimitry Andric    *__s = char_type();
8070b57cec5SDimitry Andric  if (__gc_ == 0)
8080b57cec5SDimitry Andric    __state |= ios_base::failbit;
8090b57cec5SDimitry Andric  this->setstate(__state);
8100b57cec5SDimitry Andric  return *this;
8110b57cec5SDimitry Andric}
8120b57cec5SDimitry Andric
8130b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
814*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) {
8150b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
8160b57cec5SDimitry Andric  __gc_                     = 0;
8170b57cec5SDimitry Andric  sentry __sen(*this, true);
818*cb14a3feSDimitry Andric  if (__sen) {
81906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
820*cb14a3feSDimitry Andric    try {
82106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
822*cb14a3feSDimitry Andric      if (__n == numeric_limits<streamsize>::max()) {
823*cb14a3feSDimitry Andric        while (true) {
8240b57cec5SDimitry Andric          typename traits_type::int_type __i = this->rdbuf()->sbumpc();
825*cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, traits_type::eof())) {
8260b57cec5SDimitry Andric            __state |= ios_base::eofbit;
8270b57cec5SDimitry Andric            break;
8280b57cec5SDimitry Andric          }
8295f757f3fSDimitry Andric          __inc_gcount();
8300b57cec5SDimitry Andric          if (traits_type::eq_int_type(__i, __dlm))
8310b57cec5SDimitry Andric            break;
8320b57cec5SDimitry Andric        }
833*cb14a3feSDimitry Andric      } else {
834*cb14a3feSDimitry Andric        while (__gc_ < __n) {
8350b57cec5SDimitry Andric          typename traits_type::int_type __i = this->rdbuf()->sbumpc();
836*cb14a3feSDimitry Andric          if (traits_type::eq_int_type(__i, traits_type::eof())) {
8370b57cec5SDimitry Andric            __state |= ios_base::eofbit;
8380b57cec5SDimitry Andric            break;
8390b57cec5SDimitry Andric          }
8405f757f3fSDimitry Andric          __inc_gcount();
8410b57cec5SDimitry Andric          if (traits_type::eq_int_type(__i, __dlm))
8420b57cec5SDimitry Andric            break;
8430b57cec5SDimitry Andric        }
8440b57cec5SDimitry Andric      }
84506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
846*cb14a3feSDimitry Andric    } catch (...) {
8470b57cec5SDimitry Andric      __state |= ios_base::badbit;
8480b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
849*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
8500b57cec5SDimitry Andric        throw;
8510b57cec5SDimitry Andric      }
8520b57cec5SDimitry Andric    }
85306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8540b57cec5SDimitry Andric    this->setstate(__state);
8550b57cec5SDimitry Andric  }
8560b57cec5SDimitry Andric  return *this;
8570b57cec5SDimitry Andric}
8580b57cec5SDimitry Andric
8590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
860*cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::peek() {
8610b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
8620b57cec5SDimitry Andric  __gc_                     = 0;
8630b57cec5SDimitry Andric  int_type __r              = traits_type::eof();
8640b57cec5SDimitry Andric  sentry __sen(*this, true);
865*cb14a3feSDimitry Andric  if (__sen) {
86606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
867*cb14a3feSDimitry Andric    try {
86806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8690b57cec5SDimitry Andric      __r = this->rdbuf()->sgetc();
8700b57cec5SDimitry Andric      if (traits_type::eq_int_type(__r, traits_type::eof()))
8710b57cec5SDimitry Andric        __state |= ios_base::eofbit;
87206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
873*cb14a3feSDimitry Andric    } catch (...) {
8740b57cec5SDimitry Andric      __state |= ios_base::badbit;
8750b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
876*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
8770b57cec5SDimitry Andric        throw;
8780b57cec5SDimitry Andric      }
8790b57cec5SDimitry Andric    }
88006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8810b57cec5SDimitry Andric    this->setstate(__state);
8820b57cec5SDimitry Andric  }
8830b57cec5SDimitry Andric  return __r;
8840b57cec5SDimitry Andric}
8850b57cec5SDimitry Andric
8860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
887*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) {
8880b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
8890b57cec5SDimitry Andric  __gc_                     = 0;
8900b57cec5SDimitry Andric  sentry __sen(*this, true);
891*cb14a3feSDimitry Andric  if (__sen) {
89206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
893*cb14a3feSDimitry Andric    try {
89406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8950b57cec5SDimitry Andric      __gc_ = this->rdbuf()->sgetn(__s, __n);
8960b57cec5SDimitry Andric      if (__gc_ != __n)
8970b57cec5SDimitry Andric        __state |= ios_base::failbit | ios_base::eofbit;
89806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
899*cb14a3feSDimitry Andric    } catch (...) {
9000b57cec5SDimitry Andric      __state |= ios_base::badbit;
9010b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
902*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
9030b57cec5SDimitry Andric        throw;
9040b57cec5SDimitry Andric      }
9050b57cec5SDimitry Andric    }
90606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
907*cb14a3feSDimitry Andric  } else {
9080b57cec5SDimitry Andric    __state |= ios_base::failbit;
9090b57cec5SDimitry Andric  }
9100b57cec5SDimitry Andric  this->setstate(__state);
9110b57cec5SDimitry Andric  return *this;
9120b57cec5SDimitry Andric}
9130b57cec5SDimitry Andric
9140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
915*cb14a3feSDimitry Andricstreamsize basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n) {
9160b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
9170b57cec5SDimitry Andric  __gc_                     = 0;
9180b57cec5SDimitry Andric  sentry __sen(*this, true);
919*cb14a3feSDimitry Andric  if (__sen) {
92006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
921*cb14a3feSDimitry Andric    try {
92206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
9230b57cec5SDimitry Andric      streamsize __c = this->rdbuf()->in_avail();
924*cb14a3feSDimitry Andric      switch (__c) {
9250b57cec5SDimitry Andric      case -1:
9260b57cec5SDimitry Andric        __state |= ios_base::eofbit;
9270b57cec5SDimitry Andric        break;
9280b57cec5SDimitry Andric      case 0:
9290b57cec5SDimitry Andric        break;
9300b57cec5SDimitry Andric      default:
9315f757f3fSDimitry Andric        __n   = std::min(__c, __n);
9320b57cec5SDimitry Andric        __gc_ = this->rdbuf()->sgetn(__s, __n);
9330b57cec5SDimitry Andric        if (__gc_ != __n)
9340b57cec5SDimitry Andric          __state |= ios_base::failbit | ios_base::eofbit;
9350b57cec5SDimitry Andric        break;
9360b57cec5SDimitry Andric      }
93706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
938*cb14a3feSDimitry Andric    } catch (...) {
9390b57cec5SDimitry Andric      __state |= ios_base::badbit;
9400b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
941*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
9420b57cec5SDimitry Andric        throw;
9430b57cec5SDimitry Andric      }
9440b57cec5SDimitry Andric    }
94506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
946*cb14a3feSDimitry Andric  } else {
9470b57cec5SDimitry Andric    __state |= ios_base::failbit;
9480b57cec5SDimitry Andric  }
9490b57cec5SDimitry Andric  this->setstate(__state);
9500b57cec5SDimitry Andric  return __gc_;
9510b57cec5SDimitry Andric}
9520b57cec5SDimitry Andric
9530b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
954*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::putback(char_type __c) {
9550b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
9560b57cec5SDimitry Andric  __gc_                     = 0;
9570b57cec5SDimitry Andric  this->clear(__state);
9580b57cec5SDimitry Andric  sentry __sen(*this, true);
959*cb14a3feSDimitry Andric  if (__sen) {
96006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
961*cb14a3feSDimitry Andric    try {
96206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
963e8d8bef9SDimitry Andric      if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
9640b57cec5SDimitry Andric        __state |= ios_base::badbit;
96506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
966*cb14a3feSDimitry Andric    } catch (...) {
9670b57cec5SDimitry Andric      __state |= ios_base::badbit;
9680b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
969*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
9700b57cec5SDimitry Andric        throw;
9710b57cec5SDimitry Andric      }
9720b57cec5SDimitry Andric    }
97306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
974*cb14a3feSDimitry Andric  } else {
9750b57cec5SDimitry Andric    __state |= ios_base::failbit;
9760b57cec5SDimitry Andric  }
9770b57cec5SDimitry Andric  this->setstate(__state);
9780b57cec5SDimitry Andric  return *this;
9790b57cec5SDimitry Andric}
9800b57cec5SDimitry Andric
9810b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
982*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() {
9830b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
9840b57cec5SDimitry Andric  __gc_                     = 0;
9850b57cec5SDimitry Andric  this->clear(__state);
9860b57cec5SDimitry Andric  sentry __sen(*this, true);
987*cb14a3feSDimitry Andric  if (__sen) {
98806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
989*cb14a3feSDimitry Andric    try {
99006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
991e8d8bef9SDimitry Andric      if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
9920b57cec5SDimitry Andric        __state |= ios_base::badbit;
99306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
994*cb14a3feSDimitry Andric    } catch (...) {
9950b57cec5SDimitry Andric      __state |= ios_base::badbit;
9960b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
997*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
9980b57cec5SDimitry Andric        throw;
9990b57cec5SDimitry Andric      }
10000b57cec5SDimitry Andric    }
100106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1002*cb14a3feSDimitry Andric  } else {
10030b57cec5SDimitry Andric    __state |= ios_base::failbit;
10040b57cec5SDimitry Andric  }
10050b57cec5SDimitry Andric  this->setstate(__state);
10060b57cec5SDimitry Andric  return *this;
10070b57cec5SDimitry Andric}
10080b57cec5SDimitry Andric
10090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1010*cb14a3feSDimitry Andricint basic_istream<_CharT, _Traits>::sync() {
10110b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
10120b57cec5SDimitry Andric  int __r                   = 0;
10130b57cec5SDimitry Andric  sentry __sen(*this, true);
1014*cb14a3feSDimitry Andric  if (__sen) {
101506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1016*cb14a3feSDimitry Andric    try {
101706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1018e8d8bef9SDimitry Andric      if (this->rdbuf() == nullptr)
10190b57cec5SDimitry Andric        return -1;
1020*cb14a3feSDimitry Andric      if (this->rdbuf()->pubsync() == -1) {
10210b57cec5SDimitry Andric        __state |= ios_base::badbit;
10220b57cec5SDimitry Andric        return -1;
10230b57cec5SDimitry Andric      }
102406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1025*cb14a3feSDimitry Andric    } catch (...) {
10260b57cec5SDimitry Andric      __state |= ios_base::badbit;
10270b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1028*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
10290b57cec5SDimitry Andric        throw;
10300b57cec5SDimitry Andric      }
10310b57cec5SDimitry Andric    }
103206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10330b57cec5SDimitry Andric    this->setstate(__state);
10340b57cec5SDimitry Andric  }
10350b57cec5SDimitry Andric  return __r;
10360b57cec5SDimitry Andric}
10370b57cec5SDimitry Andric
10380b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1039*cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::pos_type basic_istream<_CharT, _Traits>::tellg() {
10400b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
10410b57cec5SDimitry Andric  pos_type __r(-1);
10420b57cec5SDimitry Andric  sentry __sen(*this, true);
1043*cb14a3feSDimitry Andric  if (__sen) {
104406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1045*cb14a3feSDimitry Andric    try {
104606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10470b57cec5SDimitry Andric      __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
104806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1049*cb14a3feSDimitry Andric    } catch (...) {
10500b57cec5SDimitry Andric      __state |= ios_base::badbit;
10510b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1052*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
10530b57cec5SDimitry Andric        throw;
10540b57cec5SDimitry Andric      }
10550b57cec5SDimitry Andric    }
105606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10570b57cec5SDimitry Andric    this->setstate(__state);
10580b57cec5SDimitry Andric  }
10590b57cec5SDimitry Andric  return __r;
10600b57cec5SDimitry Andric}
10610b57cec5SDimitry Andric
10620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1063*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(pos_type __pos) {
10640b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
10650b57cec5SDimitry Andric  this->clear(__state);
10660b57cec5SDimitry Andric  sentry __sen(*this, true);
1067*cb14a3feSDimitry Andric  if (__sen) {
106806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1069*cb14a3feSDimitry Andric    try {
107006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10710b57cec5SDimitry Andric      if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
10720b57cec5SDimitry Andric        __state |= ios_base::failbit;
107306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1074*cb14a3feSDimitry Andric    } catch (...) {
10750b57cec5SDimitry Andric      __state |= ios_base::badbit;
10760b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1077*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
10780b57cec5SDimitry Andric        throw;
10790b57cec5SDimitry Andric      }
10800b57cec5SDimitry Andric    }
108106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10820b57cec5SDimitry Andric    this->setstate(__state);
10830b57cec5SDimitry Andric  }
10840b57cec5SDimitry Andric  return *this;
10850b57cec5SDimitry Andric}
10860b57cec5SDimitry Andric
10870b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1088*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) {
10890b57cec5SDimitry Andric  ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
10900b57cec5SDimitry Andric  this->clear(__state);
10910b57cec5SDimitry Andric  sentry __sen(*this, true);
1092*cb14a3feSDimitry Andric  if (__sen) {
109306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1094*cb14a3feSDimitry Andric    try {
109506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
10960b57cec5SDimitry Andric      if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
10970b57cec5SDimitry Andric        __state |= ios_base::failbit;
109806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1099*cb14a3feSDimitry Andric    } catch (...) {
11000b57cec5SDimitry Andric      __state |= ios_base::badbit;
11010b57cec5SDimitry Andric      this->__setstate_nothrow(__state);
1102*cb14a3feSDimitry Andric      if (this->exceptions() & ios_base::badbit) {
11030b57cec5SDimitry Andric        throw;
11040b57cec5SDimitry Andric      }
11050b57cec5SDimitry Andric    }
110606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
11070b57cec5SDimitry Andric    this->setstate(__state);
11080b57cec5SDimitry Andric  }
11090b57cec5SDimitry Andric  return *this;
11100b57cec5SDimitry Andric}
11110b57cec5SDimitry Andric
11120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1113*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& ws(basic_istream<_CharT, _Traits>& __is) {
11140b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
11150b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1116*cb14a3feSDimitry Andric  if (__sen) {
111706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1118*cb14a3feSDimitry Andric    try {
111906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1120bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
1121*cb14a3feSDimitry Andric      while (true) {
11220b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1123*cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
11240b57cec5SDimitry Andric          __state |= ios_base::eofbit;
11250b57cec5SDimitry Andric          break;
11260b57cec5SDimitry Andric        }
11270b57cec5SDimitry Andric        if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
11280b57cec5SDimitry Andric          break;
11290b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
11300b57cec5SDimitry Andric      }
113106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1132*cb14a3feSDimitry Andric    } catch (...) {
11330b57cec5SDimitry Andric      __state |= ios_base::badbit;
11340b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1135*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
11360b57cec5SDimitry Andric        throw;
11370b57cec5SDimitry Andric      }
11380b57cec5SDimitry Andric    }
113906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
11400b57cec5SDimitry Andric    __is.setstate(__state);
11410b57cec5SDimitry Andric  }
11420b57cec5SDimitry Andric  return __is;
11430b57cec5SDimitry Andric}
11440b57cec5SDimitry Andric
1145e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = void>
1146e8d8bef9SDimitry Andricstruct __is_istreamable : false_type {};
1147e8d8bef9SDimitry Andric
1148e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp>
1149*cb14a3feSDimitry Andricstruct __is_istreamable<_Stream, _Tp, decltype(std::declval<_Stream>() >> std::declval<_Tp>(), void())> : true_type {};
1150e8d8bef9SDimitry Andric
1151*cb14a3feSDimitry Andrictemplate <class _Stream,
1152*cb14a3feSDimitry Andric          class _Tp,
1153*cb14a3feSDimitry Andric          __enable_if_t< _And<is_base_of<ios_base, _Stream>, __is_istreamable<_Stream&, _Tp&&> >::value, int> = 0>
1154*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI _Stream&& operator>>(_Stream&& __is, _Tp&& __x) {
11555f757f3fSDimitry Andric  __is >> std::forward<_Tp>(__x);
11565f757f3fSDimitry Andric  return std::move(__is);
11570b57cec5SDimitry Andric}
11580b57cec5SDimitry Andric
11590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
11600b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_iostream
11610b57cec5SDimitry Andric    : public basic_istream<_CharT, _Traits>,
1162*cb14a3feSDimitry Andric      public basic_ostream<_CharT, _Traits> {
11630b57cec5SDimitry Andricpublic:
11640b57cec5SDimitry Andric  // types:
11650b57cec5SDimitry Andric  typedef _CharT char_type;
11660b57cec5SDimitry Andric  typedef _Traits traits_type;
11670b57cec5SDimitry Andric  typedef typename traits_type::int_type int_type;
11680b57cec5SDimitry Andric  typedef typename traits_type::pos_type pos_type;
11690b57cec5SDimitry Andric  typedef typename traits_type::off_type off_type;
11700b57cec5SDimitry Andric
11710b57cec5SDimitry Andric  // constructor/destructor
1172*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1173*cb14a3feSDimitry Andric      : basic_istream<_CharT, _Traits>(__sb) {}
11740b57cec5SDimitry Andric
1175bdd1243dSDimitry Andric  ~basic_iostream() override;
1176*cb14a3feSDimitry Andric
11770b57cec5SDimitry Andricprotected:
1178*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_iostream(basic_iostream&& __rhs);
11790b57cec5SDimitry Andric
11800b57cec5SDimitry Andric  // assign/swap
1181*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_iostream& operator=(basic_iostream&& __rhs);
1182fe6060f1SDimitry Andric
1183*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_iostream& __rhs) {
1184*cb14a3feSDimitry Andric    basic_istream<char_type, traits_type>::swap(__rhs);
1185*cb14a3feSDimitry Andric  }
11860b57cec5SDimitry Andric};
11870b57cec5SDimitry Andric
11880b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
11890b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
1190*cb14a3feSDimitry Andric    : basic_istream<_CharT, _Traits>(std::move(__rhs)) {}
11910b57cec5SDimitry Andric
11920b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1193*cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>& basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs) {
11940b57cec5SDimitry Andric  swap(__rhs);
11950b57cec5SDimitry Andric  return *this;
11960b57cec5SDimitry Andric}
11970b57cec5SDimitry Andric
11980b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1199*cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>::~basic_iostream() {}
12000b57cec5SDimitry Andric
12010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1202bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1203*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) {
12040b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
12050b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1206*cb14a3feSDimitry Andric  if (__sen) {
120706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1208*cb14a3feSDimitry Andric    try {
12090b57cec5SDimitry Andric#endif
12100b57cec5SDimitry Andric      __str.clear();
12110b57cec5SDimitry Andric      streamsize __n = __is.width();
12120b57cec5SDimitry Andric      if (__n <= 0)
12130b57cec5SDimitry Andric        __n = __str.max_size();
12140b57cec5SDimitry Andric      if (__n <= 0)
12150b57cec5SDimitry Andric        __n = numeric_limits<streamsize>::max();
12160b57cec5SDimitry Andric      streamsize __c            = 0;
1217bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
1218*cb14a3feSDimitry Andric      while (__c < __n) {
12190b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1220*cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
12210b57cec5SDimitry Andric          __state |= ios_base::eofbit;
12220b57cec5SDimitry Andric          break;
12230b57cec5SDimitry Andric        }
12240b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
12250b57cec5SDimitry Andric        if (__ct.is(__ct.space, __ch))
12260b57cec5SDimitry Andric          break;
12270b57cec5SDimitry Andric        __str.push_back(__ch);
12280b57cec5SDimitry Andric        ++__c;
12290b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
12300b57cec5SDimitry Andric      }
12310b57cec5SDimitry Andric      __is.width(0);
12320b57cec5SDimitry Andric      if (__c == 0)
12330b57cec5SDimitry Andric        __state |= ios_base::failbit;
123406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1235*cb14a3feSDimitry Andric    } catch (...) {
12360b57cec5SDimitry Andric      __state |= ios_base::badbit;
12370b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1238*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
12390b57cec5SDimitry Andric        throw;
12400b57cec5SDimitry Andric      }
12410b57cec5SDimitry Andric    }
12420b57cec5SDimitry Andric#endif
12430b57cec5SDimitry Andric    __is.setstate(__state);
12440b57cec5SDimitry Andric  }
12450b57cec5SDimitry Andric  return __is;
12460b57cec5SDimitry Andric}
12470b57cec5SDimitry Andric
12480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1249bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1250*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) {
12510b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
12520b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1253*cb14a3feSDimitry Andric  if (__sen) {
125406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1255*cb14a3feSDimitry Andric    try {
12560b57cec5SDimitry Andric#endif
12570b57cec5SDimitry Andric      __str.clear();
12580b57cec5SDimitry Andric      streamsize __extr = 0;
1259*cb14a3feSDimitry Andric      while (true) {
12600b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1261*cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
12620b57cec5SDimitry Andric          __state |= ios_base::eofbit;
12630b57cec5SDimitry Andric          break;
12640b57cec5SDimitry Andric        }
12650b57cec5SDimitry Andric        ++__extr;
12660b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
12670b57cec5SDimitry Andric        if (_Traits::eq(__ch, __dlm))
12680b57cec5SDimitry Andric          break;
12690b57cec5SDimitry Andric        __str.push_back(__ch);
1270*cb14a3feSDimitry Andric        if (__str.size() == __str.max_size()) {
12710b57cec5SDimitry Andric          __state |= ios_base::failbit;
12720b57cec5SDimitry Andric          break;
12730b57cec5SDimitry Andric        }
12740b57cec5SDimitry Andric      }
12750b57cec5SDimitry Andric      if (__extr == 0)
12760b57cec5SDimitry Andric        __state |= ios_base::failbit;
127706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1278*cb14a3feSDimitry Andric    } catch (...) {
12790b57cec5SDimitry Andric      __state |= ios_base::badbit;
12800b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1281*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
12820b57cec5SDimitry Andric        throw;
12830b57cec5SDimitry Andric      }
12840b57cec5SDimitry Andric    }
12850b57cec5SDimitry Andric#endif
12860b57cec5SDimitry Andric    __is.setstate(__state);
12870b57cec5SDimitry Andric  }
12880b57cec5SDimitry Andric  return __is;
12890b57cec5SDimitry Andric}
12900b57cec5SDimitry Andric
12910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1292*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1293*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) {
1294bdd1243dSDimitry Andric  return std::getline(__is, __str, __is.widen('\n'));
12950b57cec5SDimitry Andric}
12960b57cec5SDimitry Andric
12970b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1298*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1299*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) {
1300bdd1243dSDimitry Andric  return std::getline(__is, __str, __dlm);
13010b57cec5SDimitry Andric}
13020b57cec5SDimitry Andric
13030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
1304*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1305*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str) {
1306bdd1243dSDimitry Andric  return std::getline(__is, __str, __is.widen('\n'));
13070b57cec5SDimitry Andric}
13080b57cec5SDimitry Andric
13090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Size>
1310bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1311*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) {
13120b57cec5SDimitry Andric  ios_base::iostate __state = ios_base::goodbit;
13130b57cec5SDimitry Andric  typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1314*cb14a3feSDimitry Andric  if (__sen) {
131506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1316*cb14a3feSDimitry Andric    try {
13170b57cec5SDimitry Andric#endif
13180b57cec5SDimitry Andric      basic_string<_CharT, _Traits> __str;
1319bdd1243dSDimitry Andric      const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
13200b57cec5SDimitry Andric      size_t __c                = 0;
13210b57cec5SDimitry Andric      _CharT __zero             = __ct.widen('0');
13220b57cec5SDimitry Andric      _CharT __one              = __ct.widen('1');
1323*cb14a3feSDimitry Andric      while (__c != _Size) {
13240b57cec5SDimitry Andric        typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1325*cb14a3feSDimitry Andric        if (_Traits::eq_int_type(__i, _Traits::eof())) {
13260b57cec5SDimitry Andric          __state |= ios_base::eofbit;
13270b57cec5SDimitry Andric          break;
13280b57cec5SDimitry Andric        }
13290b57cec5SDimitry Andric        _CharT __ch = _Traits::to_char_type(__i);
13300b57cec5SDimitry Andric        if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
13310b57cec5SDimitry Andric          break;
13320b57cec5SDimitry Andric        __str.push_back(__ch);
13330b57cec5SDimitry Andric        ++__c;
13340b57cec5SDimitry Andric        __is.rdbuf()->sbumpc();
13350b57cec5SDimitry Andric      }
13360b57cec5SDimitry Andric      __x = bitset<_Size>(__str);
1337e40139ffSDimitry Andric      if (_Size > 0 && __c == 0)
13380b57cec5SDimitry Andric        __state |= ios_base::failbit;
133906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1340*cb14a3feSDimitry Andric    } catch (...) {
13410b57cec5SDimitry Andric      __state |= ios_base::badbit;
13420b57cec5SDimitry Andric      __is.__setstate_nothrow(__state);
1343*cb14a3feSDimitry Andric      if (__is.exceptions() & ios_base::badbit) {
13440b57cec5SDimitry Andric        throw;
13450b57cec5SDimitry Andric      }
13460b57cec5SDimitry Andric    }
13470b57cec5SDimitry Andric#endif
13480b57cec5SDimitry Andric    __is.setstate(__state);
13490b57cec5SDimitry Andric  }
13500b57cec5SDimitry Andric  return __is;
13510b57cec5SDimitry Andric}
13520b57cec5SDimitry Andric
135381ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>;
1354349cc55cSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
135581ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>;
1356349cc55cSDimitry Andric#endif
135781ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>;
13580b57cec5SDimitry Andric
13590b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
13600b57cec5SDimitry Andric
1361bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1362bdd1243dSDimitry Andric#  include <concepts>
13635f757f3fSDimitry Andric#  include <iosfwd>
1364bdd1243dSDimitry Andric#  include <type_traits>
1365bdd1243dSDimitry Andric#endif
1366bdd1243dSDimitry Andric
13670b57cec5SDimitry Andric_LIBCPP_POP_MACROS
13680b57cec5SDimitry Andric
13690b57cec5SDimitry Andric#endif // _LIBCPP_ISTREAM
1370