xref: /freebsd-12.1/contrib/libc++/include/istream (revision b5893f02)
17a984708SDavid Chisnall// -*- C++ -*-
27a984708SDavid Chisnall//===--------------------------- istream ----------------------------------===//
37a984708SDavid Chisnall//
47a984708SDavid Chisnall//                     The LLVM Compiler Infrastructure
57a984708SDavid Chisnall//
67a984708SDavid Chisnall// This file is dual licensed under the MIT and the University of Illinois Open
77a984708SDavid Chisnall// Source Licenses. See LICENSE.TXT for details.
87a984708SDavid Chisnall//
97a984708SDavid Chisnall//===----------------------------------------------------------------------===//
107a984708SDavid Chisnall
117a984708SDavid Chisnall#ifndef _LIBCPP_ISTREAM
127a984708SDavid Chisnall#define _LIBCPP_ISTREAM
137a984708SDavid Chisnall
147a984708SDavid Chisnall/*
157a984708SDavid Chisnall    istream synopsis
167a984708SDavid Chisnall
177a984708SDavid Chisnalltemplate <class charT, class traits = char_traits<charT> >
187a984708SDavid Chisnallclass basic_istream
197a984708SDavid Chisnall    : virtual public basic_ios<charT,traits>
207a984708SDavid Chisnall{
217a984708SDavid Chisnallpublic:
227a984708SDavid Chisnall    // types (inherited from basic_ios (27.5.4)):
237a984708SDavid Chisnall    typedef charT                          char_type;
247a984708SDavid Chisnall    typedef traits                         traits_type;
257a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
267a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
277a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
287a984708SDavid Chisnall
297a984708SDavid Chisnall    // 27.7.1.1.1 Constructor/destructor:
307a984708SDavid Chisnall    explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
317a984708SDavid Chisnall    basic_istream(basic_istream&& rhs);
327a984708SDavid Chisnall    virtual ~basic_istream();
337a984708SDavid Chisnall
347a984708SDavid Chisnall    // 27.7.1.1.2 Assign/swap:
357a984708SDavid Chisnall    basic_istream& operator=(basic_istream&& rhs);
367a984708SDavid Chisnall    void swap(basic_istream& rhs);
377a984708SDavid Chisnall
387a984708SDavid Chisnall    // 27.7.1.1.3 Prefix/suffix:
397a984708SDavid Chisnall    class sentry;
407a984708SDavid Chisnall
417a984708SDavid Chisnall    // 27.7.1.2 Formatted input:
427a984708SDavid Chisnall    basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
437a984708SDavid Chisnall    basic_istream& operator>>(basic_ios<char_type, traits_type>&
447a984708SDavid Chisnall                              (*pf)(basic_ios<char_type, traits_type>&));
457a984708SDavid Chisnall    basic_istream& operator>>(ios_base& (*pf)(ios_base&));
467a984708SDavid Chisnall    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
477a984708SDavid Chisnall    basic_istream& operator>>(bool& n);
487a984708SDavid Chisnall    basic_istream& operator>>(short& n);
497a984708SDavid Chisnall    basic_istream& operator>>(unsigned short& n);
507a984708SDavid Chisnall    basic_istream& operator>>(int& n);
517a984708SDavid Chisnall    basic_istream& operator>>(unsigned int& n);
527a984708SDavid Chisnall    basic_istream& operator>>(long& n);
537a984708SDavid Chisnall    basic_istream& operator>>(unsigned long& n);
547a984708SDavid Chisnall    basic_istream& operator>>(long long& n);
557a984708SDavid Chisnall    basic_istream& operator>>(unsigned long long& n);
567a984708SDavid Chisnall    basic_istream& operator>>(float& f);
577a984708SDavid Chisnall    basic_istream& operator>>(double& f);
587a984708SDavid Chisnall    basic_istream& operator>>(long double& f);
597a984708SDavid Chisnall    basic_istream& operator>>(void*& p);
607a984708SDavid Chisnall
617a984708SDavid Chisnall    // 27.7.1.3 Unformatted input:
627a984708SDavid Chisnall    streamsize gcount() const;
637a984708SDavid Chisnall    int_type get();
647a984708SDavid Chisnall    basic_istream& get(char_type& c);
657a984708SDavid Chisnall    basic_istream& get(char_type* s, streamsize n);
667a984708SDavid Chisnall    basic_istream& get(char_type* s, streamsize n, char_type delim);
677a984708SDavid Chisnall    basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
687a984708SDavid Chisnall    basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
697a984708SDavid Chisnall
707a984708SDavid Chisnall    basic_istream& getline(char_type* s, streamsize n);
717a984708SDavid Chisnall    basic_istream& getline(char_type* s, streamsize n, char_type delim);
727a984708SDavid Chisnall
737a984708SDavid Chisnall    basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
747a984708SDavid Chisnall    int_type peek();
757a984708SDavid Chisnall    basic_istream& read (char_type* s, streamsize n);
767a984708SDavid Chisnall    streamsize readsome(char_type* s, streamsize n);
777a984708SDavid Chisnall
787a984708SDavid Chisnall    basic_istream& putback(char_type c);
797a984708SDavid Chisnall    basic_istream& unget();
807a984708SDavid Chisnall    int sync();
817a984708SDavid Chisnall
827a984708SDavid Chisnall    pos_type tellg();
837a984708SDavid Chisnall    basic_istream& seekg(pos_type);
847a984708SDavid Chisnall    basic_istream& seekg(off_type, ios_base::seekdir);
85d72607e9SDimitry Andricprotected:
86d72607e9SDimitry Andric    basic_istream(const basic_istream& rhs) = delete;
87d72607e9SDimitry Andric    basic_istream(basic_istream&& rhs);
88d72607e9SDimitry Andric    // 27.7.2.1.2 Assign/swap:
89d72607e9SDimitry Andric    basic_istream& operator=(const basic_istream& rhs) = delete;
90d72607e9SDimitry Andric    basic_istream& operator=(basic_istream&& rhs);
91d72607e9SDimitry Andric    void swap(basic_istream& rhs);
927a984708SDavid Chisnall};
937a984708SDavid Chisnall
947a984708SDavid Chisnall// 27.7.1.2.3 character extraction templates:
957a984708SDavid Chisnalltemplate<class charT, class traits>
967a984708SDavid Chisnall  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
977a984708SDavid Chisnall
987a984708SDavid Chisnalltemplate<class traits>
997a984708SDavid Chisnall  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
1007a984708SDavid Chisnall
1017a984708SDavid Chisnalltemplate<class traits>
1027a984708SDavid Chisnall  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
1037a984708SDavid Chisnall
1047a984708SDavid Chisnalltemplate<class charT, class traits>
1057a984708SDavid Chisnall  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
1067a984708SDavid Chisnall
1077a984708SDavid Chisnalltemplate<class traits>
1087a984708SDavid Chisnall  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
1097a984708SDavid Chisnall
1107a984708SDavid Chisnalltemplate<class traits>
1117a984708SDavid Chisnall  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
1127a984708SDavid Chisnall
1137a984708SDavid Chisnalltemplate <class charT, class traits>
1147a984708SDavid Chisnall  void
1157a984708SDavid Chisnall  swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
1167a984708SDavid Chisnall
1177a984708SDavid Chisnalltypedef basic_istream<char> istream;
1187a984708SDavid Chisnalltypedef basic_istream<wchar_t> wistream;
1197a984708SDavid Chisnall
1207a984708SDavid Chisnalltemplate <class charT, class traits = char_traits<charT> >
1217a984708SDavid Chisnallclass basic_iostream :
1227a984708SDavid Chisnall    public basic_istream<charT,traits>,
1237a984708SDavid Chisnall    public basic_ostream<charT,traits>
1247a984708SDavid Chisnall{
1257a984708SDavid Chisnallpublic:
1267a984708SDavid Chisnall    // types:
1277a984708SDavid Chisnall    typedef charT                          char_type;
1287a984708SDavid Chisnall    typedef traits                         traits_type;
1297a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
1307a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
1317a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
1327a984708SDavid Chisnall
1337a984708SDavid Chisnall    // constructor/destructor
1347a984708SDavid Chisnall    explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
1357a984708SDavid Chisnall    basic_iostream(basic_iostream&& rhs);
1367a984708SDavid Chisnall    virtual ~basic_iostream();
1377a984708SDavid Chisnall
1387a984708SDavid Chisnall    // assign/swap
1397a984708SDavid Chisnall    basic_iostream& operator=(basic_iostream&& rhs);
1407a984708SDavid Chisnall    void swap(basic_iostream& rhs);
1417a984708SDavid Chisnall};
1427a984708SDavid Chisnall
1437a984708SDavid Chisnalltemplate <class charT, class traits>
1447a984708SDavid Chisnall  void
1457a984708SDavid Chisnall  swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
1467a984708SDavid Chisnall
1477a984708SDavid Chisnalltypedef basic_iostream<char> iostream;
1487a984708SDavid Chisnalltypedef basic_iostream<wchar_t> wiostream;
1497a984708SDavid Chisnall
1507a984708SDavid Chisnalltemplate <class charT, class traits>
1517a984708SDavid Chisnall  basic_istream<charT,traits>&
1527a984708SDavid Chisnall  ws(basic_istream<charT,traits>& is);
1537a984708SDavid Chisnall
1547a984708SDavid Chisnalltemplate <class charT, class traits, class T>
1557a984708SDavid Chisnall  basic_istream<charT, traits>&
1567a984708SDavid Chisnall  operator>>(basic_istream<charT, traits>&& is, T& x);
1577a984708SDavid Chisnall
1587a984708SDavid Chisnall}  // std
1597a984708SDavid Chisnall
1607a984708SDavid Chisnall*/
1617a984708SDavid Chisnall
1627a984708SDavid Chisnall#include <__config>
163*b5893f02SDimitry Andric#include <version>
1647a984708SDavid Chisnall#include <ostream>
1657a984708SDavid Chisnall
1667a984708SDavid Chisnall#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1677a984708SDavid Chisnall#pragma GCC system_header
1687a984708SDavid Chisnall#endif
1697a984708SDavid Chisnall
170f9448bf3SDimitry Andric_LIBCPP_PUSH_MACROS
171f9448bf3SDimitry Andric#include <__undef_macros>
172f9448bf3SDimitry Andric
173f9448bf3SDimitry Andric
1747a984708SDavid Chisnall_LIBCPP_BEGIN_NAMESPACE_STD
1757a984708SDavid Chisnall
1767a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
177aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream
1787a984708SDavid Chisnall    : virtual public basic_ios<_CharT, _Traits>
1797a984708SDavid Chisnall{
1807a984708SDavid Chisnall    streamsize __gc_;
1817a984708SDavid Chisnallpublic:
1827a984708SDavid Chisnall    // types (inherited from basic_ios (27.5.4)):
1837a984708SDavid Chisnall    typedef _CharT                         char_type;
1847a984708SDavid Chisnall    typedef _Traits                        traits_type;
1857a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
1867a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
1877a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
1887a984708SDavid Chisnall
1897a984708SDavid Chisnall    // 27.7.1.1.1 Constructor/destructor:
190*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
191aed8d94eSDimitry Andric    explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
192aed8d94eSDimitry Andric    { this->init(__sb); }
1937a984708SDavid Chisnall    virtual ~basic_istream();
1947a984708SDavid Chisnallprotected:
195540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
196aed8d94eSDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
1977a984708SDavid Chisnall    basic_istream(basic_istream&& __rhs);
198540d2a8bSDimitry Andric
1997a984708SDavid Chisnall    // 27.7.1.1.2 Assign/swap:
200aed8d94eSDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
2017a984708SDavid Chisnall    basic_istream& operator=(basic_istream&& __rhs);
2027a984708SDavid Chisnall#endif
203aed8d94eSDimitry Andric
204*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
205aed8d94eSDimitry Andric    void swap(basic_istream& __rhs) {
206aed8d94eSDimitry Andric      _VSTD::swap(__gc_, __rhs.__gc_);
207aed8d94eSDimitry Andric      basic_ios<char_type, traits_type>::swap(__rhs);
208aed8d94eSDimitry Andric    }
209d72607e9SDimitry Andric
21080779b37SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
211d72607e9SDimitry Andric    basic_istream           (const basic_istream& __rhs) = delete;
212d72607e9SDimitry Andric    basic_istream& operator=(const basic_istream& __rhs) = delete;
213d72607e9SDimitry Andric#endif
2147a984708SDavid Chisnallpublic:
2157a984708SDavid Chisnall
2167a984708SDavid Chisnall    // 27.7.1.1.3 Prefix/suffix:
217aed8d94eSDimitry Andric    class _LIBCPP_TEMPLATE_VIS sentry;
2187a984708SDavid Chisnall
2197a984708SDavid Chisnall    // 27.7.1.2 Formatted input:
220*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
221aed8d94eSDimitry Andric    basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
222aed8d94eSDimitry Andric    { return __pf(*this); }
223aed8d94eSDimitry Andric
224*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2257a984708SDavid Chisnall    basic_istream& operator>>(basic_ios<char_type, traits_type>&
226aed8d94eSDimitry Andric                              (*__pf)(basic_ios<char_type, traits_type>&))
227aed8d94eSDimitry Andric    { __pf(*this); return *this; }
228aed8d94eSDimitry Andric
229*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
230aed8d94eSDimitry Andric    basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
231aed8d94eSDimitry Andric    { __pf(*this); return *this; }
232aed8d94eSDimitry Andric
2337a984708SDavid Chisnall    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
2347a984708SDavid Chisnall    basic_istream& operator>>(bool& __n);
2357a984708SDavid Chisnall    basic_istream& operator>>(short& __n);
2367a984708SDavid Chisnall    basic_istream& operator>>(unsigned short& __n);
2377a984708SDavid Chisnall    basic_istream& operator>>(int& __n);
2387a984708SDavid Chisnall    basic_istream& operator>>(unsigned int& __n);
2397a984708SDavid Chisnall    basic_istream& operator>>(long& __n);
2407a984708SDavid Chisnall    basic_istream& operator>>(unsigned long& __n);
2417a984708SDavid Chisnall    basic_istream& operator>>(long long& __n);
2427a984708SDavid Chisnall    basic_istream& operator>>(unsigned long long& __n);
2437a984708SDavid Chisnall    basic_istream& operator>>(float& __f);
2447a984708SDavid Chisnall    basic_istream& operator>>(double& __f);
2457a984708SDavid Chisnall    basic_istream& operator>>(long double& __f);
2467a984708SDavid Chisnall    basic_istream& operator>>(void*& __p);
2477a984708SDavid Chisnall
2487a984708SDavid Chisnall    // 27.7.1.3 Unformatted input:
2497a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
2507a984708SDavid Chisnall    streamsize gcount() const {return __gc_;}
2517a984708SDavid Chisnall    int_type get();
252aed8d94eSDimitry Andric
253*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
254aed8d94eSDimitry Andric    basic_istream& get(char_type& __c) {
255aed8d94eSDimitry Andric      int_type __ch = get();
256aed8d94eSDimitry Andric      if (__ch != traits_type::eof())
257aed8d94eSDimitry Andric        __c = traits_type::to_char_type(__ch);
258aed8d94eSDimitry Andric      return *this;
259aed8d94eSDimitry Andric    }
260aed8d94eSDimitry Andric
261*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
262aed8d94eSDimitry Andric    basic_istream& get(char_type* __s, streamsize __n)
263aed8d94eSDimitry Andric    { return get(__s, __n, this->widen('\n')); }
264aed8d94eSDimitry Andric
2657a984708SDavid Chisnall    basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
266aed8d94eSDimitry Andric
267*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
268aed8d94eSDimitry Andric    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
269aed8d94eSDimitry Andric    { return get(__sb, this->widen('\n')); }
270aed8d94eSDimitry Andric
2717a984708SDavid Chisnall    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
2727a984708SDavid Chisnall
273*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
274aed8d94eSDimitry Andric    basic_istream& getline(char_type* __s, streamsize __n)
275aed8d94eSDimitry Andric    { return getline(__s, __n, this->widen('\n')); }
276aed8d94eSDimitry Andric
2777a984708SDavid Chisnall    basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
2787a984708SDavid Chisnall
2797a984708SDavid Chisnall    basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
2807a984708SDavid Chisnall    int_type peek();
2817a984708SDavid Chisnall    basic_istream& read (char_type* __s, streamsize __n);
2827a984708SDavid Chisnall    streamsize readsome(char_type* __s, streamsize __n);
2837a984708SDavid Chisnall
2847a984708SDavid Chisnall    basic_istream& putback(char_type __c);
2857a984708SDavid Chisnall    basic_istream& unget();
2867a984708SDavid Chisnall    int sync();
2877a984708SDavid Chisnall
2887a984708SDavid Chisnall    pos_type tellg();
2897a984708SDavid Chisnall    basic_istream& seekg(pos_type __pos);
2907a984708SDavid Chisnall    basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
2917a984708SDavid Chisnall};
2927a984708SDavid Chisnall
2937a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
294aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
2957a984708SDavid Chisnall{
2967a984708SDavid Chisnall    bool __ok_;
2977a984708SDavid Chisnall
2987a984708SDavid Chisnall    sentry(const sentry&); // = delete;
2997a984708SDavid Chisnall    sentry& operator=(const sentry&); // = delete;
3007a984708SDavid Chisnall
3017a984708SDavid Chisnallpublic:
3027a984708SDavid Chisnall    explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
3037a984708SDavid Chisnall//    ~sentry() = default;
3047a984708SDavid Chisnall
3057a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
30694e3ee44SDavid Chisnall        _LIBCPP_EXPLICIT
3077a984708SDavid Chisnall        operator bool() const {return __ok_;}
3087a984708SDavid Chisnall};
3097a984708SDavid Chisnall
3107a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3117a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
3127a984708SDavid Chisnall                                               bool __noskipws)
3137a984708SDavid Chisnall    : __ok_(false)
3147a984708SDavid Chisnall{
3157a984708SDavid Chisnall    if (__is.good())
3167a984708SDavid Chisnall    {
3177a984708SDavid Chisnall        if (__is.tie())
3187a984708SDavid Chisnall            __is.tie()->flush();
3197a984708SDavid Chisnall        if (!__noskipws && (__is.flags() & ios_base::skipws))
3207a984708SDavid Chisnall        {
32194e3ee44SDavid Chisnall            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3227a984708SDavid Chisnall            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
32394e3ee44SDavid Chisnall            _Ip __i(__is);
32494e3ee44SDavid Chisnall            _Ip __eof;
3257a984708SDavid Chisnall            for (; __i != __eof; ++__i)
3267a984708SDavid Chisnall                if (!__ct.is(__ct.space, *__i))
3277a984708SDavid Chisnall                    break;
3287a984708SDavid Chisnall            if (__i == __eof)
3297a984708SDavid Chisnall                __is.setstate(ios_base::failbit | ios_base::eofbit);
3307a984708SDavid Chisnall        }
3317a984708SDavid Chisnall        __ok_ = __is.good();
3327a984708SDavid Chisnall    }
3337a984708SDavid Chisnall    else
3347a984708SDavid Chisnall        __is.setstate(ios_base::failbit);
3357a984708SDavid Chisnall}
3367a984708SDavid Chisnall
337540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
3387a984708SDavid Chisnall
3397a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3407a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
3417a984708SDavid Chisnall    : __gc_(__rhs.__gc_)
3427a984708SDavid Chisnall{
3437a984708SDavid Chisnall    __rhs.__gc_ = 0;
3447a984708SDavid Chisnall    this->move(__rhs);
3457a984708SDavid Chisnall}
3467a984708SDavid Chisnall
3477a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3487a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
3497a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
3507a984708SDavid Chisnall{
3517a984708SDavid Chisnall    swap(__rhs);
3527a984708SDavid Chisnall    return *this;
3537a984708SDavid Chisnall}
3547a984708SDavid Chisnall
355540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
3567a984708SDavid Chisnall
3577a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3587a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::~basic_istream()
3597a984708SDavid Chisnall{
3607a984708SDavid Chisnall}
3617a984708SDavid Chisnall
3624ba319b5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
3634ba319b5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
3647a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
3654ba319b5SDimitry Andric__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
3667a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
3677a984708SDavid Chisnall    try
3687a984708SDavid Chisnall    {
3697a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
3704ba319b5SDimitry Andric        typename basic_istream<_CharT, _Traits>::sentry __s(__is);
3717a984708SDavid Chisnall        if (__s)
3727a984708SDavid Chisnall        {
3734ba319b5SDimitry Andric            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3744ba319b5SDimitry Andric            typedef num_get<_CharT, _Ip> _Fp;
3757a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
3764ba319b5SDimitry Andric            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __n);
3774ba319b5SDimitry Andric            __is.setstate(__err);
3787a984708SDavid Chisnall        }
3797a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
3807a984708SDavid Chisnall    }
3817a984708SDavid Chisnall    catch (...)
3827a984708SDavid Chisnall    {
3834ba319b5SDimitry Andric        __is.__set_badbit_and_consider_rethrow();
3847a984708SDavid Chisnall    }
3857a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
3864ba319b5SDimitry Andric    return __is;
3874ba319b5SDimitry Andric}
3884ba319b5SDimitry Andric
3894ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
3904ba319b5SDimitry Andricbasic_istream<_CharT, _Traits>&
3914ba319b5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
3924ba319b5SDimitry Andric{
3934ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
3947a984708SDavid Chisnall}
3957a984708SDavid Chisnall
3967a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3977a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
3987a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
3997a984708SDavid Chisnall{
4004ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
4017a984708SDavid Chisnall}
4027a984708SDavid Chisnall
4037a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4047a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4057a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(long& __n)
4067a984708SDavid Chisnall{
4074ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<long>(*this, __n);
4087a984708SDavid Chisnall}
4097a984708SDavid Chisnall
4107a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4117a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4127a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
4137a984708SDavid Chisnall{
4144ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
4157a984708SDavid Chisnall}
4167a984708SDavid Chisnall
4177a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4187a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4197a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(long long& __n)
4207a984708SDavid Chisnall{
4214ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<long long>(*this, __n);
4227a984708SDavid Chisnall}
4237a984708SDavid Chisnall
4247a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4257a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4267a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
4277a984708SDavid Chisnall{
4284ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
4297a984708SDavid Chisnall}
4307a984708SDavid Chisnall
4317a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4327a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4337a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(float& __n)
4347a984708SDavid Chisnall{
4354ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<float>(*this, __n);
4367a984708SDavid Chisnall}
4377a984708SDavid Chisnall
4387a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4397a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4407a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(double& __n)
4417a984708SDavid Chisnall{
4424ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<double>(*this, __n);
4437a984708SDavid Chisnall}
4447a984708SDavid Chisnall
4457a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4467a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4477a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(long double& __n)
4487a984708SDavid Chisnall{
4494ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<long double>(*this, __n);
4507a984708SDavid Chisnall}
4517a984708SDavid Chisnall
4527a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4537a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4547a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(bool& __n)
4557a984708SDavid Chisnall{
4564ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<bool>(*this, __n);
4577a984708SDavid Chisnall}
4587a984708SDavid Chisnall
4597a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4607a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
4617a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(void*& __n)
4627a984708SDavid Chisnall{
4634ba319b5SDimitry Andric    return _VSTD::__input_arithmetic<void*>(*this, __n);
4644ba319b5SDimitry Andric}
4654ba319b5SDimitry Andric
4664ba319b5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits>
4674ba319b5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4684ba319b5SDimitry Andricbasic_istream<_CharT, _Traits>&
4694ba319b5SDimitry Andric__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
4707a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
4717a984708SDavid Chisnall    try
4727a984708SDavid Chisnall    {
4737a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
4744ba319b5SDimitry Andric        typename basic_istream<_CharT, _Traits>::sentry __s(__is);
4757a984708SDavid Chisnall        if (__s)
4767a984708SDavid Chisnall        {
4774ba319b5SDimitry Andric            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
4784ba319b5SDimitry Andric            typedef num_get<_CharT, _Ip> _Fp;
4797a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
4804ba319b5SDimitry Andric            long __temp;
4814ba319b5SDimitry Andric            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __temp);
4824ba319b5SDimitry Andric            if (__temp < numeric_limits<_Tp>::min())
4834ba319b5SDimitry Andric            {
4844ba319b5SDimitry Andric                __err |= ios_base::failbit;
4854ba319b5SDimitry Andric                __n = numeric_limits<_Tp>::min();
4864ba319b5SDimitry Andric            }
4874ba319b5SDimitry Andric            else if (__temp > numeric_limits<_Tp>::max())
4884ba319b5SDimitry Andric            {
4894ba319b5SDimitry Andric                __err |= ios_base::failbit;
4904ba319b5SDimitry Andric                __n = numeric_limits<_Tp>::max();
4914ba319b5SDimitry Andric            }
4924ba319b5SDimitry Andric            else
4934ba319b5SDimitry Andric                __n = static_cast<_Tp>(__temp);
4944ba319b5SDimitry Andric            __is.setstate(__err);
4957a984708SDavid Chisnall        }
4967a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
4977a984708SDavid Chisnall    }
4987a984708SDavid Chisnall    catch (...)
4997a984708SDavid Chisnall    {
5004ba319b5SDimitry Andric        __is.__set_badbit_and_consider_rethrow();
5017a984708SDavid Chisnall    }
5027a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
5034ba319b5SDimitry Andric    return __is;
5047a984708SDavid Chisnall}
5057a984708SDavid Chisnall
5067a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
5077a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
5087a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(short& __n)
5097a984708SDavid Chisnall{
5104ba319b5SDimitry Andric    return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
5117a984708SDavid Chisnall}
5127a984708SDavid Chisnall
5137a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
5147a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
5157a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(int& __n)
5167a984708SDavid Chisnall{
5174ba319b5SDimitry Andric    return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
5187a984708SDavid Chisnall}
5197a984708SDavid Chisnall
5207a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
521*b5893f02SDimitry Andric_LIBCPP_INLINE_VISIBILITY
5227a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
523*b5893f02SDimitry Andric__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
5247a984708SDavid Chisnall{
5257a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
5267a984708SDavid Chisnall    try
5277a984708SDavid Chisnall    {
5287a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
5297a984708SDavid Chisnall        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
5307a984708SDavid Chisnall        if (__sen)
5317a984708SDavid Chisnall        {
532*b5893f02SDimitry Andric            auto __s = __p;
5337a984708SDavid Chisnall            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
5347a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
535*b5893f02SDimitry Andric            while (__s != __p + (__n-1))
5367a984708SDavid Chisnall            {
5377a984708SDavid Chisnall                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
5387a984708SDavid Chisnall                if (_Traits::eq_int_type(__i, _Traits::eof()))
5397a984708SDavid Chisnall                {
5407a984708SDavid Chisnall                   __err |= ios_base::eofbit;
5417a984708SDavid Chisnall                   break;
5427a984708SDavid Chisnall                }
5437a984708SDavid Chisnall                _CharT __ch = _Traits::to_char_type(__i);
5447a984708SDavid Chisnall                if (__ct.is(__ct.space, __ch))
5457a984708SDavid Chisnall                    break;
5467a984708SDavid Chisnall                *__s++ = __ch;
5477a984708SDavid Chisnall                 __is.rdbuf()->sbumpc();
5487a984708SDavid Chisnall            }
5497a984708SDavid Chisnall            *__s = _CharT();
5507a984708SDavid Chisnall            __is.width(0);
551*b5893f02SDimitry Andric            if (__s == __p)
5527a984708SDavid Chisnall               __err |= ios_base::failbit;
5537a984708SDavid Chisnall            __is.setstate(__err);
5547a984708SDavid Chisnall        }
5557a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
5567a984708SDavid Chisnall    }
5577a984708SDavid Chisnall    catch (...)
5587a984708SDavid Chisnall    {
5597a984708SDavid Chisnall        __is.__set_badbit_and_consider_rethrow();
5607a984708SDavid Chisnall    }
5617a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
5627a984708SDavid Chisnall    return __is;
5637a984708SDavid Chisnall}
5647a984708SDavid Chisnall
565*b5893f02SDimitry Andric#if _LIBCPP_STD_VER > 17
566*b5893f02SDimitry Andric
567*b5893f02SDimitry Andrictemplate<class _CharT, class _Traits, size_t _Np>
568*b5893f02SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
569*b5893f02SDimitry Andricbasic_istream<_CharT, _Traits>&
570*b5893f02SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
571*b5893f02SDimitry Andric{
572*b5893f02SDimitry Andric    auto __n = _Np;
573*b5893f02SDimitry Andric    if (__is.width() > 0)
574*b5893f02SDimitry Andric        __n = _VSTD::min(size_t(__is.width()), _Np);
575*b5893f02SDimitry Andric    return _VSTD::__input_c_string(__is, __buf, __n);
576*b5893f02SDimitry Andric}
577*b5893f02SDimitry Andric
578*b5893f02SDimitry Andrictemplate<class _Traits, size_t _Np>
579*b5893f02SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
580*b5893f02SDimitry Andricbasic_istream<char, _Traits>&
581*b5893f02SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
582*b5893f02SDimitry Andric{
583*b5893f02SDimitry Andric    return __is >> (char(&)[_Np])__buf;
584*b5893f02SDimitry Andric}
585*b5893f02SDimitry Andric
586*b5893f02SDimitry Andrictemplate<class _Traits, size_t _Np>
587*b5893f02SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
588*b5893f02SDimitry Andricbasic_istream<char, _Traits>&
589*b5893f02SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
590*b5893f02SDimitry Andric{
591*b5893f02SDimitry Andric    return __is >> (char(&)[_Np])__buf;
592*b5893f02SDimitry Andric}
593*b5893f02SDimitry Andric
594*b5893f02SDimitry Andric#else
595*b5893f02SDimitry Andric
596*b5893f02SDimitry Andrictemplate<class _CharT, class _Traits>
597*b5893f02SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
598*b5893f02SDimitry Andricbasic_istream<_CharT, _Traits>&
599*b5893f02SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
600*b5893f02SDimitry Andric{
601*b5893f02SDimitry Andric    streamsize __n = __is.width();
602*b5893f02SDimitry Andric    if (__n <= 0)
603*b5893f02SDimitry Andric        __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
604*b5893f02SDimitry Andric    return _VSTD::__input_c_string(__is, __s, size_t(__n));
605*b5893f02SDimitry Andric}
606*b5893f02SDimitry Andric
6077a984708SDavid Chisnalltemplate<class _Traits>
6087a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
6097a984708SDavid Chisnallbasic_istream<char, _Traits>&
6107a984708SDavid Chisnalloperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
6117a984708SDavid Chisnall{
6127a984708SDavid Chisnall    return __is >> (char*)__s;
6137a984708SDavid Chisnall}
6147a984708SDavid Chisnall
6157a984708SDavid Chisnalltemplate<class _Traits>
6167a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
6177a984708SDavid Chisnallbasic_istream<char, _Traits>&
6187a984708SDavid Chisnalloperator>>(basic_istream<char, _Traits>& __is, signed char* __s)
6197a984708SDavid Chisnall{
6207a984708SDavid Chisnall    return __is >> (char*)__s;
6217a984708SDavid Chisnall}
6227a984708SDavid Chisnall
623*b5893f02SDimitry Andric#endif  // _LIBCPP_STD_VER > 17
624*b5893f02SDimitry Andric
6257a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
6267a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
6277a984708SDavid Chisnalloperator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
6287a984708SDavid Chisnall{
6297a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
6307a984708SDavid Chisnall    try
6317a984708SDavid Chisnall    {
6327a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
6337a984708SDavid Chisnall        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
6347a984708SDavid Chisnall        if (__sen)
6357a984708SDavid Chisnall        {
6367a984708SDavid Chisnall            typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
6377a984708SDavid Chisnall            if (_Traits::eq_int_type(__i, _Traits::eof()))
6387a984708SDavid Chisnall                __is.setstate(ios_base::eofbit | ios_base::failbit);
6397a984708SDavid Chisnall            else
6407a984708SDavid Chisnall                __c = _Traits::to_char_type(__i);
6417a984708SDavid Chisnall        }
6427a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
6437a984708SDavid Chisnall    }
6447a984708SDavid Chisnall    catch (...)
6457a984708SDavid Chisnall    {
6467a984708SDavid Chisnall        __is.__set_badbit_and_consider_rethrow();
6477a984708SDavid Chisnall    }
6487a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
6497a984708SDavid Chisnall    return __is;
6507a984708SDavid Chisnall}
6517a984708SDavid Chisnall
6527a984708SDavid Chisnalltemplate<class _Traits>
6537a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
6547a984708SDavid Chisnallbasic_istream<char, _Traits>&
6557a984708SDavid Chisnalloperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
6567a984708SDavid Chisnall{
6577a984708SDavid Chisnall    return __is >> (char&)__c;
6587a984708SDavid Chisnall}
6597a984708SDavid Chisnall
6607a984708SDavid Chisnalltemplate<class _Traits>
6617a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
6627a984708SDavid Chisnallbasic_istream<char, _Traits>&
6637a984708SDavid Chisnalloperator>>(basic_istream<char, _Traits>& __is, signed char& __c)
6647a984708SDavid Chisnall{
6657a984708SDavid Chisnall    return __is >> (char&)__c;
6667a984708SDavid Chisnall}
6677a984708SDavid Chisnall
6687a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
6697a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
6707a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
6717a984708SDavid Chisnall{
6727a984708SDavid Chisnall    __gc_ = 0;
6737a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
6747a984708SDavid Chisnall    try
6757a984708SDavid Chisnall    {
6767a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
6777a984708SDavid Chisnall        sentry __s(*this, true);
6787a984708SDavid Chisnall        if (__s)
6797a984708SDavid Chisnall        {
6807a984708SDavid Chisnall            if (__sb)
6817a984708SDavid Chisnall            {
6827a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
6837a984708SDavid Chisnall                try
6847a984708SDavid Chisnall                {
6857a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
6867a984708SDavid Chisnall                    ios_base::iostate __err = ios_base::goodbit;
6877a984708SDavid Chisnall                    while (true)
6887a984708SDavid Chisnall                    {
6897a984708SDavid Chisnall                        typename traits_type::int_type __i = this->rdbuf()->sgetc();
6907a984708SDavid Chisnall                        if (traits_type::eq_int_type(__i, _Traits::eof()))
6917a984708SDavid Chisnall                        {
6927a984708SDavid Chisnall                           __err |= ios_base::eofbit;
6937a984708SDavid Chisnall                           break;
6947a984708SDavid Chisnall                        }
6957a984708SDavid Chisnall                        if (traits_type::eq_int_type(
6967a984708SDavid Chisnall                                __sb->sputc(traits_type::to_char_type(__i)),
6977a984708SDavid Chisnall                                traits_type::eof()))
6987a984708SDavid Chisnall                            break;
6997a984708SDavid Chisnall                        ++__gc_;
7007a984708SDavid Chisnall                        this->rdbuf()->sbumpc();
7017a984708SDavid Chisnall                    }
7027a984708SDavid Chisnall                    if (__gc_ == 0)
7037a984708SDavid Chisnall                       __err |= ios_base::failbit;
7047a984708SDavid Chisnall                    this->setstate(__err);
7057a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
7067a984708SDavid Chisnall                }
7077a984708SDavid Chisnall                catch (...)
7087a984708SDavid Chisnall                {
7097a984708SDavid Chisnall                    if (__gc_ == 0)
7107a984708SDavid Chisnall                        this->__set_failbit_and_consider_rethrow();
7117a984708SDavid Chisnall                }
7127a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
7137a984708SDavid Chisnall            }
7147a984708SDavid Chisnall            else
7157a984708SDavid Chisnall                this->setstate(ios_base::failbit);
7167a984708SDavid Chisnall        }
7177a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
7187a984708SDavid Chisnall    }
7197a984708SDavid Chisnall    catch (...)
7207a984708SDavid Chisnall    {
7217a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
7227a984708SDavid Chisnall    }
7237a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
7247a984708SDavid Chisnall    return *this;
7257a984708SDavid Chisnall}
7267a984708SDavid Chisnall
7277a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
7287a984708SDavid Chisnalltypename basic_istream<_CharT, _Traits>::int_type
7297a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::get()
7307a984708SDavid Chisnall{
7317a984708SDavid Chisnall    __gc_ = 0;
7327a984708SDavid Chisnall    int_type __r = traits_type::eof();
7337a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
7347a984708SDavid Chisnall    try
7357a984708SDavid Chisnall    {
7367a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
7377a984708SDavid Chisnall        sentry __s(*this, true);
7387a984708SDavid Chisnall        if (__s)
7397a984708SDavid Chisnall        {
7407a984708SDavid Chisnall            __r = this->rdbuf()->sbumpc();
7417a984708SDavid Chisnall            if (traits_type::eq_int_type(__r, traits_type::eof()))
7427a984708SDavid Chisnall               this->setstate(ios_base::failbit | ios_base::eofbit);
7437a984708SDavid Chisnall            else
7447a984708SDavid Chisnall                __gc_ = 1;
7457a984708SDavid Chisnall        }
7467a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
7477a984708SDavid Chisnall    }
7487a984708SDavid Chisnall    catch (...)
7497a984708SDavid Chisnall    {
7507a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
7517a984708SDavid Chisnall    }
7527a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
7537a984708SDavid Chisnall    return __r;
7547a984708SDavid Chisnall}
7557a984708SDavid Chisnall
7567a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
7577a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
7587a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
7597a984708SDavid Chisnall{
7607a984708SDavid Chisnall    __gc_ = 0;
7617a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
7627a984708SDavid Chisnall    try
7637a984708SDavid Chisnall    {
7647a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
7657a984708SDavid Chisnall        sentry __sen(*this, true);
7667a984708SDavid Chisnall        if (__sen)
7677a984708SDavid Chisnall        {
7687a984708SDavid Chisnall            if (__n > 0)
7697a984708SDavid Chisnall            {
7707a984708SDavid Chisnall                ios_base::iostate __err = ios_base::goodbit;
7717a984708SDavid Chisnall                while (__gc_ < __n-1)
7727a984708SDavid Chisnall                {
7737a984708SDavid Chisnall                    int_type __i = this->rdbuf()->sgetc();
7747a984708SDavid Chisnall                    if (traits_type::eq_int_type(__i, traits_type::eof()))
7757a984708SDavid Chisnall                    {
7767a984708SDavid Chisnall                       __err |= ios_base::eofbit;
7777a984708SDavid Chisnall                       break;
7787a984708SDavid Chisnall                    }
7797a984708SDavid Chisnall                    char_type __ch = traits_type::to_char_type(__i);
7807a984708SDavid Chisnall                    if (traits_type::eq(__ch, __dlm))
7817a984708SDavid Chisnall                        break;
7827a984708SDavid Chisnall                    *__s++ = __ch;
7837a984708SDavid Chisnall                    ++__gc_;
7847a984708SDavid Chisnall                     this->rdbuf()->sbumpc();
7857a984708SDavid Chisnall                }
7867a984708SDavid Chisnall                if (__gc_ == 0)
7877a984708SDavid Chisnall                   __err |= ios_base::failbit;
7887a984708SDavid Chisnall                this->setstate(__err);
7897a984708SDavid Chisnall            }
7907a984708SDavid Chisnall            else
7917a984708SDavid Chisnall                this->setstate(ios_base::failbit);
7927a984708SDavid Chisnall        }
7934ba319b5SDimitry Andric        if (__n > 0)
7944ba319b5SDimitry Andric            *__s = char_type();
7957a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
7967a984708SDavid Chisnall    }
7977a984708SDavid Chisnall    catch (...)
7987a984708SDavid Chisnall    {
7994ba319b5SDimitry Andric        if (__n > 0)
8004ba319b5SDimitry Andric            *__s = char_type();
8017a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
8027a984708SDavid Chisnall    }
8037a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
8047a984708SDavid Chisnall    return *this;
8057a984708SDavid Chisnall}
8067a984708SDavid Chisnall
8077a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
8087a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
8097a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
8107a984708SDavid Chisnall                                    char_type __dlm)
8117a984708SDavid Chisnall{
8127a984708SDavid Chisnall    __gc_ = 0;
8137a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
8147a984708SDavid Chisnall    try
8157a984708SDavid Chisnall    {
8167a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
8177a984708SDavid Chisnall        sentry __sen(*this, true);
8187a984708SDavid Chisnall        if (__sen)
8197a984708SDavid Chisnall        {
8207a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
8217a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
8227a984708SDavid Chisnall            try
8237a984708SDavid Chisnall            {
8247a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
8257a984708SDavid Chisnall                while (true)
8267a984708SDavid Chisnall                {
8277a984708SDavid Chisnall                    typename traits_type::int_type __i = this->rdbuf()->sgetc();
8287a984708SDavid Chisnall                    if (traits_type::eq_int_type(__i, traits_type::eof()))
8297a984708SDavid Chisnall                    {
8307a984708SDavid Chisnall                       __err |= ios_base::eofbit;
8317a984708SDavid Chisnall                       break;
8327a984708SDavid Chisnall                    }
8337a984708SDavid Chisnall                    char_type __ch = traits_type::to_char_type(__i);
8347a984708SDavid Chisnall                    if (traits_type::eq(__ch, __dlm))
8357a984708SDavid Chisnall                        break;
8367a984708SDavid Chisnall                    if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
8377a984708SDavid Chisnall                        break;
8387a984708SDavid Chisnall                    ++__gc_;
8397a984708SDavid Chisnall                    this->rdbuf()->sbumpc();
8407a984708SDavid Chisnall                }
8417a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
8427a984708SDavid Chisnall            }
8437a984708SDavid Chisnall            catch (...)
8447a984708SDavid Chisnall            {
8457a984708SDavid Chisnall            }
8467a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
8477a984708SDavid Chisnall            if (__gc_ == 0)
8487a984708SDavid Chisnall               __err |= ios_base::failbit;
8497a984708SDavid Chisnall            this->setstate(__err);
8507a984708SDavid Chisnall        }
8517a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
8527a984708SDavid Chisnall    }
8537a984708SDavid Chisnall    catch (...)
8547a984708SDavid Chisnall    {
8557a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
8567a984708SDavid Chisnall    }
8577a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
8587a984708SDavid Chisnall    return *this;
8597a984708SDavid Chisnall}
8607a984708SDavid Chisnall
8617a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
8627a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
8637a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
8647a984708SDavid Chisnall{
8657a984708SDavid Chisnall    __gc_ = 0;
8667a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
8677a984708SDavid Chisnall    try
8687a984708SDavid Chisnall    {
8697a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
8707a984708SDavid Chisnall        sentry __sen(*this, true);
8717a984708SDavid Chisnall        if (__sen)
8727a984708SDavid Chisnall        {
8737a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
8747a984708SDavid Chisnall            while (true)
8757a984708SDavid Chisnall            {
8767a984708SDavid Chisnall                typename traits_type::int_type __i = this->rdbuf()->sgetc();
8777a984708SDavid Chisnall                if (traits_type::eq_int_type(__i, traits_type::eof()))
8787a984708SDavid Chisnall                {
8797a984708SDavid Chisnall                   __err |= ios_base::eofbit;
8807a984708SDavid Chisnall                   break;
8817a984708SDavid Chisnall                }
8827a984708SDavid Chisnall                char_type __ch = traits_type::to_char_type(__i);
8837a984708SDavid Chisnall                if (traits_type::eq(__ch, __dlm))
8847a984708SDavid Chisnall                {
8857a984708SDavid Chisnall                    this->rdbuf()->sbumpc();
8867a984708SDavid Chisnall                    ++__gc_;
8877a984708SDavid Chisnall                    break;
8887a984708SDavid Chisnall                }
8897a984708SDavid Chisnall                if (__gc_ >= __n-1)
8907a984708SDavid Chisnall                {
8917a984708SDavid Chisnall                    __err |= ios_base::failbit;
8927a984708SDavid Chisnall                    break;
8937a984708SDavid Chisnall                }
8947a984708SDavid Chisnall                *__s++ = __ch;
8957a984708SDavid Chisnall                this->rdbuf()->sbumpc();
8967a984708SDavid Chisnall                ++__gc_;
8977a984708SDavid Chisnall            }
8987a984708SDavid Chisnall            if (__gc_ == 0)
8997a984708SDavid Chisnall               __err |= ios_base::failbit;
9007a984708SDavid Chisnall            this->setstate(__err);
9017a984708SDavid Chisnall        }
902b2c7081bSDimitry Andric        if (__n > 0)
903b2c7081bSDimitry Andric            *__s = char_type();
9047a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
9057a984708SDavid Chisnall    }
9067a984708SDavid Chisnall    catch (...)
9077a984708SDavid Chisnall    {
908b2c7081bSDimitry Andric        if (__n > 0)
909b2c7081bSDimitry Andric            *__s = char_type();
9107a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
9117a984708SDavid Chisnall    }
9127a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
9137a984708SDavid Chisnall    return *this;
9147a984708SDavid Chisnall}
9157a984708SDavid Chisnall
9167a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
9177a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
9187a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
9197a984708SDavid Chisnall{
9207a984708SDavid Chisnall    __gc_ = 0;
9217a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
9227a984708SDavid Chisnall    try
9237a984708SDavid Chisnall    {
9247a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
9257a984708SDavid Chisnall        sentry __sen(*this, true);
9267a984708SDavid Chisnall        if (__sen)
9277a984708SDavid Chisnall        {
9287a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
9297a984708SDavid Chisnall            if (__n == numeric_limits<streamsize>::max())
9307a984708SDavid Chisnall            {
9317a984708SDavid Chisnall                while (true)
9327a984708SDavid Chisnall                {
9337a984708SDavid Chisnall                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
9347a984708SDavid Chisnall                    if (traits_type::eq_int_type(__i, traits_type::eof()))
9357a984708SDavid Chisnall                    {
9367a984708SDavid Chisnall                       __err |= ios_base::eofbit;
9377a984708SDavid Chisnall                       break;
9387a984708SDavid Chisnall                    }
9397a984708SDavid Chisnall                    ++__gc_;
9404bab9fd9SDavid Chisnall                    if (traits_type::eq_int_type(__i, __dlm))
9417a984708SDavid Chisnall                        break;
9427a984708SDavid Chisnall                }
9437a984708SDavid Chisnall            }
9447a984708SDavid Chisnall            else
9457a984708SDavid Chisnall            {
9467a984708SDavid Chisnall                while (__gc_ < __n)
9477a984708SDavid Chisnall                {
9487a984708SDavid Chisnall                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
9497a984708SDavid Chisnall                    if (traits_type::eq_int_type(__i, traits_type::eof()))
9507a984708SDavid Chisnall                    {
9517a984708SDavid Chisnall                       __err |= ios_base::eofbit;
9527a984708SDavid Chisnall                       break;
9537a984708SDavid Chisnall                    }
9547a984708SDavid Chisnall                    ++__gc_;
9554bab9fd9SDavid Chisnall                    if (traits_type::eq_int_type(__i, __dlm))
9567a984708SDavid Chisnall                        break;
9577a984708SDavid Chisnall                }
9587a984708SDavid Chisnall            }
9597a984708SDavid Chisnall            this->setstate(__err);
9607a984708SDavid Chisnall        }
9617a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
9627a984708SDavid Chisnall    }
9637a984708SDavid Chisnall    catch (...)
9647a984708SDavid Chisnall    {
9657a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
9667a984708SDavid Chisnall    }
9677a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
9687a984708SDavid Chisnall    return *this;
9697a984708SDavid Chisnall}
9707a984708SDavid Chisnall
9717a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
9727a984708SDavid Chisnalltypename basic_istream<_CharT, _Traits>::int_type
9737a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::peek()
9747a984708SDavid Chisnall{
9757a984708SDavid Chisnall    __gc_ = 0;
9767a984708SDavid Chisnall    int_type __r = traits_type::eof();
9777a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
9787a984708SDavid Chisnall    try
9797a984708SDavid Chisnall    {
9807a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
9817a984708SDavid Chisnall        sentry __sen(*this, true);
9827a984708SDavid Chisnall        if (__sen)
9831e0896acSDavid Chisnall        {
9847a984708SDavid Chisnall            __r = this->rdbuf()->sgetc();
9851e0896acSDavid Chisnall            if (traits_type::eq_int_type(__r, traits_type::eof()))
9861e0896acSDavid Chisnall                this->setstate(ios_base::eofbit);
9871e0896acSDavid Chisnall        }
9887a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
9897a984708SDavid Chisnall    }
9907a984708SDavid Chisnall    catch (...)
9917a984708SDavid Chisnall    {
9927a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
9937a984708SDavid Chisnall    }
9947a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
9957a984708SDavid Chisnall    return __r;
9967a984708SDavid Chisnall}
9977a984708SDavid Chisnall
9987a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
9997a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
10007a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
10017a984708SDavid Chisnall{
10027a984708SDavid Chisnall    __gc_ = 0;
10037a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
10047a984708SDavid Chisnall    try
10057a984708SDavid Chisnall    {
10067a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
10077a984708SDavid Chisnall        sentry __sen(*this, true);
10087a984708SDavid Chisnall        if (__sen)
10097a984708SDavid Chisnall        {
10101bf9f7c1SDimitry Andric            __gc_ = this->rdbuf()->sgetn(__s, __n);
10111bf9f7c1SDimitry Andric            if (__gc_ != __n)
10127a984708SDavid Chisnall                this->setstate(ios_base::failbit | ios_base::eofbit);
10137a984708SDavid Chisnall        }
10147a984708SDavid Chisnall        else
10157a984708SDavid Chisnall            this->setstate(ios_base::failbit);
10167a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
10177a984708SDavid Chisnall    }
10187a984708SDavid Chisnall    catch (...)
10197a984708SDavid Chisnall    {
10207a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
10217a984708SDavid Chisnall    }
10227a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
10237a984708SDavid Chisnall    return *this;
10247a984708SDavid Chisnall}
10257a984708SDavid Chisnall
10267a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
10277a984708SDavid Chisnallstreamsize
10287a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
10297a984708SDavid Chisnall{
1030cfdf2879SDavid Chisnall    __gc_ = 0;
10317c82a1ecSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
10327c82a1ecSDimitry Andric    try
10337c82a1ecSDimitry Andric    {
10347c82a1ecSDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
10357c82a1ecSDimitry Andric        sentry __sen(*this, true);
10367c82a1ecSDimitry Andric        if (__sen)
10377c82a1ecSDimitry Andric        {
10387a984708SDavid Chisnall            streamsize __c = this->rdbuf()->in_avail();
10397a984708SDavid Chisnall            switch (__c)
10407a984708SDavid Chisnall            {
10417a984708SDavid Chisnall            case -1:
10427a984708SDavid Chisnall                this->setstate(ios_base::eofbit);
10437a984708SDavid Chisnall                break;
10447a984708SDavid Chisnall            case 0:
10457a984708SDavid Chisnall                break;
10467a984708SDavid Chisnall            default:
10477a984708SDavid Chisnall                read(__s, _VSTD::min(__c, __n));
10487a984708SDavid Chisnall                break;
10497a984708SDavid Chisnall            }
10507c82a1ecSDimitry Andric        }
10517c82a1ecSDimitry Andric        else
10527c82a1ecSDimitry Andric            this->setstate(ios_base::failbit);
10537c82a1ecSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
10547c82a1ecSDimitry Andric    }
10557c82a1ecSDimitry Andric    catch (...)
10567c82a1ecSDimitry Andric    {
10577c82a1ecSDimitry Andric        this->__set_badbit_and_consider_rethrow();
10587c82a1ecSDimitry Andric    }
10597c82a1ecSDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
10607a984708SDavid Chisnall    return __gc_;
10617a984708SDavid Chisnall}
10627a984708SDavid Chisnall
10637a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
10647a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
10657a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::putback(char_type __c)
10667a984708SDavid Chisnall{
10677a984708SDavid Chisnall    __gc_ = 0;
10687a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
10697a984708SDavid Chisnall    try
10707a984708SDavid Chisnall    {
10717a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
1072936e9439SDimitry Andric        this->clear(this->rdstate() & ~ios_base::eofbit);
10737a984708SDavid Chisnall        sentry __sen(*this, true);
10747a984708SDavid Chisnall        if (__sen)
10757a984708SDavid Chisnall        {
10767a984708SDavid Chisnall            if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
10777a984708SDavid Chisnall                this->setstate(ios_base::badbit);
10787a984708SDavid Chisnall        }
10797a984708SDavid Chisnall        else
10807a984708SDavid Chisnall            this->setstate(ios_base::failbit);
10817a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
10827a984708SDavid Chisnall    }
10837a984708SDavid Chisnall    catch (...)
10847a984708SDavid Chisnall    {
10857a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
10867a984708SDavid Chisnall    }
10877a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
10887a984708SDavid Chisnall    return *this;
10897a984708SDavid Chisnall}
10907a984708SDavid Chisnall
10917a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
10927a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
10937a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::unget()
10947a984708SDavid Chisnall{
10957a984708SDavid Chisnall    __gc_ = 0;
10967a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
10977a984708SDavid Chisnall    try
10987a984708SDavid Chisnall    {
10997a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
1100936e9439SDimitry Andric        this->clear(this->rdstate() & ~ios_base::eofbit);
11017a984708SDavid Chisnall        sentry __sen(*this, true);
11027a984708SDavid Chisnall        if (__sen)
11037a984708SDavid Chisnall        {
11047a984708SDavid Chisnall            if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
11057a984708SDavid Chisnall                this->setstate(ios_base::badbit);
11067a984708SDavid Chisnall        }
11077a984708SDavid Chisnall        else
11087a984708SDavid Chisnall            this->setstate(ios_base::failbit);
11097a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
11107a984708SDavid Chisnall    }
11117a984708SDavid Chisnall    catch (...)
11127a984708SDavid Chisnall    {
11137a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
11147a984708SDavid Chisnall    }
11157a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
11167a984708SDavid Chisnall    return *this;
11177a984708SDavid Chisnall}
11187a984708SDavid Chisnall
11197a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
11207a984708SDavid Chisnallint
11217a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::sync()
11227a984708SDavid Chisnall{
11237a984708SDavid Chisnall    int __r = 0;
11247a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
11257a984708SDavid Chisnall    try
11267a984708SDavid Chisnall    {
11277a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
11287a984708SDavid Chisnall        sentry __sen(*this, true);
11297a984708SDavid Chisnall        if (__sen)
11307a984708SDavid Chisnall        {
11317a984708SDavid Chisnall            if (this->rdbuf() == 0)
11327a984708SDavid Chisnall                return -1;
11337a984708SDavid Chisnall            if (this->rdbuf()->pubsync() == -1)
11347a984708SDavid Chisnall            {
11357a984708SDavid Chisnall                this->setstate(ios_base::badbit);
11367a984708SDavid Chisnall                return -1;
11377a984708SDavid Chisnall            }
11387a984708SDavid Chisnall        }
11397a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
11407a984708SDavid Chisnall    }
11417a984708SDavid Chisnall    catch (...)
11427a984708SDavid Chisnall    {
11437a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
11447a984708SDavid Chisnall    }
11457a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
11467a984708SDavid Chisnall    return __r;
11477a984708SDavid Chisnall}
11487a984708SDavid Chisnall
11497a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
11507a984708SDavid Chisnalltypename basic_istream<_CharT, _Traits>::pos_type
11517a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::tellg()
11527a984708SDavid Chisnall{
11537a984708SDavid Chisnall    pos_type __r(-1);
11547a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
11557a984708SDavid Chisnall    try
11567a984708SDavid Chisnall    {
11577a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
11587a984708SDavid Chisnall        sentry __sen(*this, true);
11597a984708SDavid Chisnall        if (__sen)
11607a984708SDavid Chisnall            __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
11617a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
11627a984708SDavid Chisnall    }
11637a984708SDavid Chisnall    catch (...)
11647a984708SDavid Chisnall    {
11657a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
11667a984708SDavid Chisnall    }
11677a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
11687a984708SDavid Chisnall    return __r;
11697a984708SDavid Chisnall}
11707a984708SDavid Chisnall
11717a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
11727a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
11737a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::seekg(pos_type __pos)
11747a984708SDavid Chisnall{
11757a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
11767a984708SDavid Chisnall    try
11777a984708SDavid Chisnall    {
11787a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
1179936e9439SDimitry Andric        this->clear(this->rdstate() & ~ios_base::eofbit);
11807a984708SDavid Chisnall        sentry __sen(*this, true);
11817a984708SDavid Chisnall        if (__sen)
11824f7ab58eSDimitry Andric        {
11837a984708SDavid Chisnall            if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
11847a984708SDavid Chisnall                this->setstate(ios_base::failbit);
11854f7ab58eSDimitry Andric        }
11867a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
11877a984708SDavid Chisnall    }
11887a984708SDavid Chisnall    catch (...)
11897a984708SDavid Chisnall    {
11907a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
11917a984708SDavid Chisnall    }
11927a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
11937a984708SDavid Chisnall    return *this;
11947a984708SDavid Chisnall}
11957a984708SDavid Chisnall
11967a984708SDavid Chisnalltemplate<class _CharT, class _Traits>
11977a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
11987a984708SDavid Chisnallbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
11997a984708SDavid Chisnall{
12007a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
12017a984708SDavid Chisnall    try
12027a984708SDavid Chisnall    {
12037a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
12049729cf09SDimitry Andric        this->clear(this->rdstate() & ~ios_base::eofbit);
12057a984708SDavid Chisnall        sentry __sen(*this, true);
12067a984708SDavid Chisnall        if (__sen)
12074f7ab58eSDimitry Andric        {
12084f7ab58eSDimitry Andric            if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
12094f7ab58eSDimitry Andric                this->setstate(ios_base::failbit);
12104f7ab58eSDimitry Andric        }
12117a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
12127a984708SDavid Chisnall    }
12137a984708SDavid Chisnall    catch (...)
12147a984708SDavid Chisnall    {
12157a984708SDavid Chisnall        this->__set_badbit_and_consider_rethrow();
12167a984708SDavid Chisnall    }
12177a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
12187a984708SDavid Chisnall    return *this;
12197a984708SDavid Chisnall}
12207a984708SDavid Chisnall
12217a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12227a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
12237a984708SDavid Chisnallws(basic_istream<_CharT, _Traits>& __is)
12247a984708SDavid Chisnall{
12257a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
12267a984708SDavid Chisnall    try
12277a984708SDavid Chisnall    {
12287a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
12297a984708SDavid Chisnall        typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
12307a984708SDavid Chisnall        if (__sen)
12317a984708SDavid Chisnall        {
12327a984708SDavid Chisnall            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
12337a984708SDavid Chisnall            while (true)
12347a984708SDavid Chisnall            {
12357a984708SDavid Chisnall                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
12367a984708SDavid Chisnall                if (_Traits::eq_int_type(__i, _Traits::eof()))
12377a984708SDavid Chisnall                {
12387a984708SDavid Chisnall                   __is.setstate(ios_base::eofbit);
12397a984708SDavid Chisnall                   break;
12407a984708SDavid Chisnall                }
12417a984708SDavid Chisnall                if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
12427a984708SDavid Chisnall                    break;
12437a984708SDavid Chisnall                __is.rdbuf()->sbumpc();
12447a984708SDavid Chisnall            }
12457a984708SDavid Chisnall        }
12467a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
12477a984708SDavid Chisnall    }
12487a984708SDavid Chisnall    catch (...)
12497a984708SDavid Chisnall    {
12507a984708SDavid Chisnall        __is.__set_badbit_and_consider_rethrow();
12517a984708SDavid Chisnall    }
12527a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
12537a984708SDavid Chisnall    return __is;
12547a984708SDavid Chisnall}
12557a984708SDavid Chisnall
1256540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
12577a984708SDavid Chisnall
12587a984708SDavid Chisnalltemplate <class _CharT, class _Traits, class _Tp>
12597a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
12607a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
1261aed8d94eSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
12627a984708SDavid Chisnall{
1263aed8d94eSDimitry Andric    __is >> _VSTD::forward<_Tp>(__x);
12647a984708SDavid Chisnall    return __is;
12657a984708SDavid Chisnall}
12667a984708SDavid Chisnall
1267540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
12687a984708SDavid Chisnall
12697a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
1270aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_iostream
12717a984708SDavid Chisnall    : public basic_istream<_CharT, _Traits>,
12727a984708SDavid Chisnall      public basic_ostream<_CharT, _Traits>
12737a984708SDavid Chisnall{
12747a984708SDavid Chisnallpublic:
12757a984708SDavid Chisnall    // types:
12767a984708SDavid Chisnall    typedef _CharT                         char_type;
12777a984708SDavid Chisnall    typedef _Traits                        traits_type;
12787a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
12797a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
12807a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
12817a984708SDavid Chisnall
12827a984708SDavid Chisnall    // constructor/destructor
1283*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1284aed8d94eSDimitry Andric    explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1285aed8d94eSDimitry Andric      : basic_istream<_CharT, _Traits>(__sb)
1286aed8d94eSDimitry Andric    {}
1287aed8d94eSDimitry Andric
12887a984708SDavid Chisnall    virtual ~basic_iostream();
12897a984708SDavid Chisnallprotected:
1290540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
1291aed8d94eSDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
12927a984708SDavid Chisnall    basic_iostream(basic_iostream&& __rhs);
12937a984708SDavid Chisnall
12947a984708SDavid Chisnall    // assign/swap
1295aed8d94eSDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
12967a984708SDavid Chisnall    basic_iostream& operator=(basic_iostream&& __rhs);
12977a984708SDavid Chisnall#endif
1298*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1299aed8d94eSDimitry Andric    void swap(basic_iostream& __rhs)
1300aed8d94eSDimitry Andric    { basic_istream<char_type, traits_type>::swap(__rhs); }
13017a984708SDavid Chisnallpublic:
13027a984708SDavid Chisnall};
13037a984708SDavid Chisnall
1304540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
13057a984708SDavid Chisnall
13067a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
13077a984708SDavid Chisnallbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
13087a984708SDavid Chisnall    : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
13097a984708SDavid Chisnall{
13107a984708SDavid Chisnall}
13117a984708SDavid Chisnall
13127a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
13137a984708SDavid Chisnallbasic_iostream<_CharT, _Traits>&
13147a984708SDavid Chisnallbasic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
13157a984708SDavid Chisnall{
13167a984708SDavid Chisnall    swap(__rhs);
13177a984708SDavid Chisnall    return *this;
13187a984708SDavid Chisnall}
13197a984708SDavid Chisnall
1320540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
13217a984708SDavid Chisnall
13227a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
13237a984708SDavid Chisnallbasic_iostream<_CharT, _Traits>::~basic_iostream()
13247a984708SDavid Chisnall{
13257a984708SDavid Chisnall}
13267a984708SDavid Chisnall
13277a984708SDavid Chisnalltemplate<class _CharT, class _Traits, class _Allocator>
13287a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
13297a984708SDavid Chisnalloperator>>(basic_istream<_CharT, _Traits>& __is,
13307a984708SDavid Chisnall           basic_string<_CharT, _Traits, _Allocator>& __str)
13317a984708SDavid Chisnall{
13327a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
13337a984708SDavid Chisnall    try
13347a984708SDavid Chisnall    {
13357a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
13367a984708SDavid Chisnall        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
13377a984708SDavid Chisnall        if (__sen)
13387a984708SDavid Chisnall        {
13397a984708SDavid Chisnall            __str.clear();
13407a984708SDavid Chisnall            streamsize __n = __is.width();
13417a984708SDavid Chisnall            if (__n <= 0)
13427a984708SDavid Chisnall                __n = __str.max_size();
13437a984708SDavid Chisnall            if (__n <= 0)
13447a984708SDavid Chisnall                __n = numeric_limits<streamsize>::max();
13457a984708SDavid Chisnall            streamsize __c = 0;
13467a984708SDavid Chisnall            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
13477a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
13487a984708SDavid Chisnall            while (__c < __n)
13497a984708SDavid Chisnall            {
13507a984708SDavid Chisnall                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
13517a984708SDavid Chisnall                if (_Traits::eq_int_type(__i, _Traits::eof()))
13527a984708SDavid Chisnall                {
13537a984708SDavid Chisnall                   __err |= ios_base::eofbit;
13547a984708SDavid Chisnall                   break;
13557a984708SDavid Chisnall                }
13567a984708SDavid Chisnall                _CharT __ch = _Traits::to_char_type(__i);
13577a984708SDavid Chisnall                if (__ct.is(__ct.space, __ch))
13587a984708SDavid Chisnall                    break;
13597a984708SDavid Chisnall                __str.push_back(__ch);
13607a984708SDavid Chisnall                ++__c;
13617a984708SDavid Chisnall                 __is.rdbuf()->sbumpc();
13627a984708SDavid Chisnall            }
13637a984708SDavid Chisnall            __is.width(0);
13647a984708SDavid Chisnall            if (__c == 0)
13657a984708SDavid Chisnall               __err |= ios_base::failbit;
13667a984708SDavid Chisnall            __is.setstate(__err);
13677a984708SDavid Chisnall        }
13687a984708SDavid Chisnall        else
13697a984708SDavid Chisnall            __is.setstate(ios_base::failbit);
13707a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
13717a984708SDavid Chisnall    }
13727a984708SDavid Chisnall    catch (...)
13737a984708SDavid Chisnall    {
13747a984708SDavid Chisnall        __is.__set_badbit_and_consider_rethrow();
13757a984708SDavid Chisnall    }
13767a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
13777a984708SDavid Chisnall    return __is;
13787a984708SDavid Chisnall}
13797a984708SDavid Chisnall
13807a984708SDavid Chisnalltemplate<class _CharT, class _Traits, class _Allocator>
13817a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
13827a984708SDavid Chisnallgetline(basic_istream<_CharT, _Traits>& __is,
13837a984708SDavid Chisnall        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
13847a984708SDavid Chisnall{
13857a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
13867a984708SDavid Chisnall    try
13877a984708SDavid Chisnall    {
13887a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
13897a984708SDavid Chisnall        typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
13907a984708SDavid Chisnall        if (__sen)
13917a984708SDavid Chisnall        {
13927a984708SDavid Chisnall            __str.clear();
13937a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
13947a984708SDavid Chisnall            streamsize __extr = 0;
13957a984708SDavid Chisnall            while (true)
13967a984708SDavid Chisnall            {
13977a984708SDavid Chisnall                typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
13987a984708SDavid Chisnall                if (_Traits::eq_int_type(__i, _Traits::eof()))
13997a984708SDavid Chisnall                {
14007a984708SDavid Chisnall                   __err |= ios_base::eofbit;
14017a984708SDavid Chisnall                   break;
14027a984708SDavid Chisnall                }
14037a984708SDavid Chisnall                ++__extr;
14047a984708SDavid Chisnall                _CharT __ch = _Traits::to_char_type(__i);
14057a984708SDavid Chisnall                if (_Traits::eq(__ch, __dlm))
14067a984708SDavid Chisnall                    break;
14077a984708SDavid Chisnall                __str.push_back(__ch);
14087a984708SDavid Chisnall                if (__str.size() == __str.max_size())
14097a984708SDavid Chisnall                {
14107a984708SDavid Chisnall                    __err |= ios_base::failbit;
14117a984708SDavid Chisnall                    break;
14127a984708SDavid Chisnall                }
14137a984708SDavid Chisnall            }
14147a984708SDavid Chisnall            if (__extr == 0)
14157a984708SDavid Chisnall               __err |= ios_base::failbit;
14167a984708SDavid Chisnall            __is.setstate(__err);
14177a984708SDavid Chisnall        }
14187a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
14197a984708SDavid Chisnall    }
14207a984708SDavid Chisnall    catch (...)
14217a984708SDavid Chisnall    {
14227a984708SDavid Chisnall        __is.__set_badbit_and_consider_rethrow();
14237a984708SDavid Chisnall    }
14247a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
14257a984708SDavid Chisnall    return __is;
14267a984708SDavid Chisnall}
14277a984708SDavid Chisnall
14287a984708SDavid Chisnalltemplate<class _CharT, class _Traits, class _Allocator>
14297a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
14307a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
14317a984708SDavid Chisnallgetline(basic_istream<_CharT, _Traits>& __is,
14327a984708SDavid Chisnall        basic_string<_CharT, _Traits, _Allocator>& __str)
14337a984708SDavid Chisnall{
14347a984708SDavid Chisnall    return getline(__is, __str, __is.widen('\n'));
14357a984708SDavid Chisnall}
14367a984708SDavid Chisnall
1437540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
14387a984708SDavid Chisnall
14397a984708SDavid Chisnalltemplate<class _CharT, class _Traits, class _Allocator>
14407a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
14417a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
14427a984708SDavid Chisnallgetline(basic_istream<_CharT, _Traits>&& __is,
14437a984708SDavid Chisnall        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
14447a984708SDavid Chisnall{
14457a984708SDavid Chisnall    return getline(__is, __str, __dlm);
14467a984708SDavid Chisnall}
14477a984708SDavid Chisnall
14487a984708SDavid Chisnalltemplate<class _CharT, class _Traits, class _Allocator>
14497a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
14507a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
14517a984708SDavid Chisnallgetline(basic_istream<_CharT, _Traits>&& __is,
14527a984708SDavid Chisnall        basic_string<_CharT, _Traits, _Allocator>& __str)
14537a984708SDavid Chisnall{
14547a984708SDavid Chisnall    return getline(__is, __str, __is.widen('\n'));
14557a984708SDavid Chisnall}
14567a984708SDavid Chisnall
1457540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
14587a984708SDavid Chisnall
14597a984708SDavid Chisnalltemplate <class _CharT, class _Traits, size_t _Size>
14607a984708SDavid Chisnallbasic_istream<_CharT, _Traits>&
14617a984708SDavid Chisnalloperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
14627a984708SDavid Chisnall{
14637a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
14647a984708SDavid Chisnall    try
14657a984708SDavid Chisnall    {
14667a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
14677a984708SDavid Chisnall        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
14687a984708SDavid Chisnall        if (__sen)
14697a984708SDavid Chisnall        {
14707a984708SDavid Chisnall            basic_string<_CharT, _Traits> __str;
14717a984708SDavid Chisnall            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1472aed8d94eSDimitry Andric            size_t __c = 0;
14737a984708SDavid Chisnall            ios_base::iostate __err = ios_base::goodbit;
14747a984708SDavid Chisnall            _CharT __zero = __ct.widen('0');
14757a984708SDavid Chisnall            _CharT __one = __ct.widen('1');
14767a984708SDavid Chisnall            while (__c < _Size)
14777a984708SDavid Chisnall            {
14787a984708SDavid Chisnall                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
14797a984708SDavid Chisnall                if (_Traits::eq_int_type(__i, _Traits::eof()))
14807a984708SDavid Chisnall                {
14817a984708SDavid Chisnall                   __err |= ios_base::eofbit;
14827a984708SDavid Chisnall                   break;
14837a984708SDavid Chisnall                }
14847a984708SDavid Chisnall                _CharT __ch = _Traits::to_char_type(__i);
14857a984708SDavid Chisnall                if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
14867a984708SDavid Chisnall                    break;
14877a984708SDavid Chisnall                __str.push_back(__ch);
14887a984708SDavid Chisnall                ++__c;
14897a984708SDavid Chisnall                 __is.rdbuf()->sbumpc();
14907a984708SDavid Chisnall            }
14917a984708SDavid Chisnall            __x = bitset<_Size>(__str);
14927a984708SDavid Chisnall            if (__c == 0)
14937a984708SDavid Chisnall               __err |= ios_base::failbit;
14947a984708SDavid Chisnall            __is.setstate(__err);
14957a984708SDavid Chisnall        }
14967a984708SDavid Chisnall        else
14977a984708SDavid Chisnall            __is.setstate(ios_base::failbit);
14987a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
14997a984708SDavid Chisnall    }
15007a984708SDavid Chisnall    catch (...)
15017a984708SDavid Chisnall    {
15027a984708SDavid Chisnall        __is.__set_badbit_and_consider_rethrow();
15037a984708SDavid Chisnall    }
15047a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
15057a984708SDavid Chisnall    return __is;
15067a984708SDavid Chisnall}
15077a984708SDavid Chisnall
1508*b5893f02SDimitry Andric#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
1509aed8d94eSDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1510aed8d94eSDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1511aed8d94eSDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
15120f5676f4SDimitry Andric#endif
15137a984708SDavid Chisnall
15147a984708SDavid Chisnall_LIBCPP_END_NAMESPACE_STD
15157a984708SDavid Chisnall
1516f9448bf3SDimitry Andric_LIBCPP_POP_MACROS
1517f9448bf3SDimitry Andric
15187a984708SDavid Chisnall#endif  // _LIBCPP_ISTREAM
1519