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