13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_ISTREAM
113e519524SHoward Hinnant#define _LIBCPP_ISTREAM
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    istream synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
173e519524SHoward Hinnantclass basic_istream
183e519524SHoward Hinnant    : virtual public basic_ios<charT,traits>
193e519524SHoward Hinnant{
203e519524SHoward Hinnantpublic:
213e519524SHoward Hinnant    // types (inherited from basic_ios (27.5.4)):
223e519524SHoward Hinnant    typedef charT                          char_type;
233e519524SHoward Hinnant    typedef traits                         traits_type;
243e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
253e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
263e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
273e519524SHoward Hinnant
283e519524SHoward Hinnant    // 27.7.1.1.1 Constructor/destructor:
293e519524SHoward Hinnant    explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
303e519524SHoward Hinnant    basic_istream(basic_istream&& rhs);
313e519524SHoward Hinnant    virtual ~basic_istream();
323e519524SHoward Hinnant
333e519524SHoward Hinnant    // 27.7.1.1.2 Assign/swap:
343e519524SHoward Hinnant    basic_istream& operator=(basic_istream&& rhs);
353e519524SHoward Hinnant    void swap(basic_istream& rhs);
363e519524SHoward Hinnant
373e519524SHoward Hinnant    // 27.7.1.1.3 Prefix/suffix:
383e519524SHoward Hinnant    class sentry;
393e519524SHoward Hinnant
403e519524SHoward Hinnant    // 27.7.1.2 Formatted input:
413e519524SHoward Hinnant    basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
423e519524SHoward Hinnant    basic_istream& operator>>(basic_ios<char_type, traits_type>&
433e519524SHoward Hinnant                              (*pf)(basic_ios<char_type, traits_type>&));
443e519524SHoward Hinnant    basic_istream& operator>>(ios_base& (*pf)(ios_base&));
453e519524SHoward Hinnant    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
463e519524SHoward Hinnant    basic_istream& operator>>(bool& n);
473e519524SHoward Hinnant    basic_istream& operator>>(short& n);
483e519524SHoward Hinnant    basic_istream& operator>>(unsigned short& n);
493e519524SHoward Hinnant    basic_istream& operator>>(int& n);
503e519524SHoward Hinnant    basic_istream& operator>>(unsigned int& n);
513e519524SHoward Hinnant    basic_istream& operator>>(long& n);
523e519524SHoward Hinnant    basic_istream& operator>>(unsigned long& n);
533e519524SHoward Hinnant    basic_istream& operator>>(long long& n);
543e519524SHoward Hinnant    basic_istream& operator>>(unsigned long long& n);
553e519524SHoward Hinnant    basic_istream& operator>>(float& f);
563e519524SHoward Hinnant    basic_istream& operator>>(double& f);
573e519524SHoward Hinnant    basic_istream& operator>>(long double& f);
583e519524SHoward Hinnant    basic_istream& operator>>(void*& p);
593e519524SHoward Hinnant
603e519524SHoward Hinnant    // 27.7.1.3 Unformatted input:
613e519524SHoward Hinnant    streamsize gcount() const;
623e519524SHoward Hinnant    int_type get();
633e519524SHoward Hinnant    basic_istream& get(char_type& c);
643e519524SHoward Hinnant    basic_istream& get(char_type* s, streamsize n);
653e519524SHoward Hinnant    basic_istream& get(char_type* s, streamsize n, char_type delim);
663e519524SHoward Hinnant    basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
673e519524SHoward Hinnant    basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
683e519524SHoward Hinnant
693e519524SHoward Hinnant    basic_istream& getline(char_type* s, streamsize n);
703e519524SHoward Hinnant    basic_istream& getline(char_type* s, streamsize n, char_type delim);
713e519524SHoward Hinnant
723e519524SHoward Hinnant    basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
733e519524SHoward Hinnant    int_type peek();
743e519524SHoward Hinnant    basic_istream& read (char_type* s, streamsize n);
753e519524SHoward Hinnant    streamsize readsome(char_type* s, streamsize n);
763e519524SHoward Hinnant
773e519524SHoward Hinnant    basic_istream& putback(char_type c);
783e519524SHoward Hinnant    basic_istream& unget();
793e519524SHoward Hinnant    int sync();
803e519524SHoward Hinnant
813e519524SHoward Hinnant    pos_type tellg();
823e519524SHoward Hinnant    basic_istream& seekg(pos_type);
833e519524SHoward Hinnant    basic_istream& seekg(off_type, ios_base::seekdir);
84f45b237cSMarshall Clowprotected:
85f45b237cSMarshall Clow    basic_istream(const basic_istream& rhs) = delete;
86f45b237cSMarshall Clow    basic_istream(basic_istream&& rhs);
87f45b237cSMarshall Clow    // 27.7.2.1.2 Assign/swap:
88f45b237cSMarshall Clow    basic_istream& operator=(const basic_istream& rhs) = delete;
89f45b237cSMarshall Clow    basic_istream& operator=(basic_istream&& rhs);
90f45b237cSMarshall Clow    void swap(basic_istream& rhs);
913e519524SHoward Hinnant};
923e519524SHoward Hinnant
933e519524SHoward Hinnant// 27.7.1.2.3 character extraction templates:
943e519524SHoward Hinnanttemplate<class charT, class traits>
953e519524SHoward Hinnant  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
963e519524SHoward Hinnant
973e519524SHoward Hinnanttemplate<class traits>
983e519524SHoward Hinnant  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
993e519524SHoward Hinnant
1003e519524SHoward Hinnanttemplate<class traits>
1013e519524SHoward Hinnant  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
1023e519524SHoward Hinnant
1033e519524SHoward Hinnanttemplate<class charT, class traits>
1043e519524SHoward Hinnant  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
1053e519524SHoward Hinnant
1063e519524SHoward Hinnanttemplate<class traits>
1073e519524SHoward Hinnant  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
1083e519524SHoward Hinnant
1093e519524SHoward Hinnanttemplate<class traits>
1103e519524SHoward Hinnant  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
1113e519524SHoward Hinnant
1123e519524SHoward Hinnanttemplate <class charT, class traits>
1133e519524SHoward Hinnant  void
1143e519524SHoward Hinnant  swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
1153e519524SHoward Hinnant
1163e519524SHoward Hinnanttypedef basic_istream<char> istream;
1173e519524SHoward Hinnanttypedef basic_istream<wchar_t> wistream;
1183e519524SHoward Hinnant
1193e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
1203e519524SHoward Hinnantclass basic_iostream :
1213e519524SHoward Hinnant    public basic_istream<charT,traits>,
1223e519524SHoward Hinnant    public basic_ostream<charT,traits>
1233e519524SHoward Hinnant{
1243e519524SHoward Hinnantpublic:
1253e519524SHoward Hinnant    // types:
1263e519524SHoward Hinnant    typedef charT                          char_type;
1273e519524SHoward Hinnant    typedef traits                         traits_type;
1283e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1293e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1303e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1313e519524SHoward Hinnant
1323e519524SHoward Hinnant    // constructor/destructor
1333e519524SHoward Hinnant    explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
1343e519524SHoward Hinnant    basic_iostream(basic_iostream&& rhs);
1353e519524SHoward Hinnant    virtual ~basic_iostream();
1363e519524SHoward Hinnant
1373e519524SHoward Hinnant    // assign/swap
1383e519524SHoward Hinnant    basic_iostream& operator=(basic_iostream&& rhs);
1393e519524SHoward Hinnant    void swap(basic_iostream& rhs);
1403e519524SHoward Hinnant};
1413e519524SHoward Hinnant
1423e519524SHoward Hinnanttemplate <class charT, class traits>
1433e519524SHoward Hinnant  void
1443e519524SHoward Hinnant  swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
1453e519524SHoward Hinnant
1463e519524SHoward Hinnanttypedef basic_iostream<char> iostream;
1473e519524SHoward Hinnanttypedef basic_iostream<wchar_t> wiostream;
1483e519524SHoward Hinnant
1493e519524SHoward Hinnanttemplate <class charT, class traits>
1503e519524SHoward Hinnant  basic_istream<charT,traits>&
1513e519524SHoward Hinnant  ws(basic_istream<charT,traits>& is);
1523e519524SHoward Hinnant
153c90dee1eSLouis Dionne// rvalue stream extraction
154c90dee1eSLouis Dionnetemplate <class Stream, class T>
155c90dee1eSLouis Dionne  Stream&& operator>>(Stream&& is, T&& x);
1563e519524SHoward Hinnant
1573e519524SHoward Hinnant}  // std
1583e519524SHoward Hinnant
1593e519524SHoward Hinnant*/
1603e519524SHoward Hinnant
161385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1623e519524SHoward Hinnant#include <__config>
163*3cd4531bSNikolas Klauser#include <__iterator/istreambuf_iterator.h>
1646adbc83eSChristopher Di Bella#include <__utility/forward.h>
1653e519524SHoward Hinnant#include <ostream>
166bfbd73f8SArthur O'Dwyer#include <version>
1673e519524SHoward Hinnant
168073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1693e519524SHoward Hinnant#  pragma GCC system_header
170073458b1SHoward Hinnant#endif
1713e519524SHoward Hinnant
172a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
173a016efb1SEric Fiselier#include <__undef_macros>
174a016efb1SEric Fiselier
175a016efb1SEric Fiselier
1763e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1773e519524SHoward Hinnant
1783e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
179e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_istream
1803e519524SHoward Hinnant    : virtual public basic_ios<_CharT, _Traits>
1813e519524SHoward Hinnant{
1823e519524SHoward Hinnant    streamsize __gc_;
1833e519524SHoward Hinnantpublic:
1843e519524SHoward Hinnant    // types (inherited from basic_ios (27.5.4)):
1853e519524SHoward Hinnant    typedef _CharT                         char_type;
1863e519524SHoward Hinnant    typedef _Traits                        traits_type;
1873e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1883e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1893e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1903e519524SHoward Hinnant
1913e519524SHoward Hinnant    // 27.7.1.1.1 Constructor/destructor:
1927833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
193f8f31c49SEric Fiselier    explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
194f8f31c49SEric Fiselier    { this->init(__sb); }
1953e519524SHoward Hinnant    virtual ~basic_istream();
1963e519524SHoward Hinnantprotected:
197f8f31c49SEric Fiselier    inline _LIBCPP_INLINE_VISIBILITY
1983e519524SHoward Hinnant    basic_istream(basic_istream&& __rhs);
199f0aca21eSEric Fiselier
2003e519524SHoward Hinnant    // 27.7.1.1.2 Assign/swap:
201f8f31c49SEric Fiselier    inline _LIBCPP_INLINE_VISIBILITY
2023e519524SHoward Hinnant    basic_istream& operator=(basic_istream&& __rhs);
203f8f31c49SEric Fiselier
2047833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
205f8f31c49SEric Fiselier    void swap(basic_istream& __rhs) {
206f8f31c49SEric Fiselier      _VSTD::swap(__gc_, __rhs.__gc_);
207f8f31c49SEric Fiselier      basic_ios<char_type, traits_type>::swap(__rhs);
208f8f31c49SEric Fiselier    }
209f45b237cSMarshall Clow
21030d0c1abSMarshall Clow    basic_istream           (const basic_istream& __rhs) = delete;
21130d0c1abSMarshall Clow    basic_istream& operator=(const basic_istream& __rhs) = delete;
2123e519524SHoward Hinnantpublic:
2133e519524SHoward Hinnant
2143e519524SHoward Hinnant    // 27.7.1.1.3 Prefix/suffix:
215e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS sentry;
2163e519524SHoward Hinnant
2173e519524SHoward Hinnant    // 27.7.1.2 Formatted input:
2187833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
219f8f31c49SEric Fiselier    basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
220f8f31c49SEric Fiselier    { return __pf(*this); }
221f8f31c49SEric Fiselier
2227833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2233e519524SHoward Hinnant    basic_istream& operator>>(basic_ios<char_type, traits_type>&
224f8f31c49SEric Fiselier                              (*__pf)(basic_ios<char_type, traits_type>&))
225f8f31c49SEric Fiselier    { __pf(*this); return *this; }
226f8f31c49SEric Fiselier
2277833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
228f8f31c49SEric Fiselier    basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
229f8f31c49SEric Fiselier    { __pf(*this); return *this; }
230f8f31c49SEric Fiselier
2313e519524SHoward Hinnant    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
2323e519524SHoward Hinnant    basic_istream& operator>>(bool& __n);
2333e519524SHoward Hinnant    basic_istream& operator>>(short& __n);
2343e519524SHoward Hinnant    basic_istream& operator>>(unsigned short& __n);
2353e519524SHoward Hinnant    basic_istream& operator>>(int& __n);
2363e519524SHoward Hinnant    basic_istream& operator>>(unsigned int& __n);
2373e519524SHoward Hinnant    basic_istream& operator>>(long& __n);
2383e519524SHoward Hinnant    basic_istream& operator>>(unsigned long& __n);
2393e519524SHoward Hinnant    basic_istream& operator>>(long long& __n);
2403e519524SHoward Hinnant    basic_istream& operator>>(unsigned long long& __n);
2413e519524SHoward Hinnant    basic_istream& operator>>(float& __f);
2423e519524SHoward Hinnant    basic_istream& operator>>(double& __f);
2433e519524SHoward Hinnant    basic_istream& operator>>(long double& __f);
2443e519524SHoward Hinnant    basic_istream& operator>>(void*& __p);
2453e519524SHoward Hinnant
2463e519524SHoward Hinnant    // 27.7.1.3 Unformatted input:
2473030b2f1SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2483e519524SHoward Hinnant    streamsize gcount() const {return __gc_;}
2493e519524SHoward Hinnant    int_type get();
250f8f31c49SEric Fiselier
2517833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
252f8f31c49SEric Fiselier    basic_istream& get(char_type& __c) {
253f8f31c49SEric Fiselier      int_type __ch = get();
254f8f31c49SEric Fiselier      if (__ch != traits_type::eof())
255f8f31c49SEric Fiselier        __c = traits_type::to_char_type(__ch);
256f8f31c49SEric Fiselier      return *this;
257f8f31c49SEric Fiselier    }
258f8f31c49SEric Fiselier
2597833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
260f8f31c49SEric Fiselier    basic_istream& get(char_type* __s, streamsize __n)
261f8f31c49SEric Fiselier    { return get(__s, __n, this->widen('\n')); }
262f8f31c49SEric Fiselier
2633e519524SHoward Hinnant    basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
264f8f31c49SEric Fiselier
2657833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
266f8f31c49SEric Fiselier    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
267f8f31c49SEric Fiselier    { return get(__sb, this->widen('\n')); }
268f8f31c49SEric Fiselier
2693e519524SHoward Hinnant    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
2703e519524SHoward Hinnant
2717833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
272f8f31c49SEric Fiselier    basic_istream& getline(char_type* __s, streamsize __n)
273f8f31c49SEric Fiselier    { return getline(__s, __n, this->widen('\n')); }
274f8f31c49SEric Fiselier
2753e519524SHoward Hinnant    basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
2763e519524SHoward Hinnant
2773e519524SHoward Hinnant    basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
2783e519524SHoward Hinnant    int_type peek();
2793e519524SHoward Hinnant    basic_istream& read (char_type* __s, streamsize __n);
2803e519524SHoward Hinnant    streamsize readsome(char_type* __s, streamsize __n);
2813e519524SHoward Hinnant
2823e519524SHoward Hinnant    basic_istream& putback(char_type __c);
2833e519524SHoward Hinnant    basic_istream& unget();
2843e519524SHoward Hinnant    int sync();
2853e519524SHoward Hinnant
2863e519524SHoward Hinnant    pos_type tellg();
2873e519524SHoward Hinnant    basic_istream& seekg(pos_type __pos);
2883e519524SHoward Hinnant    basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
2893e519524SHoward Hinnant};
2903e519524SHoward Hinnant
2913e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
292e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
2933e519524SHoward Hinnant{
2943e519524SHoward Hinnant    bool __ok_;
2953e519524SHoward Hinnant
2963e519524SHoward Hinnantpublic:
2973e519524SHoward Hinnant    explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
2983e519524SHoward Hinnant//    ~sentry() = default;
2993e519524SHoward Hinnant
3003030b2f1SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
301317e92a3SArthur O'Dwyer    explicit operator bool() const {return __ok_;}
302feb80aa9SNikolas Klauser
303feb80aa9SNikolas Klauser    sentry(const sentry&) = delete;
304feb80aa9SNikolas Klauser    sentry& operator=(const sentry&) = delete;
3053e519524SHoward Hinnant};
3063e519524SHoward Hinnant
3073e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3083e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
3093e519524SHoward Hinnant                                               bool __noskipws)
3103e519524SHoward Hinnant    : __ok_(false)
3113e519524SHoward Hinnant{
3123e519524SHoward Hinnant    if (__is.good())
3133e519524SHoward Hinnant    {
3143e519524SHoward Hinnant        if (__is.tie())
3153e519524SHoward Hinnant            __is.tie()->flush();
3163e519524SHoward Hinnant        if (!__noskipws && (__is.flags() & ios_base::skipws))
3173e519524SHoward Hinnant        {
318c003db1fSHoward Hinnant            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3193e519524SHoward Hinnant            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
320c003db1fSHoward Hinnant            _Ip __i(__is);
321c003db1fSHoward Hinnant            _Ip __eof;
3223e519524SHoward Hinnant            for (; __i != __eof; ++__i)
3233e519524SHoward Hinnant                if (!__ct.is(__ct.space, *__i))
3243e519524SHoward Hinnant                    break;
3253e519524SHoward Hinnant            if (__i == __eof)
3263e519524SHoward Hinnant                __is.setstate(ios_base::failbit | ios_base::eofbit);
3273e519524SHoward Hinnant        }
3283e519524SHoward Hinnant        __ok_ = __is.good();
3293e519524SHoward Hinnant    }
3303e519524SHoward Hinnant    else
3313e519524SHoward Hinnant        __is.setstate(ios_base::failbit);
3323e519524SHoward Hinnant}
3333e519524SHoward Hinnant
3343e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3353e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
3363e519524SHoward Hinnant    : __gc_(__rhs.__gc_)
3373e519524SHoward Hinnant{
3383e519524SHoward Hinnant    __rhs.__gc_ = 0;
3393e519524SHoward Hinnant    this->move(__rhs);
3403e519524SHoward Hinnant}
3413e519524SHoward Hinnant
3423e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3433e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
3443e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
3453e519524SHoward Hinnant{
3463e519524SHoward Hinnant    swap(__rhs);
3473e519524SHoward Hinnant    return *this;
3483e519524SHoward Hinnant}
3493e519524SHoward Hinnant
3503e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3513e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::~basic_istream()
3523e519524SHoward Hinnant{
3533e519524SHoward Hinnant}
3543e519524SHoward Hinnant
3558b6a5bf9SLouis Dionnetemplate <class _Tp, class _CharT, class _Traits>
3568b6a5bf9SLouis Dionne_LIBCPP_INLINE_VISIBILITY
3573e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
3588b6a5bf9SLouis Dionne__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
359396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
360396145d0SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
361396145d0SLouis Dionne    if (__s)
362396145d0SLouis Dionne    {
3633e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3643e519524SHoward Hinnant        try
3653e519524SHoward Hinnant        {
366b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
3678b6a5bf9SLouis Dionne            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3688b6a5bf9SLouis Dionne            typedef num_get<_CharT, _Ip> _Fp;
369396145d0SLouis Dionne            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
3703e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3713e519524SHoward Hinnant        }
3723e519524SHoward Hinnant        catch (...)
3733e519524SHoward Hinnant        {
374396145d0SLouis Dionne            __state |= ios_base::badbit;
375396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
376396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
377396145d0SLouis Dionne            {
378396145d0SLouis Dionne                throw;
3793e519524SHoward Hinnant            }
380396145d0SLouis Dionne        }
381396145d0SLouis Dionne#endif
382396145d0SLouis Dionne        __is.setstate(__state);
383396145d0SLouis Dionne    }
3848b6a5bf9SLouis Dionne    return __is;
3858b6a5bf9SLouis Dionne}
3868b6a5bf9SLouis Dionne
3878b6a5bf9SLouis Dionnetemplate <class _CharT, class _Traits>
3888b6a5bf9SLouis Dionnebasic_istream<_CharT, _Traits>&
3898b6a5bf9SLouis Dionnebasic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
3908b6a5bf9SLouis Dionne{
3918b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
3923e519524SHoward Hinnant}
3933e519524SHoward Hinnant
3943e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3953e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
3963e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
3973e519524SHoward Hinnant{
3988b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
3993e519524SHoward Hinnant}
4003e519524SHoward Hinnant
4013e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4023e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4033e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(long& __n)
4043e519524SHoward Hinnant{
4058b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<long>(*this, __n);
4063e519524SHoward Hinnant}
4073e519524SHoward Hinnant
4083e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4093e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4103e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
4113e519524SHoward Hinnant{
4128b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
4133e519524SHoward Hinnant}
4143e519524SHoward Hinnant
4153e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4163e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4173e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(long long& __n)
4183e519524SHoward Hinnant{
4198b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<long long>(*this, __n);
4203e519524SHoward Hinnant}
4213e519524SHoward Hinnant
4223e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4233e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4243e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
4253e519524SHoward Hinnant{
4268b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
4273e519524SHoward Hinnant}
4283e519524SHoward Hinnant
4293e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4303e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4313e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(float& __n)
4323e519524SHoward Hinnant{
4338b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<float>(*this, __n);
4343e519524SHoward Hinnant}
4353e519524SHoward Hinnant
4363e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4373e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4383e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(double& __n)
4393e519524SHoward Hinnant{
4408b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<double>(*this, __n);
4413e519524SHoward Hinnant}
4423e519524SHoward Hinnant
4433e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4443e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4453e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(long double& __n)
4463e519524SHoward Hinnant{
4478b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<long double>(*this, __n);
4483e519524SHoward Hinnant}
4493e519524SHoward Hinnant
4503e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4513e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4523e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(bool& __n)
4533e519524SHoward Hinnant{
4548b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<bool>(*this, __n);
4553e519524SHoward Hinnant}
4563e519524SHoward Hinnant
4573e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4583e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
4593e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(void*& __n)
4603e519524SHoward Hinnant{
4618b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic<void*>(*this, __n);
4628b6a5bf9SLouis Dionne}
4638b6a5bf9SLouis Dionne
4648b6a5bf9SLouis Dionnetemplate <class _Tp, class _CharT, class _Traits>
4658b6a5bf9SLouis Dionne_LIBCPP_INLINE_VISIBILITY
4668b6a5bf9SLouis Dionnebasic_istream<_CharT, _Traits>&
4678b6a5bf9SLouis Dionne__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
468396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
469396145d0SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
470396145d0SLouis Dionne    if (__s)
471396145d0SLouis Dionne    {
4723e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4733e519524SHoward Hinnant        try
4743e519524SHoward Hinnant        {
475b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4768b6a5bf9SLouis Dionne            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
4778b6a5bf9SLouis Dionne            typedef num_get<_CharT, _Ip> _Fp;
4788b6a5bf9SLouis Dionne            long __temp;
479396145d0SLouis Dionne            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
4808b6a5bf9SLouis Dionne            if (__temp < numeric_limits<_Tp>::min())
4818b6a5bf9SLouis Dionne            {
482396145d0SLouis Dionne                __state |= ios_base::failbit;
4838b6a5bf9SLouis Dionne                __n = numeric_limits<_Tp>::min();
4848b6a5bf9SLouis Dionne            }
4858b6a5bf9SLouis Dionne            else if (__temp > numeric_limits<_Tp>::max())
4868b6a5bf9SLouis Dionne            {
487396145d0SLouis Dionne                __state |= ios_base::failbit;
4888b6a5bf9SLouis Dionne                __n = numeric_limits<_Tp>::max();
4898b6a5bf9SLouis Dionne            }
4908b6a5bf9SLouis Dionne            else
491396145d0SLouis Dionne            {
4928b6a5bf9SLouis Dionne                __n = static_cast<_Tp>(__temp);
4933e519524SHoward Hinnant            }
4943e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4953e519524SHoward Hinnant        }
4963e519524SHoward Hinnant        catch (...)
4973e519524SHoward Hinnant        {
498396145d0SLouis Dionne            __state |= ios_base::badbit;
499396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
500396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
501396145d0SLouis Dionne            {
502396145d0SLouis Dionne                throw;
503396145d0SLouis Dionne            }
5043e519524SHoward Hinnant        }
505b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
506396145d0SLouis Dionne        __is.setstate(__state);
507396145d0SLouis Dionne    }
5088b6a5bf9SLouis Dionne    return __is;
5093e519524SHoward Hinnant}
5103e519524SHoward Hinnant
5113e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5123e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
5133e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(short& __n)
5143e519524SHoward Hinnant{
5158b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
5163e519524SHoward Hinnant}
5173e519524SHoward Hinnant
5183e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5193e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
5203e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(int& __n)
5213e519524SHoward Hinnant{
5228b6a5bf9SLouis Dionne    return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
5233e519524SHoward Hinnant}
5243e519524SHoward Hinnant
5253e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
526147b25b4SZhihao Yuan_LIBCPP_INLINE_VISIBILITY
5273e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
528147b25b4SZhihao Yuan__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
5293e519524SHoward Hinnant{
530396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
53138b7e748SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
53238b7e748SLouis Dionne    if (__sen)
53338b7e748SLouis Dionne    {
534396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS
535396145d0SLouis Dionne        try
536396145d0SLouis Dionne        {
537396145d0SLouis Dionne#endif
5386cd81263SLouis Dionne            _CharT* __s = __p;
5393e519524SHoward Hinnant            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
540147b25b4SZhihao Yuan            while (__s != __p + (__n-1))
5413e519524SHoward Hinnant            {
54200d8c245SHoward Hinnant                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
54300d8c245SHoward Hinnant                if (_Traits::eq_int_type(__i, _Traits::eof()))
54400d8c245SHoward Hinnant                {
545396145d0SLouis Dionne                   __state |= ios_base::eofbit;
54600d8c245SHoward Hinnant                   break;
54700d8c245SHoward Hinnant                }
54800d8c245SHoward Hinnant                _CharT __ch = _Traits::to_char_type(__i);
5493e519524SHoward Hinnant                if (__ct.is(__ct.space, __ch))
5503e519524SHoward Hinnant                    break;
55100d8c245SHoward Hinnant                *__s++ = __ch;
55200d8c245SHoward Hinnant                 __is.rdbuf()->sbumpc();
5533e519524SHoward Hinnant            }
5543e519524SHoward Hinnant            *__s = _CharT();
5553e519524SHoward Hinnant            __is.width(0);
556147b25b4SZhihao Yuan            if (__s == __p)
557396145d0SLouis Dionne               __state |= ios_base::failbit;
5583e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5593e519524SHoward Hinnant        }
5603e519524SHoward Hinnant        catch (...)
5613e519524SHoward Hinnant        {
562396145d0SLouis Dionne            __state |= ios_base::badbit;
563396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
564396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
565396145d0SLouis Dionne            {
566396145d0SLouis Dionne                throw;
5673e519524SHoward Hinnant            }
568396145d0SLouis Dionne        }
569396145d0SLouis Dionne#endif
570396145d0SLouis Dionne        __is.setstate(__state);
571396145d0SLouis Dionne    }
5723e519524SHoward Hinnant    return __is;
5733e519524SHoward Hinnant}
5743e519524SHoward Hinnant
575147b25b4SZhihao Yuan#if _LIBCPP_STD_VER > 17
576147b25b4SZhihao Yuan
577147b25b4SZhihao Yuantemplate<class _CharT, class _Traits, size_t _Np>
578147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY
579147b25b4SZhihao Yuanbasic_istream<_CharT, _Traits>&
580147b25b4SZhihao Yuanoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
581147b25b4SZhihao Yuan{
5826cd81263SLouis Dionne    size_t __n = _Np;
583147b25b4SZhihao Yuan    if (__is.width() > 0)
584147b25b4SZhihao Yuan        __n = _VSTD::min(size_t(__is.width()), _Np);
585147b25b4SZhihao Yuan    return _VSTD::__input_c_string(__is, __buf, __n);
586147b25b4SZhihao Yuan}
587147b25b4SZhihao Yuan
588147b25b4SZhihao Yuantemplate<class _Traits, size_t _Np>
589147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY
590147b25b4SZhihao Yuanbasic_istream<char, _Traits>&
591147b25b4SZhihao Yuanoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
592147b25b4SZhihao Yuan{
593147b25b4SZhihao Yuan    return __is >> (char(&)[_Np])__buf;
594147b25b4SZhihao Yuan}
595147b25b4SZhihao Yuan
596147b25b4SZhihao Yuantemplate<class _Traits, size_t _Np>
597147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY
598147b25b4SZhihao Yuanbasic_istream<char, _Traits>&
599147b25b4SZhihao Yuanoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
600147b25b4SZhihao Yuan{
601147b25b4SZhihao Yuan    return __is >> (char(&)[_Np])__buf;
602147b25b4SZhihao Yuan}
603147b25b4SZhihao Yuan
604147b25b4SZhihao Yuan#else
605147b25b4SZhihao Yuan
606147b25b4SZhihao Yuantemplate<class _CharT, class _Traits>
607147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY
608147b25b4SZhihao Yuanbasic_istream<_CharT, _Traits>&
609147b25b4SZhihao Yuanoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
610147b25b4SZhihao Yuan{
611147b25b4SZhihao Yuan    streamsize __n = __is.width();
612147b25b4SZhihao Yuan    if (__n <= 0)
613147b25b4SZhihao Yuan        __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
614147b25b4SZhihao Yuan    return _VSTD::__input_c_string(__is, __s, size_t(__n));
615147b25b4SZhihao Yuan}
616147b25b4SZhihao Yuan
6173e519524SHoward Hinnanttemplate<class _Traits>
618c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
6193e519524SHoward Hinnantbasic_istream<char, _Traits>&
6203e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
6213e519524SHoward Hinnant{
6223e519524SHoward Hinnant    return __is >> (char*)__s;
6233e519524SHoward Hinnant}
6243e519524SHoward Hinnant
6253e519524SHoward Hinnanttemplate<class _Traits>
626c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
6273e519524SHoward Hinnantbasic_istream<char, _Traits>&
6283e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, signed char* __s)
6293e519524SHoward Hinnant{
6303e519524SHoward Hinnant    return __is >> (char*)__s;
6313e519524SHoward Hinnant}
6323e519524SHoward Hinnant
633147b25b4SZhihao Yuan#endif // _LIBCPP_STD_VER > 17
634147b25b4SZhihao Yuan
6353e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
6363e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
6373e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
6383e519524SHoward Hinnant{
639396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
64038b7e748SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
64138b7e748SLouis Dionne    if (__sen)
64238b7e748SLouis Dionne    {
643396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS
644396145d0SLouis Dionne        try
645396145d0SLouis Dionne        {
646396145d0SLouis Dionne#endif
64773736effSHoward Hinnant            typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
64873736effSHoward Hinnant            if (_Traits::eq_int_type(__i, _Traits::eof()))
649396145d0SLouis Dionne                __state |= ios_base::eofbit | ios_base::failbit;
65073736effSHoward Hinnant            else
65173736effSHoward Hinnant                __c = _Traits::to_char_type(__i);
6523e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6533e519524SHoward Hinnant        }
6543e519524SHoward Hinnant        catch (...)
6553e519524SHoward Hinnant        {
656396145d0SLouis Dionne            __state |= ios_base::badbit;
657396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
658396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
659396145d0SLouis Dionne            {
660396145d0SLouis Dionne                throw;
6613e519524SHoward Hinnant            }
662396145d0SLouis Dionne        }
663396145d0SLouis Dionne#endif
664396145d0SLouis Dionne        __is.setstate(__state);
665396145d0SLouis Dionne    }
6663e519524SHoward Hinnant    return __is;
6673e519524SHoward Hinnant}
6683e519524SHoward Hinnant
6693e519524SHoward Hinnanttemplate<class _Traits>
670c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
6713e519524SHoward Hinnantbasic_istream<char, _Traits>&
6723e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
6733e519524SHoward Hinnant{
6743e519524SHoward Hinnant    return __is >> (char&)__c;
6753e519524SHoward Hinnant}
6763e519524SHoward Hinnant
6773e519524SHoward Hinnanttemplate<class _Traits>
678c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
6793e519524SHoward Hinnantbasic_istream<char, _Traits>&
6803e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, signed char& __c)
6813e519524SHoward Hinnant{
6823e519524SHoward Hinnant    return __is >> (char&)__c;
6833e519524SHoward Hinnant}
6843e519524SHoward Hinnant
6853e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
6863e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
6873e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
6883e519524SHoward Hinnant{
689396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
6903e519524SHoward Hinnant    __gc_ = 0;
6913e519524SHoward Hinnant    sentry __s(*this, true);
6923e519524SHoward Hinnant    if (__s)
6933e519524SHoward Hinnant    {
6943e519524SHoward Hinnant        if (__sb)
6953e519524SHoward Hinnant        {
6963e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6973e519524SHoward Hinnant            try
6983e519524SHoward Hinnant            {
699b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
70000d8c245SHoward Hinnant                while (true)
7013e519524SHoward Hinnant                {
70200d8c245SHoward Hinnant                    typename traits_type::int_type __i = this->rdbuf()->sgetc();
70300d8c245SHoward Hinnant                    if (traits_type::eq_int_type(__i, _Traits::eof()))
70400d8c245SHoward Hinnant                    {
705396145d0SLouis Dionne                       __state |= ios_base::eofbit;
7063e519524SHoward Hinnant                       break;
7073e519524SHoward Hinnant                    }
70800d8c245SHoward Hinnant                    if (traits_type::eq_int_type(
70900d8c245SHoward Hinnant                            __sb->sputc(traits_type::to_char_type(__i)),
71000d8c245SHoward Hinnant                            traits_type::eof()))
71100d8c245SHoward Hinnant                        break;
71200d8c245SHoward Hinnant                    ++__gc_;
71300d8c245SHoward Hinnant                    this->rdbuf()->sbumpc();
71400d8c245SHoward Hinnant                }
71500d8c245SHoward Hinnant                if (__gc_ == 0)
716396145d0SLouis Dionne                   __state |= ios_base::failbit;
7173e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7183e519524SHoward Hinnant            }
7193e519524SHoward Hinnant            catch (...)
7203e519524SHoward Hinnant            {
721396145d0SLouis Dionne                __state |= ios_base::badbit;
72200d8c245SHoward Hinnant                if (__gc_ == 0)
723396145d0SLouis Dionne                    __state |= ios_base::failbit;
724396145d0SLouis Dionne
725396145d0SLouis Dionne                this->__setstate_nothrow(__state);
726396145d0SLouis Dionne                if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit)
727396145d0SLouis Dionne                {
728396145d0SLouis Dionne                    throw;
729396145d0SLouis Dionne                }
7303e519524SHoward Hinnant            }
731b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7323e519524SHoward Hinnant        }
7333e519524SHoward Hinnant        else
7343e519524SHoward Hinnant        {
735396145d0SLouis Dionne            __state |= ios_base::failbit;
7363e519524SHoward Hinnant        }
737396145d0SLouis Dionne        this->setstate(__state);
738396145d0SLouis Dionne    }
7393e519524SHoward Hinnant    return *this;
7403e519524SHoward Hinnant}
7413e519524SHoward Hinnant
7423e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
7433e519524SHoward Hinnanttypename basic_istream<_CharT, _Traits>::int_type
7443e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::get()
7453e519524SHoward Hinnant{
746396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
7473e519524SHoward Hinnant    __gc_ = 0;
7483e519524SHoward Hinnant    int_type __r = traits_type::eof();
74938b7e748SLouis Dionne    sentry __s(*this, true);
75038b7e748SLouis Dionne    if (__s)
75138b7e748SLouis Dionne    {
752396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS
753396145d0SLouis Dionne        try
754396145d0SLouis Dionne        {
755396145d0SLouis Dionne#endif
75600d8c245SHoward Hinnant            __r = this->rdbuf()->sbumpc();
75700d8c245SHoward Hinnant            if (traits_type::eq_int_type(__r, traits_type::eof()))
758396145d0SLouis Dionne               __state |= ios_base::failbit | ios_base::eofbit;
7593e519524SHoward Hinnant            else
76000d8c245SHoward Hinnant                __gc_ = 1;
7613e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7623e519524SHoward Hinnant        }
7633e519524SHoward Hinnant        catch (...)
7643e519524SHoward Hinnant        {
765396145d0SLouis Dionne            this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
766396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
767396145d0SLouis Dionne            {
768396145d0SLouis Dionne                throw;
7693e519524SHoward Hinnant            }
770396145d0SLouis Dionne        }
771396145d0SLouis Dionne#endif
772396145d0SLouis Dionne        this->setstate(__state);
773396145d0SLouis Dionne    }
7743e519524SHoward Hinnant    return __r;
7753e519524SHoward Hinnant}
7763e519524SHoward Hinnant
7773e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
7783e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
7793e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
7803e519524SHoward Hinnant{
781396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
7823e519524SHoward Hinnant    __gc_ = 0;
7833e519524SHoward Hinnant    sentry __sen(*this, true);
7843e519524SHoward Hinnant    if (__sen)
7853e519524SHoward Hinnant    {
7863e519524SHoward Hinnant        if (__n > 0)
7873e519524SHoward Hinnant        {
788396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS
789396145d0SLouis Dionne            try
790396145d0SLouis Dionne            {
791396145d0SLouis Dionne#endif
79200d8c245SHoward Hinnant                while (__gc_ < __n-1)
7933e519524SHoward Hinnant                {
79400d8c245SHoward Hinnant                    int_type __i = this->rdbuf()->sgetc();
79500d8c245SHoward Hinnant                    if (traits_type::eq_int_type(__i, traits_type::eof()))
79600d8c245SHoward Hinnant                    {
797396145d0SLouis Dionne                       __state |= ios_base::eofbit;
79800d8c245SHoward Hinnant                       break;
79900d8c245SHoward Hinnant                    }
80000d8c245SHoward Hinnant                    char_type __ch = traits_type::to_char_type(__i);
8013e519524SHoward Hinnant                    if (traits_type::eq(__ch, __dlm))
8023e519524SHoward Hinnant                        break;
80300d8c245SHoward Hinnant                    *__s++ = __ch;
80400d8c245SHoward Hinnant                    ++__gc_;
80500d8c245SHoward Hinnant                     this->rdbuf()->sbumpc();
8063e519524SHoward Hinnant                }
80700d8c245SHoward Hinnant                if (__gc_ == 0)
808396145d0SLouis Dionne                   __state |= ios_base::failbit;
8093e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8103e519524SHoward Hinnant            }
8113e519524SHoward Hinnant            catch (...)
8123e519524SHoward Hinnant            {
813396145d0SLouis Dionne                __state |= ios_base::badbit;
814396145d0SLouis Dionne                this->__setstate_nothrow(__state);
815396145d0SLouis Dionne                if (this->exceptions() & ios_base::badbit)
816396145d0SLouis Dionne                {
817a051024cSVolodymyr Sapsai                    if (__n > 0)
818a051024cSVolodymyr Sapsai                        *__s = char_type();
819396145d0SLouis Dionne                    throw;
8203e519524SHoward Hinnant                }
821396145d0SLouis Dionne            }
822396145d0SLouis Dionne#endif
823396145d0SLouis Dionne        }
824396145d0SLouis Dionne        else
825396145d0SLouis Dionne        {
826396145d0SLouis Dionne            __state |= ios_base::failbit;
827396145d0SLouis Dionne        }
828396145d0SLouis Dionne
829396145d0SLouis Dionne        if (__n > 0)
830396145d0SLouis Dionne            *__s = char_type();
831396145d0SLouis Dionne        this->setstate(__state);
832396145d0SLouis Dionne    }
833396145d0SLouis Dionne    if (__n > 0)
834396145d0SLouis Dionne        *__s = char_type();
8353e519524SHoward Hinnant    return *this;
8363e519524SHoward Hinnant}
8373e519524SHoward Hinnant
8383e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
8393e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
8403e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
8413e519524SHoward Hinnant                                    char_type __dlm)
8423e519524SHoward Hinnant{
843396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
8443e519524SHoward Hinnant    __gc_ = 0;
8453e519524SHoward Hinnant    sentry __sen(*this, true);
8463e519524SHoward Hinnant    if (__sen)
8473e519524SHoward Hinnant    {
8483e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8493e519524SHoward Hinnant        try
8503e519524SHoward Hinnant        {
851b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
85200d8c245SHoward Hinnant            while (true)
8533e519524SHoward Hinnant            {
85400d8c245SHoward Hinnant                typename traits_type::int_type __i = this->rdbuf()->sgetc();
85500d8c245SHoward Hinnant                if (traits_type::eq_int_type(__i, traits_type::eof()))
85600d8c245SHoward Hinnant                {
857396145d0SLouis Dionne                   __state |= ios_base::eofbit;
8583e519524SHoward Hinnant                   break;
8593e519524SHoward Hinnant                }
86000d8c245SHoward Hinnant                char_type __ch = traits_type::to_char_type(__i);
86100d8c245SHoward Hinnant                if (traits_type::eq(__ch, __dlm))
86200d8c245SHoward Hinnant                    break;
86300d8c245SHoward Hinnant                if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
86400d8c245SHoward Hinnant                    break;
86500d8c245SHoward Hinnant                ++__gc_;
86600d8c245SHoward Hinnant                this->rdbuf()->sbumpc();
86700d8c245SHoward Hinnant            }
8683e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8693e519524SHoward Hinnant        }
8703e519524SHoward Hinnant        catch (...)
8713e519524SHoward Hinnant        {
872396145d0SLouis Dionne            __state |= ios_base::badbit;
873396145d0SLouis Dionne            // according to the spec, exceptions here are caught but not rethrown
8743e519524SHoward Hinnant        }
875b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
87600d8c245SHoward Hinnant        if (__gc_ == 0)
877396145d0SLouis Dionne           __state |= ios_base::failbit;
878396145d0SLouis Dionne        this->setstate(__state);
8793e519524SHoward Hinnant    }
8803e519524SHoward Hinnant    return *this;
8813e519524SHoward Hinnant}
8823e519524SHoward Hinnant
8833e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
8843e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
8853e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
8863e519524SHoward Hinnant{
887396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
8883e519524SHoward Hinnant    __gc_ = 0;
889396145d0SLouis Dionne    sentry __sen(*this, true);
890396145d0SLouis Dionne    if (__sen)
891396145d0SLouis Dionne    {
8923e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8933e519524SHoward Hinnant        try
8943e519524SHoward Hinnant        {
895b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
89600d8c245SHoward Hinnant            while (true)
89700d8c245SHoward Hinnant            {
89800d8c245SHoward Hinnant                typename traits_type::int_type __i = this->rdbuf()->sgetc();
89900d8c245SHoward Hinnant                if (traits_type::eq_int_type(__i, traits_type::eof()))
90000d8c245SHoward Hinnant                {
901396145d0SLouis Dionne                   __state |= ios_base::eofbit;
90200d8c245SHoward Hinnant                   break;
90300d8c245SHoward Hinnant                }
90400d8c245SHoward Hinnant                char_type __ch = traits_type::to_char_type(__i);
90500d8c245SHoward Hinnant                if (traits_type::eq(__ch, __dlm))
90600d8c245SHoward Hinnant                {
90700d8c245SHoward Hinnant                    this->rdbuf()->sbumpc();
90800d8c245SHoward Hinnant                    ++__gc_;
90900d8c245SHoward Hinnant                    break;
91000d8c245SHoward Hinnant                }
91100d8c245SHoward Hinnant                if (__gc_ >= __n-1)
91200d8c245SHoward Hinnant                {
913396145d0SLouis Dionne                    __state |= ios_base::failbit;
91400d8c245SHoward Hinnant                    break;
91500d8c245SHoward Hinnant                }
91600d8c245SHoward Hinnant                *__s++ = __ch;
91700d8c245SHoward Hinnant                this->rdbuf()->sbumpc();
91800d8c245SHoward Hinnant                ++__gc_;
91900d8c245SHoward Hinnant            }
9203e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9213e519524SHoward Hinnant        }
9223e519524SHoward Hinnant        catch (...)
9233e519524SHoward Hinnant        {
924396145d0SLouis Dionne            __state |= ios_base::badbit;
925396145d0SLouis Dionne            this->__setstate_nothrow(__state);
926396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
927396145d0SLouis Dionne            {
9282eb7f433SVolodymyr Sapsai                if (__n > 0)
9292eb7f433SVolodymyr Sapsai                    *__s = char_type();
930396145d0SLouis Dionne                if (__gc_ == 0)
931396145d0SLouis Dionne                    __state |= ios_base::failbit;
932396145d0SLouis Dionne                throw;
933396145d0SLouis Dionne            }
9343e519524SHoward Hinnant        }
935b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
936396145d0SLouis Dionne    }
937396145d0SLouis Dionne    if (__n > 0)
938396145d0SLouis Dionne        *__s = char_type();
939396145d0SLouis Dionne    if (__gc_ == 0)
940396145d0SLouis Dionne        __state |= ios_base::failbit;
941396145d0SLouis Dionne    this->setstate(__state);
9423e519524SHoward Hinnant    return *this;
9433e519524SHoward Hinnant}
9443e519524SHoward Hinnant
9453e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
9463e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
9473e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
9483e519524SHoward Hinnant{
949396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
9503e519524SHoward Hinnant    __gc_ = 0;
951396145d0SLouis Dionne    sentry __sen(*this, true);
952396145d0SLouis Dionne    if (__sen)
953396145d0SLouis Dionne    {
9543e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9553e519524SHoward Hinnant        try
9563e519524SHoward Hinnant        {
957b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
95800d8c245SHoward Hinnant            if (__n == numeric_limits<streamsize>::max())
9593e519524SHoward Hinnant            {
96000d8c245SHoward Hinnant                while (true)
9613e519524SHoward Hinnant                {
96200d8c245SHoward Hinnant                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
96300d8c245SHoward Hinnant                    if (traits_type::eq_int_type(__i, traits_type::eof()))
96400d8c245SHoward Hinnant                    {
965396145d0SLouis Dionne                       __state |= ios_base::eofbit;
96600d8c245SHoward Hinnant                       break;
96700d8c245SHoward Hinnant                    }
96800d8c245SHoward Hinnant                    ++__gc_;
969eecacc0fSHoward Hinnant                    if (traits_type::eq_int_type(__i, __dlm))
9703e519524SHoward Hinnant                        break;
9713e519524SHoward Hinnant                }
9723e519524SHoward Hinnant            }
9733e519524SHoward Hinnant            else
9743e519524SHoward Hinnant            {
97500d8c245SHoward Hinnant                while (__gc_ < __n)
9763e519524SHoward Hinnant                {
97700d8c245SHoward Hinnant                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
97800d8c245SHoward Hinnant                    if (traits_type::eq_int_type(__i, traits_type::eof()))
97900d8c245SHoward Hinnant                    {
980396145d0SLouis Dionne                       __state |= ios_base::eofbit;
98100d8c245SHoward Hinnant                       break;
98200d8c245SHoward Hinnant                    }
98300d8c245SHoward Hinnant                    ++__gc_;
984eecacc0fSHoward Hinnant                    if (traits_type::eq_int_type(__i, __dlm))
9853e519524SHoward Hinnant                        break;
9863e519524SHoward Hinnant                }
9873e519524SHoward Hinnant            }
9883e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9893e519524SHoward Hinnant        }
9903e519524SHoward Hinnant        catch (...)
9913e519524SHoward Hinnant        {
992396145d0SLouis Dionne            __state |= ios_base::badbit;
993396145d0SLouis Dionne            this->__setstate_nothrow(__state);
994396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
995396145d0SLouis Dionne            {
996396145d0SLouis Dionne                throw;
997396145d0SLouis Dionne            }
9983e519524SHoward Hinnant        }
999b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1000396145d0SLouis Dionne        this->setstate(__state);
1001396145d0SLouis Dionne    }
10023e519524SHoward Hinnant    return *this;
10033e519524SHoward Hinnant}
10043e519524SHoward Hinnant
10053e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
10063e519524SHoward Hinnanttypename basic_istream<_CharT, _Traits>::int_type
10073e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::peek()
10083e519524SHoward Hinnant{
1009396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
10103e519524SHoward Hinnant    __gc_ = 0;
10113e519524SHoward Hinnant    int_type __r = traits_type::eof();
1012396145d0SLouis Dionne    sentry __sen(*this, true);
1013396145d0SLouis Dionne    if (__sen)
1014396145d0SLouis Dionne    {
10153e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
10163e519524SHoward Hinnant        try
10173e519524SHoward Hinnant        {
1018b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
10193e519524SHoward Hinnant            __r = this->rdbuf()->sgetc();
102066e7ed95SHoward Hinnant            if (traits_type::eq_int_type(__r, traits_type::eof()))
1021396145d0SLouis Dionne                __state |= ios_base::eofbit;
10223e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
10233e519524SHoward Hinnant        }
10243e519524SHoward Hinnant        catch (...)
10253e519524SHoward Hinnant        {
1026396145d0SLouis Dionne            __state |= ios_base::badbit;
1027396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1028396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1029396145d0SLouis Dionne            {
1030396145d0SLouis Dionne                throw;
1031396145d0SLouis Dionne            }
10323e519524SHoward Hinnant        }
1033b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1034396145d0SLouis Dionne        this->setstate(__state);
1035396145d0SLouis Dionne    }
10363e519524SHoward Hinnant    return __r;
10373e519524SHoward Hinnant}
10383e519524SHoward Hinnant
10393e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
10403e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
10413e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
10423e519524SHoward Hinnant{
1043396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
10443e519524SHoward Hinnant    __gc_ = 0;
1045396145d0SLouis Dionne    sentry __sen(*this, true);
1046396145d0SLouis Dionne    if (__sen)
1047396145d0SLouis Dionne    {
10483e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
10493e519524SHoward Hinnant        try
10503e519524SHoward Hinnant        {
1051b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
105265f58f3fSHoward Hinnant            __gc_ = this->rdbuf()->sgetn(__s, __n);
105365f58f3fSHoward Hinnant            if (__gc_ != __n)
1054396145d0SLouis Dionne                __state |= ios_base::failbit | ios_base::eofbit;
10553e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
10563e519524SHoward Hinnant        }
10573e519524SHoward Hinnant        catch (...)
10583e519524SHoward Hinnant        {
1059396145d0SLouis Dionne            __state |= ios_base::badbit;
1060396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1061396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1062396145d0SLouis Dionne            {
1063396145d0SLouis Dionne                throw;
1064396145d0SLouis Dionne            }
10653e519524SHoward Hinnant        }
1066b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1067396145d0SLouis Dionne    }
1068396145d0SLouis Dionne    else
1069396145d0SLouis Dionne    {
1070396145d0SLouis Dionne        __state |= ios_base::failbit;
1071396145d0SLouis Dionne    }
1072396145d0SLouis Dionne    this->setstate(__state);
10733e519524SHoward Hinnant    return *this;
10743e519524SHoward Hinnant}
10753e519524SHoward Hinnant
10763e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
10773e519524SHoward Hinnantstreamsize
10783e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
10793e519524SHoward Hinnant{
1080396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
10813b42bdd5SHoward Hinnant    __gc_ = 0;
1082396145d0SLouis Dionne    sentry __sen(*this, true);
1083396145d0SLouis Dionne    if (__sen)
1084396145d0SLouis Dionne    {
10859531bbd7SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
10869531bbd7SMarshall Clow        try
10879531bbd7SMarshall Clow        {
10889531bbd7SMarshall Clow#endif // _LIBCPP_NO_EXCEPTIONS
108900d8c245SHoward Hinnant            streamsize __c = this->rdbuf()->in_avail();
10903e519524SHoward Hinnant            switch (__c)
10913e519524SHoward Hinnant            {
10923e519524SHoward Hinnant            case -1:
1093396145d0SLouis Dionne                __state |= ios_base::eofbit;
10943e519524SHoward Hinnant                break;
10953e519524SHoward Hinnant            case 0:
10963e519524SHoward Hinnant                break;
10973e519524SHoward Hinnant            default:
1098396145d0SLouis Dionne                __n = _VSTD::min(__c, __n);
1099396145d0SLouis Dionne                __gc_ = this->rdbuf()->sgetn(__s, __n);
1100396145d0SLouis Dionne                if (__gc_ != __n)
1101396145d0SLouis Dionne                    __state |= ios_base::failbit | ios_base::eofbit;
110200d8c245SHoward Hinnant                break;
11033e519524SHoward Hinnant            }
11049531bbd7SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
11059531bbd7SMarshall Clow        }
11069531bbd7SMarshall Clow        catch (...)
11079531bbd7SMarshall Clow        {
1108396145d0SLouis Dionne            __state |= ios_base::badbit;
1109396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1110396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1111396145d0SLouis Dionne            {
1112396145d0SLouis Dionne                throw;
1113396145d0SLouis Dionne            }
11149531bbd7SMarshall Clow        }
11159531bbd7SMarshall Clow#endif // _LIBCPP_NO_EXCEPTIONS
1116396145d0SLouis Dionne    }
1117396145d0SLouis Dionne    else
1118396145d0SLouis Dionne    {
1119396145d0SLouis Dionne        __state |= ios_base::failbit;
1120396145d0SLouis Dionne    }
1121396145d0SLouis Dionne    this->setstate(__state);
112200d8c245SHoward Hinnant    return __gc_;
11233e519524SHoward Hinnant}
11243e519524SHoward Hinnant
11253e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
11263e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
11273e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::putback(char_type __c)
11283e519524SHoward Hinnant{
1129396145d0SLouis Dionne    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
11303e519524SHoward Hinnant    __gc_ = 0;
1131396145d0SLouis Dionne    this->clear(__state);
1132396145d0SLouis Dionne    sentry __sen(*this, true);
1133396145d0SLouis Dionne    if (__sen)
1134396145d0SLouis Dionne    {
11353e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
11363e519524SHoward Hinnant        try
11373e519524SHoward Hinnant        {
1138b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1139527a7fdfSBruce Mitchener            if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1140396145d0SLouis Dionne                __state |= ios_base::badbit;
11413e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
11423e519524SHoward Hinnant        }
11433e519524SHoward Hinnant        catch (...)
11443e519524SHoward Hinnant        {
1145396145d0SLouis Dionne            __state |= ios_base::badbit;
1146396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1147396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1148396145d0SLouis Dionne            {
1149396145d0SLouis Dionne                throw;
1150396145d0SLouis Dionne            }
11513e519524SHoward Hinnant        }
1152b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1153396145d0SLouis Dionne    }
1154396145d0SLouis Dionne    else
1155396145d0SLouis Dionne    {
1156396145d0SLouis Dionne        __state |= ios_base::failbit;
1157396145d0SLouis Dionne    }
1158396145d0SLouis Dionne    this->setstate(__state);
11593e519524SHoward Hinnant    return *this;
11603e519524SHoward Hinnant}
11613e519524SHoward Hinnant
11623e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
11633e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
11643e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::unget()
11653e519524SHoward Hinnant{
1166396145d0SLouis Dionne    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
11673e519524SHoward Hinnant    __gc_ = 0;
1168396145d0SLouis Dionne    this->clear(__state);
1169396145d0SLouis Dionne    sentry __sen(*this, true);
1170396145d0SLouis Dionne    if (__sen)
1171396145d0SLouis Dionne    {
11723e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
11733e519524SHoward Hinnant        try
11743e519524SHoward Hinnant        {
1175b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1176527a7fdfSBruce Mitchener            if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
1177396145d0SLouis Dionne                __state |= ios_base::badbit;
11783e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
11793e519524SHoward Hinnant        }
11803e519524SHoward Hinnant        catch (...)
11813e519524SHoward Hinnant        {
1182396145d0SLouis Dionne            __state |= ios_base::badbit;
1183396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1184396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1185396145d0SLouis Dionne            {
1186396145d0SLouis Dionne                throw;
1187396145d0SLouis Dionne            }
11883e519524SHoward Hinnant        }
1189b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1190396145d0SLouis Dionne    }
1191396145d0SLouis Dionne    else
1192396145d0SLouis Dionne    {
1193396145d0SLouis Dionne        __state |= ios_base::failbit;
1194396145d0SLouis Dionne    }
1195396145d0SLouis Dionne    this->setstate(__state);
11963e519524SHoward Hinnant    return *this;
11973e519524SHoward Hinnant}
11983e519524SHoward Hinnant
11993e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
12003e519524SHoward Hinnantint
12013e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::sync()
12023e519524SHoward Hinnant{
1203396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
12043e519524SHoward Hinnant    int __r = 0;
1205396145d0SLouis Dionne    sentry __sen(*this, true);
1206396145d0SLouis Dionne    if (__sen)
1207396145d0SLouis Dionne    {
12083e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
12093e519524SHoward Hinnant        try
12103e519524SHoward Hinnant        {
1211b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1212527a7fdfSBruce Mitchener            if (this->rdbuf() == nullptr)
12133e519524SHoward Hinnant                return -1;
12143e519524SHoward Hinnant            if (this->rdbuf()->pubsync() == -1)
12153e519524SHoward Hinnant            {
1216396145d0SLouis Dionne                __state |= ios_base::badbit;
12173e519524SHoward Hinnant                return -1;
12183e519524SHoward Hinnant            }
12193e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
12203e519524SHoward Hinnant        }
12213e519524SHoward Hinnant        catch (...)
12223e519524SHoward Hinnant        {
1223396145d0SLouis Dionne            __state |= ios_base::badbit;
1224396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1225396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1226396145d0SLouis Dionne            {
1227396145d0SLouis Dionne                throw;
1228396145d0SLouis Dionne            }
12293e519524SHoward Hinnant        }
1230b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1231396145d0SLouis Dionne        this->setstate(__state);
1232396145d0SLouis Dionne    }
12333e519524SHoward Hinnant    return __r;
12343e519524SHoward Hinnant}
12353e519524SHoward Hinnant
12363e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
12373e519524SHoward Hinnanttypename basic_istream<_CharT, _Traits>::pos_type
12383e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::tellg()
12393e519524SHoward Hinnant{
1240396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
12413e519524SHoward Hinnant    pos_type __r(-1);
1242396145d0SLouis Dionne    sentry __sen(*this, true);
1243396145d0SLouis Dionne    if (__sen)
1244396145d0SLouis Dionne    {
12453e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
12463e519524SHoward Hinnant        try
12473e519524SHoward Hinnant        {
1248b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
12493e519524SHoward Hinnant        __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
12503e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
12513e519524SHoward Hinnant        }
12523e519524SHoward Hinnant        catch (...)
12533e519524SHoward Hinnant        {
1254396145d0SLouis Dionne            __state |= ios_base::badbit;
1255396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1256396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1257396145d0SLouis Dionne            {
1258396145d0SLouis Dionne                throw;
1259396145d0SLouis Dionne            }
12603e519524SHoward Hinnant        }
1261b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1262396145d0SLouis Dionne        this->setstate(__state);
1263396145d0SLouis Dionne    }
12643e519524SHoward Hinnant    return __r;
12653e519524SHoward Hinnant}
12663e519524SHoward Hinnant
12673e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
12683e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
12693e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::seekg(pos_type __pos)
12703e519524SHoward Hinnant{
1271396145d0SLouis Dionne    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1272396145d0SLouis Dionne    this->clear(__state);
1273396145d0SLouis Dionne    sentry __sen(*this, true);
1274396145d0SLouis Dionne    if (__sen)
1275396145d0SLouis Dionne    {
12763e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
12773e519524SHoward Hinnant        try
12783e519524SHoward Hinnant        {
1279b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
12803e519524SHoward Hinnant            if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1281396145d0SLouis Dionne                __state |= ios_base::failbit;
12823e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
12833e519524SHoward Hinnant        }
12843e519524SHoward Hinnant        catch (...)
12853e519524SHoward Hinnant        {
1286396145d0SLouis Dionne            __state |= ios_base::badbit;
1287396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1288396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1289396145d0SLouis Dionne            {
1290396145d0SLouis Dionne                throw;
1291396145d0SLouis Dionne            }
12923e519524SHoward Hinnant        }
1293b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1294396145d0SLouis Dionne        this->setstate(__state);
1295396145d0SLouis Dionne    }
12963e519524SHoward Hinnant    return *this;
12973e519524SHoward Hinnant}
12983e519524SHoward Hinnant
12993e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
13003e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
13013e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
13023e519524SHoward Hinnant{
1303396145d0SLouis Dionne    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1304396145d0SLouis Dionne    this->clear(__state);
1305396145d0SLouis Dionne    sentry __sen(*this, true);
1306396145d0SLouis Dionne    if (__sen)
1307396145d0SLouis Dionne    {
13083e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
13093e519524SHoward Hinnant        try
13103e519524SHoward Hinnant        {
1311b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1312e1bedf4eSMarshall Clow            if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1313396145d0SLouis Dionne                __state |= ios_base::failbit;
13143e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
13153e519524SHoward Hinnant        }
13163e519524SHoward Hinnant        catch (...)
13173e519524SHoward Hinnant        {
1318396145d0SLouis Dionne            __state |= ios_base::badbit;
1319396145d0SLouis Dionne            this->__setstate_nothrow(__state);
1320396145d0SLouis Dionne            if (this->exceptions() & ios_base::badbit)
1321396145d0SLouis Dionne            {
1322396145d0SLouis Dionne                throw;
1323396145d0SLouis Dionne            }
13243e519524SHoward Hinnant        }
1325b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1326396145d0SLouis Dionne        this->setstate(__state);
1327396145d0SLouis Dionne    }
13283e519524SHoward Hinnant    return *this;
13293e519524SHoward Hinnant}
13303e519524SHoward Hinnant
13313e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
13323e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
13333e519524SHoward Hinnantws(basic_istream<_CharT, _Traits>& __is)
13343e519524SHoward Hinnant{
1335396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
1336396145d0SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1337396145d0SLouis Dionne    if (__sen)
1338396145d0SLouis Dionne    {
13393e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
13403e519524SHoward Hinnant        try
13413e519524SHoward Hinnant        {
1342b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
13433e519524SHoward Hinnant            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
134400d8c245SHoward Hinnant            while (true)
134500d8c245SHoward Hinnant            {
134600d8c245SHoward Hinnant                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
134700d8c245SHoward Hinnant                if (_Traits::eq_int_type(__i, _Traits::eof()))
134800d8c245SHoward Hinnant                {
1349396145d0SLouis Dionne                   __state |= ios_base::eofbit;
13503e519524SHoward Hinnant                   break;
135100d8c245SHoward Hinnant                }
135200d8c245SHoward Hinnant                if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
135300d8c245SHoward Hinnant                    break;
135400d8c245SHoward Hinnant                __is.rdbuf()->sbumpc();
135500d8c245SHoward Hinnant            }
13563e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
13573e519524SHoward Hinnant        }
13583e519524SHoward Hinnant        catch (...)
13593e519524SHoward Hinnant        {
1360396145d0SLouis Dionne            __state |= ios_base::badbit;
1361396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
1362396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
1363396145d0SLouis Dionne            {
1364396145d0SLouis Dionne                throw;
1365396145d0SLouis Dionne            }
13663e519524SHoward Hinnant        }
1367b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1368396145d0SLouis Dionne        __is.setstate(__state);
1369396145d0SLouis Dionne    }
13703e519524SHoward Hinnant    return __is;
13713e519524SHoward Hinnant}
13723e519524SHoward Hinnant
1373c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp, class = void>
1374c90dee1eSLouis Dionnestruct __is_istreamable : false_type { };
1375c90dee1eSLouis Dionne
1376c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp>
1377c90dee1eSLouis Dionnestruct __is_istreamable<_Stream, _Tp, decltype(
1378ab3fcc50SArthur O'Dwyer    declval<_Stream>() >> declval<_Tp>(), void()
1379c90dee1eSLouis Dionne)> : true_type { };
1380c90dee1eSLouis Dionne
1381c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp, class = typename enable_if<
1382c90dee1eSLouis Dionne    _And<is_base_of<ios_base, _Stream>,
1383c90dee1eSLouis Dionne         __is_istreamable<_Stream&, _Tp&&> >::value
1384c90dee1eSLouis Dionne>::type>
1385c90dee1eSLouis Dionne_LIBCPP_INLINE_VISIBILITY
1386c90dee1eSLouis Dionne_Stream&& operator>>(_Stream&& __is, _Tp&& __x)
13873e519524SHoward Hinnant{
138863c69ef4SEric Fiselier    __is >> _VSTD::forward<_Tp>(__x);
1389c90dee1eSLouis Dionne    return _VSTD::move(__is);
13903e519524SHoward Hinnant}
13913e519524SHoward Hinnant
13923e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1393e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_iostream
13943e519524SHoward Hinnant    : public basic_istream<_CharT, _Traits>,
13953e519524SHoward Hinnant      public basic_ostream<_CharT, _Traits>
13963e519524SHoward Hinnant{
13973e519524SHoward Hinnantpublic:
13983e519524SHoward Hinnant    // types:
13993e519524SHoward Hinnant    typedef _CharT                         char_type;
14003e519524SHoward Hinnant    typedef _Traits                        traits_type;
14013e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
14023e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
14033e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
14043e519524SHoward Hinnant
14053e519524SHoward Hinnant    // constructor/destructor
14067833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1407f8f31c49SEric Fiselier    explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1408f8f31c49SEric Fiselier      : basic_istream<_CharT, _Traits>(__sb)
1409f8f31c49SEric Fiselier    {}
1410f8f31c49SEric Fiselier
14113e519524SHoward Hinnant    virtual ~basic_iostream();
14123e519524SHoward Hinnantprotected:
1413f8f31c49SEric Fiselier    inline _LIBCPP_INLINE_VISIBILITY
14143e519524SHoward Hinnant    basic_iostream(basic_iostream&& __rhs);
14153e519524SHoward Hinnant
14163e519524SHoward Hinnant    // assign/swap
1417f8f31c49SEric Fiselier    inline _LIBCPP_INLINE_VISIBILITY
14183e519524SHoward Hinnant    basic_iostream& operator=(basic_iostream&& __rhs);
1419a8d1182fSArthur O'Dwyer
14207833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1421f8f31c49SEric Fiselier    void swap(basic_iostream& __rhs)
1422f8f31c49SEric Fiselier    { basic_istream<char_type, traits_type>::swap(__rhs); }
14233e519524SHoward Hinnant};
14243e519524SHoward Hinnant
14253e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
14263e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
1427ce48a113SHoward Hinnant    : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
14283e519524SHoward Hinnant{
14293e519524SHoward Hinnant}
14303e519524SHoward Hinnant
14313e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
14323e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>&
14333e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
14343e519524SHoward Hinnant{
14353e519524SHoward Hinnant    swap(__rhs);
14363e519524SHoward Hinnant    return *this;
14373e519524SHoward Hinnant}
14383e519524SHoward Hinnant
14393e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
14403e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>::~basic_iostream()
14413e519524SHoward Hinnant{
14423e519524SHoward Hinnant}
14433e519524SHoward Hinnant
14443e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
14453e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
14463e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is,
14473e519524SHoward Hinnant           basic_string<_CharT, _Traits, _Allocator>& __str)
14483e519524SHoward Hinnant{
1449396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
145038b7e748SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
145138b7e748SLouis Dionne    if (__sen)
145238b7e748SLouis Dionne    {
1453396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS
1454396145d0SLouis Dionne        try
1455396145d0SLouis Dionne        {
1456396145d0SLouis Dionne#endif
14573e519524SHoward Hinnant            __str.clear();
14583e519524SHoward Hinnant            streamsize __n = __is.width();
145900d8c245SHoward Hinnant            if (__n <= 0)
14603e519524SHoward Hinnant                __n = __str.max_size();
146100d8c245SHoward Hinnant            if (__n <= 0)
14623e519524SHoward Hinnant                __n = numeric_limits<streamsize>::max();
14633e519524SHoward Hinnant            streamsize __c = 0;
14643e519524SHoward Hinnant            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
146500d8c245SHoward Hinnant            while (__c < __n)
14663e519524SHoward Hinnant            {
146700d8c245SHoward Hinnant                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
146800d8c245SHoward Hinnant                if (_Traits::eq_int_type(__i, _Traits::eof()))
146900d8c245SHoward Hinnant                {
1470396145d0SLouis Dionne                   __state |= ios_base::eofbit;
147100d8c245SHoward Hinnant                   break;
147200d8c245SHoward Hinnant                }
147300d8c245SHoward Hinnant                _CharT __ch = _Traits::to_char_type(__i);
14743e519524SHoward Hinnant                if (__ct.is(__ct.space, __ch))
14753e519524SHoward Hinnant                    break;
14763e519524SHoward Hinnant                __str.push_back(__ch);
147700d8c245SHoward Hinnant                ++__c;
147800d8c245SHoward Hinnant                 __is.rdbuf()->sbumpc();
14793e519524SHoward Hinnant            }
14803e519524SHoward Hinnant            __is.width(0);
14813e519524SHoward Hinnant            if (__c == 0)
1482396145d0SLouis Dionne               __state |= ios_base::failbit;
14833e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
14843e519524SHoward Hinnant        }
14853e519524SHoward Hinnant        catch (...)
14863e519524SHoward Hinnant        {
1487396145d0SLouis Dionne            __state |= ios_base::badbit;
1488396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
1489396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
1490396145d0SLouis Dionne            {
1491396145d0SLouis Dionne                throw;
14923e519524SHoward Hinnant            }
1493396145d0SLouis Dionne        }
1494396145d0SLouis Dionne#endif
1495396145d0SLouis Dionne        __is.setstate(__state);
1496396145d0SLouis Dionne    }
14973e519524SHoward Hinnant    return __is;
14983e519524SHoward Hinnant}
14993e519524SHoward Hinnant
15003e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
15013e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
15023e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>& __is,
15033e519524SHoward Hinnant        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
15043e519524SHoward Hinnant{
1505396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
150638b7e748SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
150738b7e748SLouis Dionne    if (__sen)
150838b7e748SLouis Dionne    {
1509396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS
1510396145d0SLouis Dionne        try
1511396145d0SLouis Dionne        {
1512396145d0SLouis Dionne#endif
15133e519524SHoward Hinnant            __str.clear();
15141ed7df11SHoward Hinnant            streamsize __extr = 0;
151500d8c245SHoward Hinnant            while (true)
15163e519524SHoward Hinnant            {
151700d8c245SHoward Hinnant                typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
151800d8c245SHoward Hinnant                if (_Traits::eq_int_type(__i, _Traits::eof()))
151900d8c245SHoward Hinnant                {
1520396145d0SLouis Dionne                   __state |= ios_base::eofbit;
152100d8c245SHoward Hinnant                   break;
152200d8c245SHoward Hinnant                }
15231ed7df11SHoward Hinnant                ++__extr;
152400d8c245SHoward Hinnant                _CharT __ch = _Traits::to_char_type(__i);
15253e519524SHoward Hinnant                if (_Traits::eq(__ch, __dlm))
15263e519524SHoward Hinnant                    break;
152700d8c245SHoward Hinnant                __str.push_back(__ch);
152800d8c245SHoward Hinnant                if (__str.size() == __str.max_size())
15293e519524SHoward Hinnant                {
1530396145d0SLouis Dionne                    __state |= ios_base::failbit;
15313e519524SHoward Hinnant                    break;
15323e519524SHoward Hinnant                }
15333e519524SHoward Hinnant            }
15341ed7df11SHoward Hinnant            if (__extr == 0)
1535396145d0SLouis Dionne               __state |= ios_base::failbit;
15363e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
15373e519524SHoward Hinnant        }
15383e519524SHoward Hinnant        catch (...)
15393e519524SHoward Hinnant        {
1540396145d0SLouis Dionne            __state |= ios_base::badbit;
1541396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
1542396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
1543396145d0SLouis Dionne            {
1544396145d0SLouis Dionne                throw;
15453e519524SHoward Hinnant            }
1546396145d0SLouis Dionne        }
1547396145d0SLouis Dionne#endif
1548396145d0SLouis Dionne        __is.setstate(__state);
1549396145d0SLouis Dionne    }
15503e519524SHoward Hinnant    return __is;
15513e519524SHoward Hinnant}
15523e519524SHoward Hinnant
15533e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
1554c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
15553e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
15563e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>& __is,
15573e519524SHoward Hinnant        basic_string<_CharT, _Traits, _Allocator>& __str)
15583e519524SHoward Hinnant{
15593e519524SHoward Hinnant    return getline(__is, __str, __is.widen('\n'));
15603e519524SHoward Hinnant}
15613e519524SHoward Hinnant
15623e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
1563c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
15643e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
15653e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>&& __is,
15663e519524SHoward Hinnant        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
15673e519524SHoward Hinnant{
15683e519524SHoward Hinnant    return getline(__is, __str, __dlm);
15693e519524SHoward Hinnant}
15703e519524SHoward Hinnant
15713e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
1572c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
15733e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
15743e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>&& __is,
15753e519524SHoward Hinnant        basic_string<_CharT, _Traits, _Allocator>& __str)
15763e519524SHoward Hinnant{
15773e519524SHoward Hinnant    return getline(__is, __str, __is.widen('\n'));
15783e519524SHoward Hinnant}
15793e519524SHoward Hinnant
15803e519524SHoward Hinnanttemplate <class _CharT, class _Traits, size_t _Size>
15813e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
15823e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
15833e519524SHoward Hinnant{
1584396145d0SLouis Dionne    ios_base::iostate __state = ios_base::goodbit;
158538b7e748SLouis Dionne    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
158638b7e748SLouis Dionne    if (__sen)
158738b7e748SLouis Dionne    {
1588396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS
1589396145d0SLouis Dionne        try
1590396145d0SLouis Dionne        {
1591396145d0SLouis Dionne#endif
15923e519524SHoward Hinnant            basic_string<_CharT, _Traits> __str;
15933e519524SHoward Hinnant            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1594aec08784SEric Fiselier            size_t __c = 0;
15953e519524SHoward Hinnant            _CharT __zero = __ct.widen('0');
15963e519524SHoward Hinnant            _CharT __one = __ct.widen('1');
1597e39095a3SLouis Dionne            while (__c != _Size)
15983e519524SHoward Hinnant            {
159900d8c245SHoward Hinnant                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
160000d8c245SHoward Hinnant                if (_Traits::eq_int_type(__i, _Traits::eof()))
160100d8c245SHoward Hinnant                {
1602396145d0SLouis Dionne                   __state |= ios_base::eofbit;
160300d8c245SHoward Hinnant                   break;
160400d8c245SHoward Hinnant                }
160500d8c245SHoward Hinnant                _CharT __ch = _Traits::to_char_type(__i);
160600d8c245SHoward Hinnant                if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
16073e519524SHoward Hinnant                    break;
16083e519524SHoward Hinnant                __str.push_back(__ch);
160900d8c245SHoward Hinnant                ++__c;
161000d8c245SHoward Hinnant                 __is.rdbuf()->sbumpc();
16113e519524SHoward Hinnant            }
16123e519524SHoward Hinnant            __x = bitset<_Size>(__str);
1613fc4486c2SLouis Dionne            if (_Size > 0 && __c == 0)
1614396145d0SLouis Dionne               __state |= ios_base::failbit;
16153e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
16163e519524SHoward Hinnant        }
16173e519524SHoward Hinnant        catch (...)
16183e519524SHoward Hinnant        {
1619396145d0SLouis Dionne            __state |= ios_base::badbit;
1620396145d0SLouis Dionne            __is.__setstate_nothrow(__state);
1621396145d0SLouis Dionne            if (__is.exceptions() & ios_base::badbit)
1622396145d0SLouis Dionne            {
1623396145d0SLouis Dionne                throw;
16243e519524SHoward Hinnant            }
1625396145d0SLouis Dionne        }
1626396145d0SLouis Dionne#endif
1627396145d0SLouis Dionne        __is.setstate(__state);
1628396145d0SLouis Dionne    }
16293e519524SHoward Hinnant    return __is;
16303e519524SHoward Hinnant}
16313e519524SHoward Hinnant
16322ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>;
1633f4c1258dSLouis Dionne#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
16342ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>;
1635f4c1258dSLouis Dionne#endif
16362ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>;
16373e519524SHoward Hinnant
16383e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
16393e519524SHoward Hinnant
1640a016efb1SEric Fiselier_LIBCPP_POP_MACROS
1641a016efb1SEric Fiselier
16423e519524SHoward Hinnant#endif // _LIBCPP_ISTREAM
1643