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