xref: /freebsd/contrib/llvm-project/libcxx/include/istream (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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
161*81ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
1620b57cec5SDimitry Andric#include <__config>
163*81ad6265SDimitry Andric#include <__iterator/istreambuf_iterator.h>
164fe6060f1SDimitry Andric#include <__utility/forward.h>
1650b57cec5SDimitry Andric#include <ostream>
166fe6060f1SDimitry Andric#include <version>
1670b57cec5SDimitry Andric
1680b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1690b57cec5SDimitry Andric#  pragma GCC system_header
1700b57cec5SDimitry Andric#endif
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
1730b57cec5SDimitry Andric#include <__undef_macros>
1740b57cec5SDimitry Andric
1750b57cec5SDimitry Andric
1760b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
1770b57cec5SDimitry Andric
1780b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1790b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream
1800b57cec5SDimitry Andric    : virtual public basic_ios<_CharT, _Traits>
1810b57cec5SDimitry Andric{
1820b57cec5SDimitry Andric    streamsize __gc_;
1830b57cec5SDimitry Andricpublic:
1840b57cec5SDimitry Andric    // types (inherited from basic_ios (27.5.4)):
1850b57cec5SDimitry Andric    typedef _CharT                         char_type;
1860b57cec5SDimitry Andric    typedef _Traits                        traits_type;
1870b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
1880b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
1890b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
1900b57cec5SDimitry Andric
1910b57cec5SDimitry Andric    // 27.7.1.1.1 Constructor/destructor:
1920b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1930b57cec5SDimitry Andric    explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
1940b57cec5SDimitry Andric    { this->init(__sb); }
1950b57cec5SDimitry Andric    virtual ~basic_istream();
1960b57cec5SDimitry Andricprotected:
1970b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
1980b57cec5SDimitry Andric    basic_istream(basic_istream&& __rhs);
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andric    // 27.7.1.1.2 Assign/swap:
2010b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
2020b57cec5SDimitry Andric    basic_istream& operator=(basic_istream&& __rhs);
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2050b57cec5SDimitry Andric    void swap(basic_istream& __rhs) {
2060b57cec5SDimitry Andric      _VSTD::swap(__gc_, __rhs.__gc_);
2070b57cec5SDimitry Andric      basic_ios<char_type, traits_type>::swap(__rhs);
2080b57cec5SDimitry Andric    }
2090b57cec5SDimitry Andric
2100b57cec5SDimitry Andric    basic_istream           (const basic_istream& __rhs) = delete;
2110b57cec5SDimitry Andric    basic_istream& operator=(const basic_istream& __rhs) = delete;
2120b57cec5SDimitry Andricpublic:
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andric    // 27.7.1.1.3 Prefix/suffix:
2150b57cec5SDimitry Andric    class _LIBCPP_TEMPLATE_VIS sentry;
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andric    // 27.7.1.2 Formatted input:
2180b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2190b57cec5SDimitry Andric    basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
2200b57cec5SDimitry Andric    { return __pf(*this); }
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2230b57cec5SDimitry Andric    basic_istream& operator>>(basic_ios<char_type, traits_type>&
2240b57cec5SDimitry Andric                              (*__pf)(basic_ios<char_type, traits_type>&))
2250b57cec5SDimitry Andric    { __pf(*this); return *this; }
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2280b57cec5SDimitry Andric    basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
2290b57cec5SDimitry Andric    { __pf(*this); return *this; }
2300b57cec5SDimitry Andric
2310b57cec5SDimitry Andric    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
2320b57cec5SDimitry Andric    basic_istream& operator>>(bool& __n);
2330b57cec5SDimitry Andric    basic_istream& operator>>(short& __n);
2340b57cec5SDimitry Andric    basic_istream& operator>>(unsigned short& __n);
2350b57cec5SDimitry Andric    basic_istream& operator>>(int& __n);
2360b57cec5SDimitry Andric    basic_istream& operator>>(unsigned int& __n);
2370b57cec5SDimitry Andric    basic_istream& operator>>(long& __n);
2380b57cec5SDimitry Andric    basic_istream& operator>>(unsigned long& __n);
2390b57cec5SDimitry Andric    basic_istream& operator>>(long long& __n);
2400b57cec5SDimitry Andric    basic_istream& operator>>(unsigned long long& __n);
2410b57cec5SDimitry Andric    basic_istream& operator>>(float& __f);
2420b57cec5SDimitry Andric    basic_istream& operator>>(double& __f);
2430b57cec5SDimitry Andric    basic_istream& operator>>(long double& __f);
2440b57cec5SDimitry Andric    basic_istream& operator>>(void*& __p);
2450b57cec5SDimitry Andric
2460b57cec5SDimitry Andric    // 27.7.1.3 Unformatted input:
2470b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
2480b57cec5SDimitry Andric    streamsize gcount() const {return __gc_;}
2490b57cec5SDimitry Andric    int_type get();
2500b57cec5SDimitry Andric
2510b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2520b57cec5SDimitry Andric    basic_istream& get(char_type& __c) {
2530b57cec5SDimitry Andric      int_type __ch = get();
2540b57cec5SDimitry Andric      if (__ch != traits_type::eof())
2550b57cec5SDimitry Andric        __c = traits_type::to_char_type(__ch);
2560b57cec5SDimitry Andric      return *this;
2570b57cec5SDimitry Andric    }
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2600b57cec5SDimitry Andric    basic_istream& get(char_type* __s, streamsize __n)
2610b57cec5SDimitry Andric    { return get(__s, __n, this->widen('\n')); }
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andric    basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
2640b57cec5SDimitry Andric
2650b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2660b57cec5SDimitry Andric    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
2670b57cec5SDimitry Andric    { return get(__sb, this->widen('\n')); }
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andric    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
2700b57cec5SDimitry Andric
2710b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2720b57cec5SDimitry Andric    basic_istream& getline(char_type* __s, streamsize __n)
2730b57cec5SDimitry Andric    { return getline(__s, __n, this->widen('\n')); }
2740b57cec5SDimitry Andric
2750b57cec5SDimitry Andric    basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andric    basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
2780b57cec5SDimitry Andric    int_type peek();
2790b57cec5SDimitry Andric    basic_istream& read (char_type* __s, streamsize __n);
2800b57cec5SDimitry Andric    streamsize readsome(char_type* __s, streamsize __n);
2810b57cec5SDimitry Andric
2820b57cec5SDimitry Andric    basic_istream& putback(char_type __c);
2830b57cec5SDimitry Andric    basic_istream& unget();
2840b57cec5SDimitry Andric    int sync();
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andric    pos_type tellg();
2870b57cec5SDimitry Andric    basic_istream& seekg(pos_type __pos);
2880b57cec5SDimitry Andric    basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
2890b57cec5SDimitry Andric};
2900b57cec5SDimitry Andric
2910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
2920b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
2930b57cec5SDimitry Andric{
2940b57cec5SDimitry Andric    bool __ok_;
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andricpublic:
2970b57cec5SDimitry Andric    explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
2980b57cec5SDimitry Andric//    ~sentry() = default;
2990b57cec5SDimitry Andric
3000b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
301fe6060f1SDimitry Andric    explicit operator bool() const {return __ok_;}
3020eae32dcSDimitry Andric
3030eae32dcSDimitry Andric    sentry(const sentry&) = delete;
3040eae32dcSDimitry Andric    sentry& operator=(const sentry&) = delete;
3050b57cec5SDimitry Andric};
3060b57cec5SDimitry Andric
3070b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
3080b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
3090b57cec5SDimitry Andric                                               bool __noskipws)
3100b57cec5SDimitry Andric    : __ok_(false)
3110b57cec5SDimitry Andric{
3120b57cec5SDimitry Andric    if (__is.good())
3130b57cec5SDimitry Andric    {
3140b57cec5SDimitry Andric        if (__is.tie())
3150b57cec5SDimitry Andric            __is.tie()->flush();
3160b57cec5SDimitry Andric        if (!__noskipws && (__is.flags() & ios_base::skipws))
3170b57cec5SDimitry Andric        {
3180b57cec5SDimitry Andric            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3190b57cec5SDimitry Andric            const ctype<_CharT>& __ct = 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();
3290b57cec5SDimitry Andric    }
3300b57cec5SDimitry Andric    else
3310b57cec5SDimitry Andric        __is.setstate(ios_base::failbit);
3320b57cec5SDimitry Andric}
3330b57cec5SDimitry Andric
3340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
3350b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
3360b57cec5SDimitry Andric    : __gc_(__rhs.__gc_)
3370b57cec5SDimitry Andric{
3380b57cec5SDimitry Andric    __rhs.__gc_ = 0;
3390b57cec5SDimitry Andric    this->move(__rhs);
3400b57cec5SDimitry Andric}
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
3430b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
3440b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
3450b57cec5SDimitry Andric{
3460b57cec5SDimitry Andric    swap(__rhs);
3470b57cec5SDimitry Andric    return *this;
3480b57cec5SDimitry Andric}
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
3510b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::~basic_istream()
3520b57cec5SDimitry Andric{
3530b57cec5SDimitry Andric}
3540b57cec5SDimitry Andric
3550b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
3560b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
3570b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
3580b57cec5SDimitry Andric__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
3590b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
3600b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
3610b57cec5SDimitry Andric    if (__s)
3620b57cec5SDimitry Andric    {
3630b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
3640b57cec5SDimitry Andric        try
3650b57cec5SDimitry Andric        {
3660b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
3670b57cec5SDimitry Andric            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3680b57cec5SDimitry Andric            typedef num_get<_CharT, _Ip> _Fp;
3690b57cec5SDimitry Andric            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
3700b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
3710b57cec5SDimitry Andric        }
3720b57cec5SDimitry Andric        catch (...)
3730b57cec5SDimitry Andric        {
3740b57cec5SDimitry Andric            __state |= ios_base::badbit;
3750b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
3760b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
3770b57cec5SDimitry Andric            {
3780b57cec5SDimitry Andric                throw;
3790b57cec5SDimitry Andric            }
3800b57cec5SDimitry Andric        }
3810b57cec5SDimitry Andric#endif
3820b57cec5SDimitry Andric        __is.setstate(__state);
3830b57cec5SDimitry Andric    }
3840b57cec5SDimitry Andric    return __is;
3850b57cec5SDimitry Andric}
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
3880b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
3890b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
3900b57cec5SDimitry Andric{
3910b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
3920b57cec5SDimitry Andric}
3930b57cec5SDimitry Andric
3940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
3950b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
3960b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
3970b57cec5SDimitry Andric{
3980b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
3990b57cec5SDimitry Andric}
4000b57cec5SDimitry Andric
4010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4020b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4030b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(long& __n)
4040b57cec5SDimitry Andric{
4050b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<long>(*this, __n);
4060b57cec5SDimitry Andric}
4070b57cec5SDimitry Andric
4080b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4090b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4100b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
4110b57cec5SDimitry Andric{
4120b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
4130b57cec5SDimitry Andric}
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4160b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4170b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(long long& __n)
4180b57cec5SDimitry Andric{
4190b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<long long>(*this, __n);
4200b57cec5SDimitry Andric}
4210b57cec5SDimitry Andric
4220b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4230b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4240b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
4250b57cec5SDimitry Andric{
4260b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
4270b57cec5SDimitry Andric}
4280b57cec5SDimitry Andric
4290b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4300b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4310b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(float& __n)
4320b57cec5SDimitry Andric{
4330b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<float>(*this, __n);
4340b57cec5SDimitry Andric}
4350b57cec5SDimitry Andric
4360b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4370b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4380b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(double& __n)
4390b57cec5SDimitry Andric{
4400b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<double>(*this, __n);
4410b57cec5SDimitry Andric}
4420b57cec5SDimitry Andric
4430b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4440b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4450b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(long double& __n)
4460b57cec5SDimitry Andric{
4470b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<long double>(*this, __n);
4480b57cec5SDimitry Andric}
4490b57cec5SDimitry Andric
4500b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4510b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4520b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(bool& __n)
4530b57cec5SDimitry Andric{
4540b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<bool>(*this, __n);
4550b57cec5SDimitry Andric}
4560b57cec5SDimitry Andric
4570b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
4580b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4590b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(void*& __n)
4600b57cec5SDimitry Andric{
4610b57cec5SDimitry Andric    return _VSTD::__input_arithmetic<void*>(*this, __n);
4620b57cec5SDimitry Andric}
4630b57cec5SDimitry Andric
4640b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
4650b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4660b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
4670b57cec5SDimitry Andric__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
4680b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
4690b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
4700b57cec5SDimitry Andric    if (__s)
4710b57cec5SDimitry Andric    {
4720b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
4730b57cec5SDimitry Andric        try
4740b57cec5SDimitry Andric        {
4750b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
4760b57cec5SDimitry Andric            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
4770b57cec5SDimitry Andric            typedef num_get<_CharT, _Ip> _Fp;
4780b57cec5SDimitry Andric            long __temp;
4790b57cec5SDimitry Andric            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
4800b57cec5SDimitry Andric            if (__temp < numeric_limits<_Tp>::min())
4810b57cec5SDimitry Andric            {
4820b57cec5SDimitry Andric                __state |= ios_base::failbit;
4830b57cec5SDimitry Andric                __n = numeric_limits<_Tp>::min();
4840b57cec5SDimitry Andric            }
4850b57cec5SDimitry Andric            else if (__temp > numeric_limits<_Tp>::max())
4860b57cec5SDimitry Andric            {
4870b57cec5SDimitry Andric                __state |= ios_base::failbit;
4880b57cec5SDimitry Andric                __n = numeric_limits<_Tp>::max();
4890b57cec5SDimitry Andric            }
4900b57cec5SDimitry Andric            else
4910b57cec5SDimitry Andric            {
4920b57cec5SDimitry Andric                __n = static_cast<_Tp>(__temp);
4930b57cec5SDimitry Andric            }
4940b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
4950b57cec5SDimitry Andric        }
4960b57cec5SDimitry Andric        catch (...)
4970b57cec5SDimitry Andric        {
4980b57cec5SDimitry Andric            __state |= ios_base::badbit;
4990b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
5000b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
5010b57cec5SDimitry Andric            {
5020b57cec5SDimitry Andric                throw;
5030b57cec5SDimitry Andric            }
5040b57cec5SDimitry Andric        }
5050b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
5060b57cec5SDimitry Andric        __is.setstate(__state);
5070b57cec5SDimitry Andric    }
5080b57cec5SDimitry Andric    return __is;
5090b57cec5SDimitry Andric}
5100b57cec5SDimitry Andric
5110b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
5120b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
5130b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(short& __n)
5140b57cec5SDimitry Andric{
5150b57cec5SDimitry Andric    return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
5160b57cec5SDimitry Andric}
5170b57cec5SDimitry Andric
5180b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
5190b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
5200b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(int& __n)
5210b57cec5SDimitry Andric{
5220b57cec5SDimitry Andric    return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
5230b57cec5SDimitry Andric}
5240b57cec5SDimitry Andric
5250b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
5260b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
5270b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
5280b57cec5SDimitry Andric__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
5290b57cec5SDimitry Andric{
5300b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
5310b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
5320b57cec5SDimitry Andric    if (__sen)
5330b57cec5SDimitry Andric    {
5340b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
5350b57cec5SDimitry Andric        try
5360b57cec5SDimitry Andric        {
5370b57cec5SDimitry Andric#endif
5380b57cec5SDimitry Andric            _CharT* __s = __p;
5390b57cec5SDimitry Andric            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
5400b57cec5SDimitry Andric            while (__s != __p + (__n-1))
5410b57cec5SDimitry Andric            {
5420b57cec5SDimitry Andric                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
5430b57cec5SDimitry Andric                if (_Traits::eq_int_type(__i, _Traits::eof()))
5440b57cec5SDimitry Andric                {
5450b57cec5SDimitry Andric                   __state |= ios_base::eofbit;
5460b57cec5SDimitry Andric                   break;
5470b57cec5SDimitry Andric                }
5480b57cec5SDimitry Andric                _CharT __ch = _Traits::to_char_type(__i);
5490b57cec5SDimitry Andric                if (__ct.is(__ct.space, __ch))
5500b57cec5SDimitry Andric                    break;
5510b57cec5SDimitry Andric                *__s++ = __ch;
5520b57cec5SDimitry Andric                 __is.rdbuf()->sbumpc();
5530b57cec5SDimitry Andric            }
5540b57cec5SDimitry Andric            *__s = _CharT();
5550b57cec5SDimitry Andric            __is.width(0);
5560b57cec5SDimitry Andric            if (__s == __p)
5570b57cec5SDimitry Andric               __state |= ios_base::failbit;
5580b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
5590b57cec5SDimitry Andric        }
5600b57cec5SDimitry Andric        catch (...)
5610b57cec5SDimitry Andric        {
5620b57cec5SDimitry Andric            __state |= ios_base::badbit;
5630b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
5640b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
5650b57cec5SDimitry Andric            {
5660b57cec5SDimitry Andric                throw;
5670b57cec5SDimitry Andric            }
5680b57cec5SDimitry Andric        }
5690b57cec5SDimitry Andric#endif
5700b57cec5SDimitry Andric        __is.setstate(__state);
5710b57cec5SDimitry Andric    }
5720b57cec5SDimitry Andric    return __is;
5730b57cec5SDimitry Andric}
5740b57cec5SDimitry Andric
5750b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 17
5760b57cec5SDimitry Andric
5770b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, size_t _Np>
5780b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5790b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
5800b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
5810b57cec5SDimitry Andric{
5820b57cec5SDimitry Andric    size_t __n = _Np;
5830b57cec5SDimitry Andric    if (__is.width() > 0)
5840b57cec5SDimitry Andric        __n = _VSTD::min(size_t(__is.width()), _Np);
5850b57cec5SDimitry Andric    return _VSTD::__input_c_string(__is, __buf, __n);
5860b57cec5SDimitry Andric}
5870b57cec5SDimitry Andric
5880b57cec5SDimitry Andrictemplate<class _Traits, size_t _Np>
5890b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5900b57cec5SDimitry Andricbasic_istream<char, _Traits>&
5910b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
5920b57cec5SDimitry Andric{
5930b57cec5SDimitry Andric    return __is >> (char(&)[_Np])__buf;
5940b57cec5SDimitry Andric}
5950b57cec5SDimitry Andric
5960b57cec5SDimitry Andrictemplate<class _Traits, size_t _Np>
5970b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5980b57cec5SDimitry Andricbasic_istream<char, _Traits>&
5990b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
6000b57cec5SDimitry Andric{
6010b57cec5SDimitry Andric    return __is >> (char(&)[_Np])__buf;
6020b57cec5SDimitry Andric}
6030b57cec5SDimitry Andric
6040b57cec5SDimitry Andric#else
6050b57cec5SDimitry Andric
6060b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
6070b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6080b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
6090b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
6100b57cec5SDimitry Andric{
6110b57cec5SDimitry Andric    streamsize __n = __is.width();
6120b57cec5SDimitry Andric    if (__n <= 0)
6130b57cec5SDimitry Andric        __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
6140b57cec5SDimitry Andric    return _VSTD::__input_c_string(__is, __s, size_t(__n));
6150b57cec5SDimitry Andric}
6160b57cec5SDimitry Andric
6170b57cec5SDimitry Andrictemplate<class _Traits>
6180b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6190b57cec5SDimitry Andricbasic_istream<char, _Traits>&
6200b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
6210b57cec5SDimitry Andric{
6220b57cec5SDimitry Andric    return __is >> (char*)__s;
6230b57cec5SDimitry Andric}
6240b57cec5SDimitry Andric
6250b57cec5SDimitry Andrictemplate<class _Traits>
6260b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6270b57cec5SDimitry Andricbasic_istream<char, _Traits>&
6280b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char* __s)
6290b57cec5SDimitry Andric{
6300b57cec5SDimitry Andric    return __is >> (char*)__s;
6310b57cec5SDimitry Andric}
6320b57cec5SDimitry Andric
6330b57cec5SDimitry Andric#endif // _LIBCPP_STD_VER > 17
6340b57cec5SDimitry Andric
6350b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
6360b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
6370b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
6380b57cec5SDimitry Andric{
6390b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
6400b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
6410b57cec5SDimitry Andric    if (__sen)
6420b57cec5SDimitry Andric    {
6430b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
6440b57cec5SDimitry Andric        try
6450b57cec5SDimitry Andric        {
6460b57cec5SDimitry Andric#endif
6470b57cec5SDimitry Andric            typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
6480b57cec5SDimitry Andric            if (_Traits::eq_int_type(__i, _Traits::eof()))
6490b57cec5SDimitry Andric                __state |= ios_base::eofbit | ios_base::failbit;
6500b57cec5SDimitry Andric            else
6510b57cec5SDimitry Andric                __c = _Traits::to_char_type(__i);
6520b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
6530b57cec5SDimitry Andric        }
6540b57cec5SDimitry Andric        catch (...)
6550b57cec5SDimitry Andric        {
6560b57cec5SDimitry Andric            __state |= ios_base::badbit;
6570b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
6580b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
6590b57cec5SDimitry Andric            {
6600b57cec5SDimitry Andric                throw;
6610b57cec5SDimitry Andric            }
6620b57cec5SDimitry Andric        }
6630b57cec5SDimitry Andric#endif
6640b57cec5SDimitry Andric        __is.setstate(__state);
6650b57cec5SDimitry Andric    }
6660b57cec5SDimitry Andric    return __is;
6670b57cec5SDimitry Andric}
6680b57cec5SDimitry Andric
6690b57cec5SDimitry Andrictemplate<class _Traits>
6700b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6710b57cec5SDimitry Andricbasic_istream<char, _Traits>&
6720b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
6730b57cec5SDimitry Andric{
6740b57cec5SDimitry Andric    return __is >> (char&)__c;
6750b57cec5SDimitry Andric}
6760b57cec5SDimitry Andric
6770b57cec5SDimitry Andrictemplate<class _Traits>
6780b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6790b57cec5SDimitry Andricbasic_istream<char, _Traits>&
6800b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char& __c)
6810b57cec5SDimitry Andric{
6820b57cec5SDimitry Andric    return __is >> (char&)__c;
6830b57cec5SDimitry Andric}
6840b57cec5SDimitry Andric
6850b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
6860b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
6870b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
6880b57cec5SDimitry Andric{
6890b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
6900b57cec5SDimitry Andric    __gc_ = 0;
6910b57cec5SDimitry Andric    sentry __s(*this, true);
6920b57cec5SDimitry Andric    if (__s)
6930b57cec5SDimitry Andric    {
6940b57cec5SDimitry Andric        if (__sb)
6950b57cec5SDimitry Andric        {
6960b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
6970b57cec5SDimitry Andric            try
6980b57cec5SDimitry Andric            {
6990b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
7000b57cec5SDimitry Andric                while (true)
7010b57cec5SDimitry Andric                {
7020b57cec5SDimitry Andric                    typename traits_type::int_type __i = this->rdbuf()->sgetc();
7030b57cec5SDimitry Andric                    if (traits_type::eq_int_type(__i, _Traits::eof()))
7040b57cec5SDimitry Andric                    {
7050b57cec5SDimitry Andric                       __state |= ios_base::eofbit;
7060b57cec5SDimitry Andric                       break;
7070b57cec5SDimitry Andric                    }
7080b57cec5SDimitry Andric                    if (traits_type::eq_int_type(
7090b57cec5SDimitry Andric                            __sb->sputc(traits_type::to_char_type(__i)),
7100b57cec5SDimitry Andric                            traits_type::eof()))
7110b57cec5SDimitry Andric                        break;
7120b57cec5SDimitry Andric                    ++__gc_;
7130b57cec5SDimitry Andric                    this->rdbuf()->sbumpc();
7140b57cec5SDimitry Andric                }
7150b57cec5SDimitry Andric                if (__gc_ == 0)
7160b57cec5SDimitry Andric                   __state |= ios_base::failbit;
7170b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
7180b57cec5SDimitry Andric            }
7190b57cec5SDimitry Andric            catch (...)
7200b57cec5SDimitry Andric            {
7210b57cec5SDimitry Andric                __state |= ios_base::badbit;
7220b57cec5SDimitry Andric                if (__gc_ == 0)
7230b57cec5SDimitry Andric                    __state |= ios_base::failbit;
7240b57cec5SDimitry Andric
7250b57cec5SDimitry Andric                this->__setstate_nothrow(__state);
7260b57cec5SDimitry Andric                if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit)
7270b57cec5SDimitry Andric                {
7280b57cec5SDimitry Andric                    throw;
7290b57cec5SDimitry Andric                }
7300b57cec5SDimitry Andric            }
7310b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
7320b57cec5SDimitry Andric        }
7330b57cec5SDimitry Andric        else
7340b57cec5SDimitry Andric        {
7350b57cec5SDimitry Andric            __state |= ios_base::failbit;
7360b57cec5SDimitry Andric        }
7370b57cec5SDimitry Andric        this->setstate(__state);
7380b57cec5SDimitry Andric    }
7390b57cec5SDimitry Andric    return *this;
7400b57cec5SDimitry Andric}
7410b57cec5SDimitry Andric
7420b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
7430b57cec5SDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type
7440b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::get()
7450b57cec5SDimitry Andric{
7460b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
7470b57cec5SDimitry Andric    __gc_ = 0;
7480b57cec5SDimitry Andric    int_type __r = traits_type::eof();
7490b57cec5SDimitry Andric    sentry __s(*this, true);
7500b57cec5SDimitry Andric    if (__s)
7510b57cec5SDimitry Andric    {
7520b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
7530b57cec5SDimitry Andric        try
7540b57cec5SDimitry Andric        {
7550b57cec5SDimitry Andric#endif
7560b57cec5SDimitry Andric            __r = this->rdbuf()->sbumpc();
7570b57cec5SDimitry Andric            if (traits_type::eq_int_type(__r, traits_type::eof()))
7580b57cec5SDimitry Andric               __state |= ios_base::failbit | ios_base::eofbit;
7590b57cec5SDimitry Andric            else
7600b57cec5SDimitry Andric                __gc_ = 1;
7610b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
7620b57cec5SDimitry Andric        }
7630b57cec5SDimitry Andric        catch (...)
7640b57cec5SDimitry Andric        {
7650b57cec5SDimitry Andric            this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
7660b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
7670b57cec5SDimitry Andric            {
7680b57cec5SDimitry Andric                throw;
7690b57cec5SDimitry Andric            }
7700b57cec5SDimitry Andric        }
7710b57cec5SDimitry Andric#endif
7720b57cec5SDimitry Andric        this->setstate(__state);
7730b57cec5SDimitry Andric    }
7740b57cec5SDimitry Andric    return __r;
7750b57cec5SDimitry Andric}
7760b57cec5SDimitry Andric
7770b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
7780b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
7790b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
7800b57cec5SDimitry Andric{
7810b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
7820b57cec5SDimitry Andric    __gc_ = 0;
7830b57cec5SDimitry Andric    sentry __sen(*this, true);
7840b57cec5SDimitry Andric    if (__sen)
7850b57cec5SDimitry Andric    {
7860b57cec5SDimitry Andric        if (__n > 0)
7870b57cec5SDimitry Andric        {
7880b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
7890b57cec5SDimitry Andric            try
7900b57cec5SDimitry Andric            {
7910b57cec5SDimitry Andric#endif
7920b57cec5SDimitry Andric                while (__gc_ < __n-1)
7930b57cec5SDimitry Andric                {
7940b57cec5SDimitry Andric                    int_type __i = this->rdbuf()->sgetc();
7950b57cec5SDimitry Andric                    if (traits_type::eq_int_type(__i, traits_type::eof()))
7960b57cec5SDimitry Andric                    {
7970b57cec5SDimitry Andric                       __state |= ios_base::eofbit;
7980b57cec5SDimitry Andric                       break;
7990b57cec5SDimitry Andric                    }
8000b57cec5SDimitry Andric                    char_type __ch = traits_type::to_char_type(__i);
8010b57cec5SDimitry Andric                    if (traits_type::eq(__ch, __dlm))
8020b57cec5SDimitry Andric                        break;
8030b57cec5SDimitry Andric                    *__s++ = __ch;
8040b57cec5SDimitry Andric                    ++__gc_;
8050b57cec5SDimitry Andric                     this->rdbuf()->sbumpc();
8060b57cec5SDimitry Andric                }
8070b57cec5SDimitry Andric                if (__gc_ == 0)
8080b57cec5SDimitry Andric                   __state |= ios_base::failbit;
8090b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
8100b57cec5SDimitry Andric            }
8110b57cec5SDimitry Andric            catch (...)
8120b57cec5SDimitry Andric            {
8130b57cec5SDimitry Andric                __state |= ios_base::badbit;
8140b57cec5SDimitry Andric                this->__setstate_nothrow(__state);
8150b57cec5SDimitry Andric                if (this->exceptions() & ios_base::badbit)
8160b57cec5SDimitry Andric                {
8170b57cec5SDimitry Andric                    if (__n > 0)
8180b57cec5SDimitry Andric                        *__s = char_type();
8190b57cec5SDimitry Andric                    throw;
8200b57cec5SDimitry Andric                }
8210b57cec5SDimitry Andric            }
8220b57cec5SDimitry Andric#endif
8230b57cec5SDimitry Andric        }
8240b57cec5SDimitry Andric        else
8250b57cec5SDimitry Andric        {
8260b57cec5SDimitry Andric            __state |= ios_base::failbit;
8270b57cec5SDimitry Andric        }
8280b57cec5SDimitry Andric
8290b57cec5SDimitry Andric        if (__n > 0)
8300b57cec5SDimitry Andric            *__s = char_type();
8310b57cec5SDimitry Andric        this->setstate(__state);
8320b57cec5SDimitry Andric    }
8330b57cec5SDimitry Andric    if (__n > 0)
8340b57cec5SDimitry Andric        *__s = char_type();
8350b57cec5SDimitry Andric    return *this;
8360b57cec5SDimitry Andric}
8370b57cec5SDimitry Andric
8380b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
8390b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
8400b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
8410b57cec5SDimitry Andric                                    char_type __dlm)
8420b57cec5SDimitry Andric{
8430b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
8440b57cec5SDimitry Andric    __gc_ = 0;
8450b57cec5SDimitry Andric    sentry __sen(*this, true);
8460b57cec5SDimitry Andric    if (__sen)
8470b57cec5SDimitry Andric    {
8480b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
8490b57cec5SDimitry Andric        try
8500b57cec5SDimitry Andric        {
8510b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
8520b57cec5SDimitry Andric            while (true)
8530b57cec5SDimitry Andric            {
8540b57cec5SDimitry Andric                typename traits_type::int_type __i = this->rdbuf()->sgetc();
8550b57cec5SDimitry Andric                if (traits_type::eq_int_type(__i, traits_type::eof()))
8560b57cec5SDimitry Andric                {
8570b57cec5SDimitry Andric                   __state |= ios_base::eofbit;
8580b57cec5SDimitry Andric                   break;
8590b57cec5SDimitry Andric                }
8600b57cec5SDimitry Andric                char_type __ch = traits_type::to_char_type(__i);
8610b57cec5SDimitry Andric                if (traits_type::eq(__ch, __dlm))
8620b57cec5SDimitry Andric                    break;
8630b57cec5SDimitry Andric                if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
8640b57cec5SDimitry Andric                    break;
8650b57cec5SDimitry Andric                ++__gc_;
8660b57cec5SDimitry Andric                this->rdbuf()->sbumpc();
8670b57cec5SDimitry Andric            }
8680b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
8690b57cec5SDimitry Andric        }
8700b57cec5SDimitry Andric        catch (...)
8710b57cec5SDimitry Andric        {
8720b57cec5SDimitry Andric            __state |= ios_base::badbit;
8730b57cec5SDimitry Andric            // according to the spec, exceptions here are caught but not rethrown
8740b57cec5SDimitry Andric        }
8750b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
8760b57cec5SDimitry Andric        if (__gc_ == 0)
8770b57cec5SDimitry Andric           __state |= ios_base::failbit;
8780b57cec5SDimitry Andric        this->setstate(__state);
8790b57cec5SDimitry Andric    }
8800b57cec5SDimitry Andric    return *this;
8810b57cec5SDimitry Andric}
8820b57cec5SDimitry Andric
8830b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
8840b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
8850b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
8860b57cec5SDimitry Andric{
8870b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
8880b57cec5SDimitry Andric    __gc_ = 0;
8890b57cec5SDimitry Andric    sentry __sen(*this, true);
8900b57cec5SDimitry Andric    if (__sen)
8910b57cec5SDimitry Andric    {
8920b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
8930b57cec5SDimitry Andric        try
8940b57cec5SDimitry Andric        {
8950b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
8960b57cec5SDimitry Andric            while (true)
8970b57cec5SDimitry Andric            {
8980b57cec5SDimitry Andric                typename traits_type::int_type __i = this->rdbuf()->sgetc();
8990b57cec5SDimitry Andric                if (traits_type::eq_int_type(__i, traits_type::eof()))
9000b57cec5SDimitry Andric                {
9010b57cec5SDimitry Andric                   __state |= ios_base::eofbit;
9020b57cec5SDimitry Andric                   break;
9030b57cec5SDimitry Andric                }
9040b57cec5SDimitry Andric                char_type __ch = traits_type::to_char_type(__i);
9050b57cec5SDimitry Andric                if (traits_type::eq(__ch, __dlm))
9060b57cec5SDimitry Andric                {
9070b57cec5SDimitry Andric                    this->rdbuf()->sbumpc();
9080b57cec5SDimitry Andric                    ++__gc_;
9090b57cec5SDimitry Andric                    break;
9100b57cec5SDimitry Andric                }
9110b57cec5SDimitry Andric                if (__gc_ >= __n-1)
9120b57cec5SDimitry Andric                {
9130b57cec5SDimitry Andric                    __state |= ios_base::failbit;
9140b57cec5SDimitry Andric                    break;
9150b57cec5SDimitry Andric                }
9160b57cec5SDimitry Andric                *__s++ = __ch;
9170b57cec5SDimitry Andric                this->rdbuf()->sbumpc();
9180b57cec5SDimitry Andric                ++__gc_;
9190b57cec5SDimitry Andric            }
9200b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
9210b57cec5SDimitry Andric        }
9220b57cec5SDimitry Andric        catch (...)
9230b57cec5SDimitry Andric        {
9240b57cec5SDimitry Andric            __state |= ios_base::badbit;
9250b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
9260b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
9270b57cec5SDimitry Andric            {
9280b57cec5SDimitry Andric                if (__n > 0)
9290b57cec5SDimitry Andric                    *__s = char_type();
9300b57cec5SDimitry Andric                if (__gc_ == 0)
9310b57cec5SDimitry Andric                    __state |= ios_base::failbit;
9320b57cec5SDimitry Andric                throw;
9330b57cec5SDimitry Andric            }
9340b57cec5SDimitry Andric        }
9350b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
9360b57cec5SDimitry Andric    }
9370b57cec5SDimitry Andric    if (__n > 0)
9380b57cec5SDimitry Andric        *__s = char_type();
9390b57cec5SDimitry Andric    if (__gc_ == 0)
9400b57cec5SDimitry Andric        __state |= ios_base::failbit;
9410b57cec5SDimitry Andric    this->setstate(__state);
9420b57cec5SDimitry Andric    return *this;
9430b57cec5SDimitry Andric}
9440b57cec5SDimitry Andric
9450b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
9460b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
9470b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
9480b57cec5SDimitry Andric{
9490b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
9500b57cec5SDimitry Andric    __gc_ = 0;
9510b57cec5SDimitry Andric    sentry __sen(*this, true);
9520b57cec5SDimitry Andric    if (__sen)
9530b57cec5SDimitry Andric    {
9540b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
9550b57cec5SDimitry Andric        try
9560b57cec5SDimitry Andric        {
9570b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
9580b57cec5SDimitry Andric            if (__n == numeric_limits<streamsize>::max())
9590b57cec5SDimitry Andric            {
9600b57cec5SDimitry Andric                while (true)
9610b57cec5SDimitry Andric                {
9620b57cec5SDimitry Andric                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
9630b57cec5SDimitry Andric                    if (traits_type::eq_int_type(__i, traits_type::eof()))
9640b57cec5SDimitry Andric                    {
9650b57cec5SDimitry Andric                       __state |= ios_base::eofbit;
9660b57cec5SDimitry Andric                       break;
9670b57cec5SDimitry Andric                    }
9680b57cec5SDimitry Andric                    ++__gc_;
9690b57cec5SDimitry Andric                    if (traits_type::eq_int_type(__i, __dlm))
9700b57cec5SDimitry Andric                        break;
9710b57cec5SDimitry Andric                }
9720b57cec5SDimitry Andric            }
9730b57cec5SDimitry Andric            else
9740b57cec5SDimitry Andric            {
9750b57cec5SDimitry Andric                while (__gc_ < __n)
9760b57cec5SDimitry Andric                {
9770b57cec5SDimitry Andric                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
9780b57cec5SDimitry Andric                    if (traits_type::eq_int_type(__i, traits_type::eof()))
9790b57cec5SDimitry Andric                    {
9800b57cec5SDimitry Andric                       __state |= ios_base::eofbit;
9810b57cec5SDimitry Andric                       break;
9820b57cec5SDimitry Andric                    }
9830b57cec5SDimitry Andric                    ++__gc_;
9840b57cec5SDimitry Andric                    if (traits_type::eq_int_type(__i, __dlm))
9850b57cec5SDimitry Andric                        break;
9860b57cec5SDimitry Andric                }
9870b57cec5SDimitry Andric            }
9880b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
9890b57cec5SDimitry Andric        }
9900b57cec5SDimitry Andric        catch (...)
9910b57cec5SDimitry Andric        {
9920b57cec5SDimitry Andric            __state |= ios_base::badbit;
9930b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
9940b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
9950b57cec5SDimitry Andric            {
9960b57cec5SDimitry Andric                throw;
9970b57cec5SDimitry Andric            }
9980b57cec5SDimitry Andric        }
9990b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
10000b57cec5SDimitry Andric        this->setstate(__state);
10010b57cec5SDimitry Andric    }
10020b57cec5SDimitry Andric    return *this;
10030b57cec5SDimitry Andric}
10040b57cec5SDimitry Andric
10050b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
10060b57cec5SDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type
10070b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::peek()
10080b57cec5SDimitry Andric{
10090b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
10100b57cec5SDimitry Andric    __gc_ = 0;
10110b57cec5SDimitry Andric    int_type __r = traits_type::eof();
10120b57cec5SDimitry Andric    sentry __sen(*this, true);
10130b57cec5SDimitry Andric    if (__sen)
10140b57cec5SDimitry Andric    {
10150b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
10160b57cec5SDimitry Andric        try
10170b57cec5SDimitry Andric        {
10180b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
10190b57cec5SDimitry Andric            __r = this->rdbuf()->sgetc();
10200b57cec5SDimitry Andric            if (traits_type::eq_int_type(__r, traits_type::eof()))
10210b57cec5SDimitry Andric                __state |= ios_base::eofbit;
10220b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
10230b57cec5SDimitry Andric        }
10240b57cec5SDimitry Andric        catch (...)
10250b57cec5SDimitry Andric        {
10260b57cec5SDimitry Andric            __state |= ios_base::badbit;
10270b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
10280b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
10290b57cec5SDimitry Andric            {
10300b57cec5SDimitry Andric                throw;
10310b57cec5SDimitry Andric            }
10320b57cec5SDimitry Andric        }
10330b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
10340b57cec5SDimitry Andric        this->setstate(__state);
10350b57cec5SDimitry Andric    }
10360b57cec5SDimitry Andric    return __r;
10370b57cec5SDimitry Andric}
10380b57cec5SDimitry Andric
10390b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
10400b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
10410b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
10420b57cec5SDimitry Andric{
10430b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
10440b57cec5SDimitry Andric    __gc_ = 0;
10450b57cec5SDimitry Andric    sentry __sen(*this, true);
10460b57cec5SDimitry Andric    if (__sen)
10470b57cec5SDimitry Andric    {
10480b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
10490b57cec5SDimitry Andric        try
10500b57cec5SDimitry Andric        {
10510b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
10520b57cec5SDimitry Andric            __gc_ = this->rdbuf()->sgetn(__s, __n);
10530b57cec5SDimitry Andric            if (__gc_ != __n)
10540b57cec5SDimitry Andric                __state |= ios_base::failbit | ios_base::eofbit;
10550b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
10560b57cec5SDimitry Andric        }
10570b57cec5SDimitry Andric        catch (...)
10580b57cec5SDimitry Andric        {
10590b57cec5SDimitry Andric            __state |= ios_base::badbit;
10600b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
10610b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
10620b57cec5SDimitry Andric            {
10630b57cec5SDimitry Andric                throw;
10640b57cec5SDimitry Andric            }
10650b57cec5SDimitry Andric        }
10660b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
10670b57cec5SDimitry Andric    }
10680b57cec5SDimitry Andric    else
10690b57cec5SDimitry Andric    {
10700b57cec5SDimitry Andric        __state |= ios_base::failbit;
10710b57cec5SDimitry Andric    }
10720b57cec5SDimitry Andric    this->setstate(__state);
10730b57cec5SDimitry Andric    return *this;
10740b57cec5SDimitry Andric}
10750b57cec5SDimitry Andric
10760b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
10770b57cec5SDimitry Andricstreamsize
10780b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
10790b57cec5SDimitry Andric{
10800b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
10810b57cec5SDimitry Andric    __gc_ = 0;
10820b57cec5SDimitry Andric    sentry __sen(*this, true);
10830b57cec5SDimitry Andric    if (__sen)
10840b57cec5SDimitry Andric    {
10850b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
10860b57cec5SDimitry Andric        try
10870b57cec5SDimitry Andric        {
10880b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
10890b57cec5SDimitry Andric            streamsize __c = this->rdbuf()->in_avail();
10900b57cec5SDimitry Andric            switch (__c)
10910b57cec5SDimitry Andric            {
10920b57cec5SDimitry Andric            case -1:
10930b57cec5SDimitry Andric                __state |= ios_base::eofbit;
10940b57cec5SDimitry Andric                break;
10950b57cec5SDimitry Andric            case 0:
10960b57cec5SDimitry Andric                break;
10970b57cec5SDimitry Andric            default:
10980b57cec5SDimitry Andric                __n = _VSTD::min(__c, __n);
10990b57cec5SDimitry Andric                __gc_ = this->rdbuf()->sgetn(__s, __n);
11000b57cec5SDimitry Andric                if (__gc_ != __n)
11010b57cec5SDimitry Andric                    __state |= ios_base::failbit | ios_base::eofbit;
11020b57cec5SDimitry Andric                break;
11030b57cec5SDimitry Andric            }
11040b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
11050b57cec5SDimitry Andric        }
11060b57cec5SDimitry Andric        catch (...)
11070b57cec5SDimitry Andric        {
11080b57cec5SDimitry Andric            __state |= ios_base::badbit;
11090b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
11100b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
11110b57cec5SDimitry Andric            {
11120b57cec5SDimitry Andric                throw;
11130b57cec5SDimitry Andric            }
11140b57cec5SDimitry Andric        }
11150b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
11160b57cec5SDimitry Andric    }
11170b57cec5SDimitry Andric    else
11180b57cec5SDimitry Andric    {
11190b57cec5SDimitry Andric        __state |= ios_base::failbit;
11200b57cec5SDimitry Andric    }
11210b57cec5SDimitry Andric    this->setstate(__state);
11220b57cec5SDimitry Andric    return __gc_;
11230b57cec5SDimitry Andric}
11240b57cec5SDimitry Andric
11250b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
11260b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
11270b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::putback(char_type __c)
11280b57cec5SDimitry Andric{
11290b57cec5SDimitry Andric    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
11300b57cec5SDimitry Andric    __gc_ = 0;
11310b57cec5SDimitry Andric    this->clear(__state);
11320b57cec5SDimitry Andric    sentry __sen(*this, true);
11330b57cec5SDimitry Andric    if (__sen)
11340b57cec5SDimitry Andric    {
11350b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
11360b57cec5SDimitry Andric        try
11370b57cec5SDimitry Andric        {
11380b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
1139e8d8bef9SDimitry Andric            if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
11400b57cec5SDimitry Andric                __state |= ios_base::badbit;
11410b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
11420b57cec5SDimitry Andric        }
11430b57cec5SDimitry Andric        catch (...)
11440b57cec5SDimitry Andric        {
11450b57cec5SDimitry Andric            __state |= ios_base::badbit;
11460b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
11470b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
11480b57cec5SDimitry Andric            {
11490b57cec5SDimitry Andric                throw;
11500b57cec5SDimitry Andric            }
11510b57cec5SDimitry Andric        }
11520b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
11530b57cec5SDimitry Andric    }
11540b57cec5SDimitry Andric    else
11550b57cec5SDimitry Andric    {
11560b57cec5SDimitry Andric        __state |= ios_base::failbit;
11570b57cec5SDimitry Andric    }
11580b57cec5SDimitry Andric    this->setstate(__state);
11590b57cec5SDimitry Andric    return *this;
11600b57cec5SDimitry Andric}
11610b57cec5SDimitry Andric
11620b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
11630b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
11640b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::unget()
11650b57cec5SDimitry Andric{
11660b57cec5SDimitry Andric    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
11670b57cec5SDimitry Andric    __gc_ = 0;
11680b57cec5SDimitry Andric    this->clear(__state);
11690b57cec5SDimitry Andric    sentry __sen(*this, true);
11700b57cec5SDimitry Andric    if (__sen)
11710b57cec5SDimitry Andric    {
11720b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
11730b57cec5SDimitry Andric        try
11740b57cec5SDimitry Andric        {
11750b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
1176e8d8bef9SDimitry Andric            if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
11770b57cec5SDimitry Andric                __state |= ios_base::badbit;
11780b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
11790b57cec5SDimitry Andric        }
11800b57cec5SDimitry Andric        catch (...)
11810b57cec5SDimitry Andric        {
11820b57cec5SDimitry Andric            __state |= ios_base::badbit;
11830b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
11840b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
11850b57cec5SDimitry Andric            {
11860b57cec5SDimitry Andric                throw;
11870b57cec5SDimitry Andric            }
11880b57cec5SDimitry Andric        }
11890b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
11900b57cec5SDimitry Andric    }
11910b57cec5SDimitry Andric    else
11920b57cec5SDimitry Andric    {
11930b57cec5SDimitry Andric        __state |= ios_base::failbit;
11940b57cec5SDimitry Andric    }
11950b57cec5SDimitry Andric    this->setstate(__state);
11960b57cec5SDimitry Andric    return *this;
11970b57cec5SDimitry Andric}
11980b57cec5SDimitry Andric
11990b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
12000b57cec5SDimitry Andricint
12010b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::sync()
12020b57cec5SDimitry Andric{
12030b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
12040b57cec5SDimitry Andric    int __r = 0;
12050b57cec5SDimitry Andric    sentry __sen(*this, true);
12060b57cec5SDimitry Andric    if (__sen)
12070b57cec5SDimitry Andric    {
12080b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
12090b57cec5SDimitry Andric        try
12100b57cec5SDimitry Andric        {
12110b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
1212e8d8bef9SDimitry Andric            if (this->rdbuf() == nullptr)
12130b57cec5SDimitry Andric                return -1;
12140b57cec5SDimitry Andric            if (this->rdbuf()->pubsync() == -1)
12150b57cec5SDimitry Andric            {
12160b57cec5SDimitry Andric                __state |= ios_base::badbit;
12170b57cec5SDimitry Andric                return -1;
12180b57cec5SDimitry Andric            }
12190b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
12200b57cec5SDimitry Andric        }
12210b57cec5SDimitry Andric        catch (...)
12220b57cec5SDimitry Andric        {
12230b57cec5SDimitry Andric            __state |= ios_base::badbit;
12240b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
12250b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
12260b57cec5SDimitry Andric            {
12270b57cec5SDimitry Andric                throw;
12280b57cec5SDimitry Andric            }
12290b57cec5SDimitry Andric        }
12300b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
12310b57cec5SDimitry Andric        this->setstate(__state);
12320b57cec5SDimitry Andric    }
12330b57cec5SDimitry Andric    return __r;
12340b57cec5SDimitry Andric}
12350b57cec5SDimitry Andric
12360b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
12370b57cec5SDimitry Andrictypename basic_istream<_CharT, _Traits>::pos_type
12380b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::tellg()
12390b57cec5SDimitry Andric{
12400b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
12410b57cec5SDimitry Andric    pos_type __r(-1);
12420b57cec5SDimitry Andric    sentry __sen(*this, true);
12430b57cec5SDimitry Andric    if (__sen)
12440b57cec5SDimitry Andric    {
12450b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
12460b57cec5SDimitry Andric        try
12470b57cec5SDimitry Andric        {
12480b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
12490b57cec5SDimitry Andric        __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
12500b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
12510b57cec5SDimitry Andric        }
12520b57cec5SDimitry Andric        catch (...)
12530b57cec5SDimitry Andric        {
12540b57cec5SDimitry Andric            __state |= ios_base::badbit;
12550b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
12560b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
12570b57cec5SDimitry Andric            {
12580b57cec5SDimitry Andric                throw;
12590b57cec5SDimitry Andric            }
12600b57cec5SDimitry Andric        }
12610b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
12620b57cec5SDimitry Andric        this->setstate(__state);
12630b57cec5SDimitry Andric    }
12640b57cec5SDimitry Andric    return __r;
12650b57cec5SDimitry Andric}
12660b57cec5SDimitry Andric
12670b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
12680b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
12690b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::seekg(pos_type __pos)
12700b57cec5SDimitry Andric{
12710b57cec5SDimitry Andric    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
12720b57cec5SDimitry Andric    this->clear(__state);
12730b57cec5SDimitry Andric    sentry __sen(*this, true);
12740b57cec5SDimitry Andric    if (__sen)
12750b57cec5SDimitry Andric    {
12760b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
12770b57cec5SDimitry Andric        try
12780b57cec5SDimitry Andric        {
12790b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
12800b57cec5SDimitry Andric            if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
12810b57cec5SDimitry Andric                __state |= ios_base::failbit;
12820b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
12830b57cec5SDimitry Andric        }
12840b57cec5SDimitry Andric        catch (...)
12850b57cec5SDimitry Andric        {
12860b57cec5SDimitry Andric            __state |= ios_base::badbit;
12870b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
12880b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
12890b57cec5SDimitry Andric            {
12900b57cec5SDimitry Andric                throw;
12910b57cec5SDimitry Andric            }
12920b57cec5SDimitry Andric        }
12930b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
12940b57cec5SDimitry Andric        this->setstate(__state);
12950b57cec5SDimitry Andric    }
12960b57cec5SDimitry Andric    return *this;
12970b57cec5SDimitry Andric}
12980b57cec5SDimitry Andric
12990b57cec5SDimitry Andrictemplate<class _CharT, class _Traits>
13000b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
13010b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
13020b57cec5SDimitry Andric{
13030b57cec5SDimitry Andric    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
13040b57cec5SDimitry Andric    this->clear(__state);
13050b57cec5SDimitry Andric    sentry __sen(*this, true);
13060b57cec5SDimitry Andric    if (__sen)
13070b57cec5SDimitry Andric    {
13080b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
13090b57cec5SDimitry Andric        try
13100b57cec5SDimitry Andric        {
13110b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
13120b57cec5SDimitry Andric            if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
13130b57cec5SDimitry Andric                __state |= ios_base::failbit;
13140b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
13150b57cec5SDimitry Andric        }
13160b57cec5SDimitry Andric        catch (...)
13170b57cec5SDimitry Andric        {
13180b57cec5SDimitry Andric            __state |= ios_base::badbit;
13190b57cec5SDimitry Andric            this->__setstate_nothrow(__state);
13200b57cec5SDimitry Andric            if (this->exceptions() & ios_base::badbit)
13210b57cec5SDimitry Andric            {
13220b57cec5SDimitry Andric                throw;
13230b57cec5SDimitry Andric            }
13240b57cec5SDimitry Andric        }
13250b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
13260b57cec5SDimitry Andric        this->setstate(__state);
13270b57cec5SDimitry Andric    }
13280b57cec5SDimitry Andric    return *this;
13290b57cec5SDimitry Andric}
13300b57cec5SDimitry Andric
13310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
13320b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
13330b57cec5SDimitry Andricws(basic_istream<_CharT, _Traits>& __is)
13340b57cec5SDimitry Andric{
13350b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
13360b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
13370b57cec5SDimitry Andric    if (__sen)
13380b57cec5SDimitry Andric    {
13390b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
13400b57cec5SDimitry Andric        try
13410b57cec5SDimitry Andric        {
13420b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
13430b57cec5SDimitry Andric            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
13440b57cec5SDimitry Andric            while (true)
13450b57cec5SDimitry Andric            {
13460b57cec5SDimitry Andric                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
13470b57cec5SDimitry Andric                if (_Traits::eq_int_type(__i, _Traits::eof()))
13480b57cec5SDimitry Andric                {
13490b57cec5SDimitry Andric                   __state |= ios_base::eofbit;
13500b57cec5SDimitry Andric                   break;
13510b57cec5SDimitry Andric                }
13520b57cec5SDimitry Andric                if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
13530b57cec5SDimitry Andric                    break;
13540b57cec5SDimitry Andric                __is.rdbuf()->sbumpc();
13550b57cec5SDimitry Andric            }
13560b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
13570b57cec5SDimitry Andric        }
13580b57cec5SDimitry Andric        catch (...)
13590b57cec5SDimitry Andric        {
13600b57cec5SDimitry Andric            __state |= ios_base::badbit;
13610b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
13620b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
13630b57cec5SDimitry Andric            {
13640b57cec5SDimitry Andric                throw;
13650b57cec5SDimitry Andric            }
13660b57cec5SDimitry Andric        }
13670b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
13680b57cec5SDimitry Andric        __is.setstate(__state);
13690b57cec5SDimitry Andric    }
13700b57cec5SDimitry Andric    return __is;
13710b57cec5SDimitry Andric}
13720b57cec5SDimitry Andric
1373e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = void>
1374e8d8bef9SDimitry Andricstruct __is_istreamable : false_type { };
1375e8d8bef9SDimitry Andric
1376e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp>
1377e8d8bef9SDimitry Andricstruct __is_istreamable<_Stream, _Tp, decltype(
1378fe6060f1SDimitry Andric    declval<_Stream>() >> declval<_Tp>(), void()
1379e8d8bef9SDimitry Andric)> : true_type { };
1380e8d8bef9SDimitry Andric
1381e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = typename enable_if<
1382e8d8bef9SDimitry Andric    _And<is_base_of<ios_base, _Stream>,
1383e8d8bef9SDimitry Andric         __is_istreamable<_Stream&, _Tp&&> >::value
1384e8d8bef9SDimitry Andric>::type>
1385e8d8bef9SDimitry Andric_LIBCPP_INLINE_VISIBILITY
1386e8d8bef9SDimitry Andric_Stream&& operator>>(_Stream&& __is, _Tp&& __x)
13870b57cec5SDimitry Andric{
13880b57cec5SDimitry Andric    __is >> _VSTD::forward<_Tp>(__x);
1389e8d8bef9SDimitry Andric    return _VSTD::move(__is);
13900b57cec5SDimitry Andric}
13910b57cec5SDimitry Andric
13920b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
13930b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_iostream
13940b57cec5SDimitry Andric    : public basic_istream<_CharT, _Traits>,
13950b57cec5SDimitry Andric      public basic_ostream<_CharT, _Traits>
13960b57cec5SDimitry Andric{
13970b57cec5SDimitry Andricpublic:
13980b57cec5SDimitry Andric    // types:
13990b57cec5SDimitry Andric    typedef _CharT                         char_type;
14000b57cec5SDimitry Andric    typedef _Traits                        traits_type;
14010b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
14020b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
14030b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
14040b57cec5SDimitry Andric
14050b57cec5SDimitry Andric    // constructor/destructor
14060b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
14070b57cec5SDimitry Andric    explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
14080b57cec5SDimitry Andric      : basic_istream<_CharT, _Traits>(__sb)
14090b57cec5SDimitry Andric    {}
14100b57cec5SDimitry Andric
14110b57cec5SDimitry Andric    virtual ~basic_iostream();
14120b57cec5SDimitry Andricprotected:
14130b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
14140b57cec5SDimitry Andric    basic_iostream(basic_iostream&& __rhs);
14150b57cec5SDimitry Andric
14160b57cec5SDimitry Andric    // assign/swap
14170b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
14180b57cec5SDimitry Andric    basic_iostream& operator=(basic_iostream&& __rhs);
1419fe6060f1SDimitry Andric
14200b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
14210b57cec5SDimitry Andric    void swap(basic_iostream& __rhs)
14220b57cec5SDimitry Andric    { basic_istream<char_type, traits_type>::swap(__rhs); }
14230b57cec5SDimitry Andric};
14240b57cec5SDimitry Andric
14250b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
14260b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
14270b57cec5SDimitry Andric    : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
14280b57cec5SDimitry Andric{
14290b57cec5SDimitry Andric}
14300b57cec5SDimitry Andric
14310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
14320b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>&
14330b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
14340b57cec5SDimitry Andric{
14350b57cec5SDimitry Andric    swap(__rhs);
14360b57cec5SDimitry Andric    return *this;
14370b57cec5SDimitry Andric}
14380b57cec5SDimitry Andric
14390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
14400b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::~basic_iostream()
14410b57cec5SDimitry Andric{
14420b57cec5SDimitry Andric}
14430b57cec5SDimitry Andric
14440b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
14450b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
14460b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is,
14470b57cec5SDimitry Andric           basic_string<_CharT, _Traits, _Allocator>& __str)
14480b57cec5SDimitry Andric{
14490b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
14500b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
14510b57cec5SDimitry Andric    if (__sen)
14520b57cec5SDimitry Andric    {
14530b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
14540b57cec5SDimitry Andric        try
14550b57cec5SDimitry Andric        {
14560b57cec5SDimitry Andric#endif
14570b57cec5SDimitry Andric            __str.clear();
14580b57cec5SDimitry Andric            streamsize __n = __is.width();
14590b57cec5SDimitry Andric            if (__n <= 0)
14600b57cec5SDimitry Andric                __n = __str.max_size();
14610b57cec5SDimitry Andric            if (__n <= 0)
14620b57cec5SDimitry Andric                __n = numeric_limits<streamsize>::max();
14630b57cec5SDimitry Andric            streamsize __c = 0;
14640b57cec5SDimitry Andric            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
14650b57cec5SDimitry Andric            while (__c < __n)
14660b57cec5SDimitry Andric            {
14670b57cec5SDimitry Andric                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
14680b57cec5SDimitry Andric                if (_Traits::eq_int_type(__i, _Traits::eof()))
14690b57cec5SDimitry Andric                {
14700b57cec5SDimitry Andric                   __state |= ios_base::eofbit;
14710b57cec5SDimitry Andric                   break;
14720b57cec5SDimitry Andric                }
14730b57cec5SDimitry Andric                _CharT __ch = _Traits::to_char_type(__i);
14740b57cec5SDimitry Andric                if (__ct.is(__ct.space, __ch))
14750b57cec5SDimitry Andric                    break;
14760b57cec5SDimitry Andric                __str.push_back(__ch);
14770b57cec5SDimitry Andric                ++__c;
14780b57cec5SDimitry Andric                 __is.rdbuf()->sbumpc();
14790b57cec5SDimitry Andric            }
14800b57cec5SDimitry Andric            __is.width(0);
14810b57cec5SDimitry Andric            if (__c == 0)
14820b57cec5SDimitry Andric               __state |= ios_base::failbit;
14830b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
14840b57cec5SDimitry Andric        }
14850b57cec5SDimitry Andric        catch (...)
14860b57cec5SDimitry Andric        {
14870b57cec5SDimitry Andric            __state |= ios_base::badbit;
14880b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
14890b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
14900b57cec5SDimitry Andric            {
14910b57cec5SDimitry Andric                throw;
14920b57cec5SDimitry Andric            }
14930b57cec5SDimitry Andric        }
14940b57cec5SDimitry Andric#endif
14950b57cec5SDimitry Andric        __is.setstate(__state);
14960b57cec5SDimitry Andric    }
14970b57cec5SDimitry Andric    return __is;
14980b57cec5SDimitry Andric}
14990b57cec5SDimitry Andric
15000b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
15010b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
15020b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is,
15030b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
15040b57cec5SDimitry Andric{
15050b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
15060b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
15070b57cec5SDimitry Andric    if (__sen)
15080b57cec5SDimitry Andric    {
15090b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
15100b57cec5SDimitry Andric        try
15110b57cec5SDimitry Andric        {
15120b57cec5SDimitry Andric#endif
15130b57cec5SDimitry Andric            __str.clear();
15140b57cec5SDimitry Andric            streamsize __extr = 0;
15150b57cec5SDimitry Andric            while (true)
15160b57cec5SDimitry Andric            {
15170b57cec5SDimitry Andric                typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
15180b57cec5SDimitry Andric                if (_Traits::eq_int_type(__i, _Traits::eof()))
15190b57cec5SDimitry Andric                {
15200b57cec5SDimitry Andric                   __state |= ios_base::eofbit;
15210b57cec5SDimitry Andric                   break;
15220b57cec5SDimitry Andric                }
15230b57cec5SDimitry Andric                ++__extr;
15240b57cec5SDimitry Andric                _CharT __ch = _Traits::to_char_type(__i);
15250b57cec5SDimitry Andric                if (_Traits::eq(__ch, __dlm))
15260b57cec5SDimitry Andric                    break;
15270b57cec5SDimitry Andric                __str.push_back(__ch);
15280b57cec5SDimitry Andric                if (__str.size() == __str.max_size())
15290b57cec5SDimitry Andric                {
15300b57cec5SDimitry Andric                    __state |= ios_base::failbit;
15310b57cec5SDimitry Andric                    break;
15320b57cec5SDimitry Andric                }
15330b57cec5SDimitry Andric            }
15340b57cec5SDimitry Andric            if (__extr == 0)
15350b57cec5SDimitry Andric               __state |= ios_base::failbit;
15360b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
15370b57cec5SDimitry Andric        }
15380b57cec5SDimitry Andric        catch (...)
15390b57cec5SDimitry Andric        {
15400b57cec5SDimitry Andric            __state |= ios_base::badbit;
15410b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
15420b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
15430b57cec5SDimitry Andric            {
15440b57cec5SDimitry Andric                throw;
15450b57cec5SDimitry Andric            }
15460b57cec5SDimitry Andric        }
15470b57cec5SDimitry Andric#endif
15480b57cec5SDimitry Andric        __is.setstate(__state);
15490b57cec5SDimitry Andric    }
15500b57cec5SDimitry Andric    return __is;
15510b57cec5SDimitry Andric}
15520b57cec5SDimitry Andric
15530b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
15540b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
15550b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
15560b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is,
15570b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str)
15580b57cec5SDimitry Andric{
15590b57cec5SDimitry Andric    return getline(__is, __str, __is.widen('\n'));
15600b57cec5SDimitry Andric}
15610b57cec5SDimitry Andric
15620b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
15630b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
15640b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
15650b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is,
15660b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
15670b57cec5SDimitry Andric{
15680b57cec5SDimitry Andric    return getline(__is, __str, __dlm);
15690b57cec5SDimitry Andric}
15700b57cec5SDimitry Andric
15710b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
15720b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
15730b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
15740b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is,
15750b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str)
15760b57cec5SDimitry Andric{
15770b57cec5SDimitry Andric    return getline(__is, __str, __is.widen('\n'));
15780b57cec5SDimitry Andric}
15790b57cec5SDimitry Andric
15800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Size>
15810b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
15820b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
15830b57cec5SDimitry Andric{
15840b57cec5SDimitry Andric    ios_base::iostate __state = ios_base::goodbit;
15850b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
15860b57cec5SDimitry Andric    if (__sen)
15870b57cec5SDimitry Andric    {
15880b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
15890b57cec5SDimitry Andric        try
15900b57cec5SDimitry Andric        {
15910b57cec5SDimitry Andric#endif
15920b57cec5SDimitry Andric            basic_string<_CharT, _Traits> __str;
15930b57cec5SDimitry Andric            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
15940b57cec5SDimitry Andric            size_t __c = 0;
15950b57cec5SDimitry Andric            _CharT __zero = __ct.widen('0');
15960b57cec5SDimitry Andric            _CharT __one = __ct.widen('1');
1597*81ad6265SDimitry Andric            while (__c != _Size)
15980b57cec5SDimitry Andric            {
15990b57cec5SDimitry Andric                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
16000b57cec5SDimitry Andric                if (_Traits::eq_int_type(__i, _Traits::eof()))
16010b57cec5SDimitry Andric                {
16020b57cec5SDimitry Andric                   __state |= ios_base::eofbit;
16030b57cec5SDimitry Andric                   break;
16040b57cec5SDimitry Andric                }
16050b57cec5SDimitry Andric                _CharT __ch = _Traits::to_char_type(__i);
16060b57cec5SDimitry Andric                if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
16070b57cec5SDimitry Andric                    break;
16080b57cec5SDimitry Andric                __str.push_back(__ch);
16090b57cec5SDimitry Andric                ++__c;
16100b57cec5SDimitry Andric                 __is.rdbuf()->sbumpc();
16110b57cec5SDimitry Andric            }
16120b57cec5SDimitry Andric            __x = bitset<_Size>(__str);
1613e40139ffSDimitry Andric            if (_Size > 0 && __c == 0)
16140b57cec5SDimitry Andric               __state |= ios_base::failbit;
16150b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
16160b57cec5SDimitry Andric        }
16170b57cec5SDimitry Andric        catch (...)
16180b57cec5SDimitry Andric        {
16190b57cec5SDimitry Andric            __state |= ios_base::badbit;
16200b57cec5SDimitry Andric            __is.__setstate_nothrow(__state);
16210b57cec5SDimitry Andric            if (__is.exceptions() & ios_base::badbit)
16220b57cec5SDimitry Andric            {
16230b57cec5SDimitry Andric                throw;
16240b57cec5SDimitry Andric            }
16250b57cec5SDimitry Andric        }
16260b57cec5SDimitry Andric#endif
16270b57cec5SDimitry Andric        __is.setstate(__state);
16280b57cec5SDimitry Andric    }
16290b57cec5SDimitry Andric    return __is;
16300b57cec5SDimitry Andric}
16310b57cec5SDimitry Andric
1632*81ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>;
1633349cc55cSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1634*81ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>;
1635349cc55cSDimitry Andric#endif
1636*81ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>;
16370b57cec5SDimitry Andric
16380b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
16390b57cec5SDimitry Andric
16400b57cec5SDimitry Andric_LIBCPP_POP_MACROS
16410b57cec5SDimitry Andric
16420b57cec5SDimitry Andric#endif // _LIBCPP_ISTREAM
1643