xref: /netbsd-src/external/apache2/llvm/dist/libcxx/include/istream (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg// -*- C++ -*-
2*4d6fc14bSjoerg//===--------------------------- istream ----------------------------------===//
3*4d6fc14bSjoerg//
4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information.
6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4d6fc14bSjoerg//
8*4d6fc14bSjoerg//===----------------------------------------------------------------------===//
9*4d6fc14bSjoerg
10*4d6fc14bSjoerg#ifndef _LIBCPP_ISTREAM
11*4d6fc14bSjoerg#define _LIBCPP_ISTREAM
12*4d6fc14bSjoerg
13*4d6fc14bSjoerg/*
14*4d6fc14bSjoerg    istream synopsis
15*4d6fc14bSjoerg
16*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> >
17*4d6fc14bSjoergclass basic_istream
18*4d6fc14bSjoerg    : virtual public basic_ios<charT,traits>
19*4d6fc14bSjoerg{
20*4d6fc14bSjoergpublic:
21*4d6fc14bSjoerg    // types (inherited from basic_ios (27.5.4)):
22*4d6fc14bSjoerg    typedef charT                          char_type;
23*4d6fc14bSjoerg    typedef traits                         traits_type;
24*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
25*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
26*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
27*4d6fc14bSjoerg
28*4d6fc14bSjoerg    // 27.7.1.1.1 Constructor/destructor:
29*4d6fc14bSjoerg    explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
30*4d6fc14bSjoerg    basic_istream(basic_istream&& rhs);
31*4d6fc14bSjoerg    virtual ~basic_istream();
32*4d6fc14bSjoerg
33*4d6fc14bSjoerg    // 27.7.1.1.2 Assign/swap:
34*4d6fc14bSjoerg    basic_istream& operator=(basic_istream&& rhs);
35*4d6fc14bSjoerg    void swap(basic_istream& rhs);
36*4d6fc14bSjoerg
37*4d6fc14bSjoerg    // 27.7.1.1.3 Prefix/suffix:
38*4d6fc14bSjoerg    class sentry;
39*4d6fc14bSjoerg
40*4d6fc14bSjoerg    // 27.7.1.2 Formatted input:
41*4d6fc14bSjoerg    basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
42*4d6fc14bSjoerg    basic_istream& operator>>(basic_ios<char_type, traits_type>&
43*4d6fc14bSjoerg                              (*pf)(basic_ios<char_type, traits_type>&));
44*4d6fc14bSjoerg    basic_istream& operator>>(ios_base& (*pf)(ios_base&));
45*4d6fc14bSjoerg    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
46*4d6fc14bSjoerg    basic_istream& operator>>(bool& n);
47*4d6fc14bSjoerg    basic_istream& operator>>(short& n);
48*4d6fc14bSjoerg    basic_istream& operator>>(unsigned short& n);
49*4d6fc14bSjoerg    basic_istream& operator>>(int& n);
50*4d6fc14bSjoerg    basic_istream& operator>>(unsigned int& n);
51*4d6fc14bSjoerg    basic_istream& operator>>(long& n);
52*4d6fc14bSjoerg    basic_istream& operator>>(unsigned long& n);
53*4d6fc14bSjoerg    basic_istream& operator>>(long long& n);
54*4d6fc14bSjoerg    basic_istream& operator>>(unsigned long long& n);
55*4d6fc14bSjoerg    basic_istream& operator>>(float& f);
56*4d6fc14bSjoerg    basic_istream& operator>>(double& f);
57*4d6fc14bSjoerg    basic_istream& operator>>(long double& f);
58*4d6fc14bSjoerg    basic_istream& operator>>(void*& p);
59*4d6fc14bSjoerg
60*4d6fc14bSjoerg    // 27.7.1.3 Unformatted input:
61*4d6fc14bSjoerg    streamsize gcount() const;
62*4d6fc14bSjoerg    int_type get();
63*4d6fc14bSjoerg    basic_istream& get(char_type& c);
64*4d6fc14bSjoerg    basic_istream& get(char_type* s, streamsize n);
65*4d6fc14bSjoerg    basic_istream& get(char_type* s, streamsize n, char_type delim);
66*4d6fc14bSjoerg    basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
67*4d6fc14bSjoerg    basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
68*4d6fc14bSjoerg
69*4d6fc14bSjoerg    basic_istream& getline(char_type* s, streamsize n);
70*4d6fc14bSjoerg    basic_istream& getline(char_type* s, streamsize n, char_type delim);
71*4d6fc14bSjoerg
72*4d6fc14bSjoerg    basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
73*4d6fc14bSjoerg    int_type peek();
74*4d6fc14bSjoerg    basic_istream& read (char_type* s, streamsize n);
75*4d6fc14bSjoerg    streamsize readsome(char_type* s, streamsize n);
76*4d6fc14bSjoerg
77*4d6fc14bSjoerg    basic_istream& putback(char_type c);
78*4d6fc14bSjoerg    basic_istream& unget();
79*4d6fc14bSjoerg    int sync();
80*4d6fc14bSjoerg
81*4d6fc14bSjoerg    pos_type tellg();
82*4d6fc14bSjoerg    basic_istream& seekg(pos_type);
83*4d6fc14bSjoerg    basic_istream& seekg(off_type, ios_base::seekdir);
84*4d6fc14bSjoergprotected:
85*4d6fc14bSjoerg    basic_istream(const basic_istream& rhs) = delete;
86*4d6fc14bSjoerg    basic_istream(basic_istream&& rhs);
87*4d6fc14bSjoerg    // 27.7.2.1.2 Assign/swap:
88*4d6fc14bSjoerg    basic_istream& operator=(const basic_istream& rhs) = delete;
89*4d6fc14bSjoerg    basic_istream& operator=(basic_istream&& rhs);
90*4d6fc14bSjoerg    void swap(basic_istream& rhs);
91*4d6fc14bSjoerg};
92*4d6fc14bSjoerg
93*4d6fc14bSjoerg// 27.7.1.2.3 character extraction templates:
94*4d6fc14bSjoergtemplate<class charT, class traits>
95*4d6fc14bSjoerg  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
96*4d6fc14bSjoerg
97*4d6fc14bSjoergtemplate<class traits>
98*4d6fc14bSjoerg  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
99*4d6fc14bSjoerg
100*4d6fc14bSjoergtemplate<class traits>
101*4d6fc14bSjoerg  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
102*4d6fc14bSjoerg
103*4d6fc14bSjoergtemplate<class charT, class traits>
104*4d6fc14bSjoerg  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
105*4d6fc14bSjoerg
106*4d6fc14bSjoergtemplate<class traits>
107*4d6fc14bSjoerg  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
108*4d6fc14bSjoerg
109*4d6fc14bSjoergtemplate<class traits>
110*4d6fc14bSjoerg  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
111*4d6fc14bSjoerg
112*4d6fc14bSjoergtemplate <class charT, class traits>
113*4d6fc14bSjoerg  void
114*4d6fc14bSjoerg  swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
115*4d6fc14bSjoerg
116*4d6fc14bSjoergtypedef basic_istream<char> istream;
117*4d6fc14bSjoergtypedef basic_istream<wchar_t> wistream;
118*4d6fc14bSjoerg
119*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> >
120*4d6fc14bSjoergclass basic_iostream :
121*4d6fc14bSjoerg    public basic_istream<charT,traits>,
122*4d6fc14bSjoerg    public basic_ostream<charT,traits>
123*4d6fc14bSjoerg{
124*4d6fc14bSjoergpublic:
125*4d6fc14bSjoerg    // types:
126*4d6fc14bSjoerg    typedef charT                          char_type;
127*4d6fc14bSjoerg    typedef traits                         traits_type;
128*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
129*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
130*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
131*4d6fc14bSjoerg
132*4d6fc14bSjoerg    // constructor/destructor
133*4d6fc14bSjoerg    explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
134*4d6fc14bSjoerg    basic_iostream(basic_iostream&& rhs);
135*4d6fc14bSjoerg    virtual ~basic_iostream();
136*4d6fc14bSjoerg
137*4d6fc14bSjoerg    // assign/swap
138*4d6fc14bSjoerg    basic_iostream& operator=(basic_iostream&& rhs);
139*4d6fc14bSjoerg    void swap(basic_iostream& rhs);
140*4d6fc14bSjoerg};
141*4d6fc14bSjoerg
142*4d6fc14bSjoergtemplate <class charT, class traits>
143*4d6fc14bSjoerg  void
144*4d6fc14bSjoerg  swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
145*4d6fc14bSjoerg
146*4d6fc14bSjoergtypedef basic_iostream<char> iostream;
147*4d6fc14bSjoergtypedef basic_iostream<wchar_t> wiostream;
148*4d6fc14bSjoerg
149*4d6fc14bSjoergtemplate <class charT, class traits>
150*4d6fc14bSjoerg  basic_istream<charT,traits>&
151*4d6fc14bSjoerg  ws(basic_istream<charT,traits>& is);
152*4d6fc14bSjoerg
153*4d6fc14bSjoerg// rvalue stream extraction
154*4d6fc14bSjoergtemplate <class Stream, class T>
155*4d6fc14bSjoerg  Stream&& operator>>(Stream&& is, T&& x);
156*4d6fc14bSjoerg
157*4d6fc14bSjoerg}  // std
158*4d6fc14bSjoerg
159*4d6fc14bSjoerg*/
160*4d6fc14bSjoerg
161*4d6fc14bSjoerg#include <__config>
162*4d6fc14bSjoerg#include <version>
163*4d6fc14bSjoerg#include <ostream>
164*4d6fc14bSjoerg
165*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
166*4d6fc14bSjoerg#pragma GCC system_header
167*4d6fc14bSjoerg#endif
168*4d6fc14bSjoerg
169*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS
170*4d6fc14bSjoerg#include <__undef_macros>
171*4d6fc14bSjoerg
172*4d6fc14bSjoerg
173*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD
174*4d6fc14bSjoerg
175*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
176*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_istream
177*4d6fc14bSjoerg    : virtual public basic_ios<_CharT, _Traits>
178*4d6fc14bSjoerg{
179*4d6fc14bSjoerg    streamsize __gc_;
180*4d6fc14bSjoergpublic:
181*4d6fc14bSjoerg    // types (inherited from basic_ios (27.5.4)):
182*4d6fc14bSjoerg    typedef _CharT                         char_type;
183*4d6fc14bSjoerg    typedef _Traits                        traits_type;
184*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
185*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
186*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
187*4d6fc14bSjoerg
188*4d6fc14bSjoerg    // 27.7.1.1.1 Constructor/destructor:
189*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
190*4d6fc14bSjoerg    explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
191*4d6fc14bSjoerg    { this->init(__sb); }
192*4d6fc14bSjoerg    virtual ~basic_istream();
193*4d6fc14bSjoergprotected:
194*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
195*4d6fc14bSjoerg    inline _LIBCPP_INLINE_VISIBILITY
196*4d6fc14bSjoerg    basic_istream(basic_istream&& __rhs);
197*4d6fc14bSjoerg
198*4d6fc14bSjoerg    // 27.7.1.1.2 Assign/swap:
199*4d6fc14bSjoerg    inline _LIBCPP_INLINE_VISIBILITY
200*4d6fc14bSjoerg    basic_istream& operator=(basic_istream&& __rhs);
201*4d6fc14bSjoerg#endif
202*4d6fc14bSjoerg
203*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
204*4d6fc14bSjoerg    void swap(basic_istream& __rhs) {
205*4d6fc14bSjoerg      _VSTD::swap(__gc_, __rhs.__gc_);
206*4d6fc14bSjoerg      basic_ios<char_type, traits_type>::swap(__rhs);
207*4d6fc14bSjoerg    }
208*4d6fc14bSjoerg
209*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
210*4d6fc14bSjoerg    basic_istream           (const basic_istream& __rhs) = delete;
211*4d6fc14bSjoerg    basic_istream& operator=(const basic_istream& __rhs) = delete;
212*4d6fc14bSjoerg#endif
213*4d6fc14bSjoergpublic:
214*4d6fc14bSjoerg
215*4d6fc14bSjoerg    // 27.7.1.1.3 Prefix/suffix:
216*4d6fc14bSjoerg    class _LIBCPP_TEMPLATE_VIS sentry;
217*4d6fc14bSjoerg
218*4d6fc14bSjoerg    // 27.7.1.2 Formatted input:
219*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
220*4d6fc14bSjoerg    basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
221*4d6fc14bSjoerg    { return __pf(*this); }
222*4d6fc14bSjoerg
223*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
224*4d6fc14bSjoerg    basic_istream& operator>>(basic_ios<char_type, traits_type>&
225*4d6fc14bSjoerg                              (*__pf)(basic_ios<char_type, traits_type>&))
226*4d6fc14bSjoerg    { __pf(*this); return *this; }
227*4d6fc14bSjoerg
228*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
229*4d6fc14bSjoerg    basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
230*4d6fc14bSjoerg    { __pf(*this); return *this; }
231*4d6fc14bSjoerg
232*4d6fc14bSjoerg    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
233*4d6fc14bSjoerg    basic_istream& operator>>(bool& __n);
234*4d6fc14bSjoerg    basic_istream& operator>>(short& __n);
235*4d6fc14bSjoerg    basic_istream& operator>>(unsigned short& __n);
236*4d6fc14bSjoerg    basic_istream& operator>>(int& __n);
237*4d6fc14bSjoerg    basic_istream& operator>>(unsigned int& __n);
238*4d6fc14bSjoerg    basic_istream& operator>>(long& __n);
239*4d6fc14bSjoerg    basic_istream& operator>>(unsigned long& __n);
240*4d6fc14bSjoerg    basic_istream& operator>>(long long& __n);
241*4d6fc14bSjoerg    basic_istream& operator>>(unsigned long long& __n);
242*4d6fc14bSjoerg    basic_istream& operator>>(float& __f);
243*4d6fc14bSjoerg    basic_istream& operator>>(double& __f);
244*4d6fc14bSjoerg    basic_istream& operator>>(long double& __f);
245*4d6fc14bSjoerg    basic_istream& operator>>(void*& __p);
246*4d6fc14bSjoerg
247*4d6fc14bSjoerg    // 27.7.1.3 Unformatted input:
248*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
249*4d6fc14bSjoerg    streamsize gcount() const {return __gc_;}
250*4d6fc14bSjoerg    int_type get();
251*4d6fc14bSjoerg
252*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
253*4d6fc14bSjoerg    basic_istream& get(char_type& __c) {
254*4d6fc14bSjoerg      int_type __ch = get();
255*4d6fc14bSjoerg      if (__ch != traits_type::eof())
256*4d6fc14bSjoerg        __c = traits_type::to_char_type(__ch);
257*4d6fc14bSjoerg      return *this;
258*4d6fc14bSjoerg    }
259*4d6fc14bSjoerg
260*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
261*4d6fc14bSjoerg    basic_istream& get(char_type* __s, streamsize __n)
262*4d6fc14bSjoerg    { return get(__s, __n, this->widen('\n')); }
263*4d6fc14bSjoerg
264*4d6fc14bSjoerg    basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
265*4d6fc14bSjoerg
266*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
267*4d6fc14bSjoerg    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
268*4d6fc14bSjoerg    { return get(__sb, this->widen('\n')); }
269*4d6fc14bSjoerg
270*4d6fc14bSjoerg    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
271*4d6fc14bSjoerg
272*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
273*4d6fc14bSjoerg    basic_istream& getline(char_type* __s, streamsize __n)
274*4d6fc14bSjoerg    { return getline(__s, __n, this->widen('\n')); }
275*4d6fc14bSjoerg
276*4d6fc14bSjoerg    basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
277*4d6fc14bSjoerg
278*4d6fc14bSjoerg    basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
279*4d6fc14bSjoerg    int_type peek();
280*4d6fc14bSjoerg    basic_istream& read (char_type* __s, streamsize __n);
281*4d6fc14bSjoerg    streamsize readsome(char_type* __s, streamsize __n);
282*4d6fc14bSjoerg
283*4d6fc14bSjoerg    basic_istream& putback(char_type __c);
284*4d6fc14bSjoerg    basic_istream& unget();
285*4d6fc14bSjoerg    int sync();
286*4d6fc14bSjoerg
287*4d6fc14bSjoerg    pos_type tellg();
288*4d6fc14bSjoerg    basic_istream& seekg(pos_type __pos);
289*4d6fc14bSjoerg    basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
290*4d6fc14bSjoerg};
291*4d6fc14bSjoerg
292*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
293*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
294*4d6fc14bSjoerg{
295*4d6fc14bSjoerg    bool __ok_;
296*4d6fc14bSjoerg
297*4d6fc14bSjoerg    sentry(const sentry&); // = delete;
298*4d6fc14bSjoerg    sentry& operator=(const sentry&); // = delete;
299*4d6fc14bSjoerg
300*4d6fc14bSjoergpublic:
301*4d6fc14bSjoerg    explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
302*4d6fc14bSjoerg//    ~sentry() = default;
303*4d6fc14bSjoerg
304*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
305*4d6fc14bSjoerg        _LIBCPP_EXPLICIT
306*4d6fc14bSjoerg        operator bool() const {return __ok_;}
307*4d6fc14bSjoerg};
308*4d6fc14bSjoerg
309*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
310*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
311*4d6fc14bSjoerg                                               bool __noskipws)
312*4d6fc14bSjoerg    : __ok_(false)
313*4d6fc14bSjoerg{
314*4d6fc14bSjoerg    if (__is.good())
315*4d6fc14bSjoerg    {
316*4d6fc14bSjoerg        if (__is.tie())
317*4d6fc14bSjoerg            __is.tie()->flush();
318*4d6fc14bSjoerg        if (!__noskipws && (__is.flags() & ios_base::skipws))
319*4d6fc14bSjoerg        {
320*4d6fc14bSjoerg            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
321*4d6fc14bSjoerg            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
322*4d6fc14bSjoerg            _Ip __i(__is);
323*4d6fc14bSjoerg            _Ip __eof;
324*4d6fc14bSjoerg            for (; __i != __eof; ++__i)
325*4d6fc14bSjoerg                if (!__ct.is(__ct.space, *__i))
326*4d6fc14bSjoerg                    break;
327*4d6fc14bSjoerg            if (__i == __eof)
328*4d6fc14bSjoerg                __is.setstate(ios_base::failbit | ios_base::eofbit);
329*4d6fc14bSjoerg        }
330*4d6fc14bSjoerg        __ok_ = __is.good();
331*4d6fc14bSjoerg    }
332*4d6fc14bSjoerg    else
333*4d6fc14bSjoerg        __is.setstate(ios_base::failbit);
334*4d6fc14bSjoerg}
335*4d6fc14bSjoerg
336*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
337*4d6fc14bSjoerg
338*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
339*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
340*4d6fc14bSjoerg    : __gc_(__rhs.__gc_)
341*4d6fc14bSjoerg{
342*4d6fc14bSjoerg    __rhs.__gc_ = 0;
343*4d6fc14bSjoerg    this->move(__rhs);
344*4d6fc14bSjoerg}
345*4d6fc14bSjoerg
346*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
347*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
348*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
349*4d6fc14bSjoerg{
350*4d6fc14bSjoerg    swap(__rhs);
351*4d6fc14bSjoerg    return *this;
352*4d6fc14bSjoerg}
353*4d6fc14bSjoerg
354*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
355*4d6fc14bSjoerg
356*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
357*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::~basic_istream()
358*4d6fc14bSjoerg{
359*4d6fc14bSjoerg}
360*4d6fc14bSjoerg
361*4d6fc14bSjoergtemplate <class _Tp, class _CharT, class _Traits>
362*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY
363*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
364*4d6fc14bSjoerg__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
365*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
366*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
367*4d6fc14bSjoerg    if (__s)
368*4d6fc14bSjoerg    {
369*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
370*4d6fc14bSjoerg        try
371*4d6fc14bSjoerg        {
372*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
373*4d6fc14bSjoerg            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
374*4d6fc14bSjoerg            typedef num_get<_CharT, _Ip> _Fp;
375*4d6fc14bSjoerg            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
376*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
377*4d6fc14bSjoerg        }
378*4d6fc14bSjoerg        catch (...)
379*4d6fc14bSjoerg        {
380*4d6fc14bSjoerg            __state |= ios_base::badbit;
381*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
382*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
383*4d6fc14bSjoerg            {
384*4d6fc14bSjoerg                throw;
385*4d6fc14bSjoerg            }
386*4d6fc14bSjoerg        }
387*4d6fc14bSjoerg#endif
388*4d6fc14bSjoerg        __is.setstate(__state);
389*4d6fc14bSjoerg    }
390*4d6fc14bSjoerg    return __is;
391*4d6fc14bSjoerg}
392*4d6fc14bSjoerg
393*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
394*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
395*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
396*4d6fc14bSjoerg{
397*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
398*4d6fc14bSjoerg}
399*4d6fc14bSjoerg
400*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
401*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
402*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
403*4d6fc14bSjoerg{
404*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
405*4d6fc14bSjoerg}
406*4d6fc14bSjoerg
407*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
408*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
409*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(long& __n)
410*4d6fc14bSjoerg{
411*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<long>(*this, __n);
412*4d6fc14bSjoerg}
413*4d6fc14bSjoerg
414*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
415*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
416*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
417*4d6fc14bSjoerg{
418*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
419*4d6fc14bSjoerg}
420*4d6fc14bSjoerg
421*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
422*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
423*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(long long& __n)
424*4d6fc14bSjoerg{
425*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<long long>(*this, __n);
426*4d6fc14bSjoerg}
427*4d6fc14bSjoerg
428*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
429*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
430*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
431*4d6fc14bSjoerg{
432*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
433*4d6fc14bSjoerg}
434*4d6fc14bSjoerg
435*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
436*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
437*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(float& __n)
438*4d6fc14bSjoerg{
439*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<float>(*this, __n);
440*4d6fc14bSjoerg}
441*4d6fc14bSjoerg
442*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
443*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
444*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(double& __n)
445*4d6fc14bSjoerg{
446*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<double>(*this, __n);
447*4d6fc14bSjoerg}
448*4d6fc14bSjoerg
449*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
450*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
451*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(long double& __n)
452*4d6fc14bSjoerg{
453*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<long double>(*this, __n);
454*4d6fc14bSjoerg}
455*4d6fc14bSjoerg
456*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
457*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
458*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(bool& __n)
459*4d6fc14bSjoerg{
460*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<bool>(*this, __n);
461*4d6fc14bSjoerg}
462*4d6fc14bSjoerg
463*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
464*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
465*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(void*& __n)
466*4d6fc14bSjoerg{
467*4d6fc14bSjoerg    return _VSTD::__input_arithmetic<void*>(*this, __n);
468*4d6fc14bSjoerg}
469*4d6fc14bSjoerg
470*4d6fc14bSjoergtemplate <class _Tp, class _CharT, class _Traits>
471*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY
472*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
473*4d6fc14bSjoerg__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
474*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
475*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
476*4d6fc14bSjoerg    if (__s)
477*4d6fc14bSjoerg    {
478*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
479*4d6fc14bSjoerg        try
480*4d6fc14bSjoerg        {
481*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
482*4d6fc14bSjoerg            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
483*4d6fc14bSjoerg            typedef num_get<_CharT, _Ip> _Fp;
484*4d6fc14bSjoerg            long __temp;
485*4d6fc14bSjoerg            use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
486*4d6fc14bSjoerg            if (__temp < numeric_limits<_Tp>::min())
487*4d6fc14bSjoerg            {
488*4d6fc14bSjoerg                __state |= ios_base::failbit;
489*4d6fc14bSjoerg                __n = numeric_limits<_Tp>::min();
490*4d6fc14bSjoerg            }
491*4d6fc14bSjoerg            else if (__temp > numeric_limits<_Tp>::max())
492*4d6fc14bSjoerg            {
493*4d6fc14bSjoerg                __state |= ios_base::failbit;
494*4d6fc14bSjoerg                __n = numeric_limits<_Tp>::max();
495*4d6fc14bSjoerg            }
496*4d6fc14bSjoerg            else
497*4d6fc14bSjoerg            {
498*4d6fc14bSjoerg                __n = static_cast<_Tp>(__temp);
499*4d6fc14bSjoerg            }
500*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
501*4d6fc14bSjoerg        }
502*4d6fc14bSjoerg        catch (...)
503*4d6fc14bSjoerg        {
504*4d6fc14bSjoerg            __state |= ios_base::badbit;
505*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
506*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
507*4d6fc14bSjoerg            {
508*4d6fc14bSjoerg                throw;
509*4d6fc14bSjoerg            }
510*4d6fc14bSjoerg        }
511*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
512*4d6fc14bSjoerg        __is.setstate(__state);
513*4d6fc14bSjoerg    }
514*4d6fc14bSjoerg    return __is;
515*4d6fc14bSjoerg}
516*4d6fc14bSjoerg
517*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
518*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
519*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(short& __n)
520*4d6fc14bSjoerg{
521*4d6fc14bSjoerg    return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
522*4d6fc14bSjoerg}
523*4d6fc14bSjoerg
524*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
525*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
526*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(int& __n)
527*4d6fc14bSjoerg{
528*4d6fc14bSjoerg    return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
529*4d6fc14bSjoerg}
530*4d6fc14bSjoerg
531*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
532*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY
533*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
534*4d6fc14bSjoerg__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
535*4d6fc14bSjoerg{
536*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
537*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
538*4d6fc14bSjoerg    if (__sen)
539*4d6fc14bSjoerg    {
540*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
541*4d6fc14bSjoerg        try
542*4d6fc14bSjoerg        {
543*4d6fc14bSjoerg#endif
544*4d6fc14bSjoerg            _CharT* __s = __p;
545*4d6fc14bSjoerg            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
546*4d6fc14bSjoerg            while (__s != __p + (__n-1))
547*4d6fc14bSjoerg            {
548*4d6fc14bSjoerg                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
549*4d6fc14bSjoerg                if (_Traits::eq_int_type(__i, _Traits::eof()))
550*4d6fc14bSjoerg                {
551*4d6fc14bSjoerg                   __state |= ios_base::eofbit;
552*4d6fc14bSjoerg                   break;
553*4d6fc14bSjoerg                }
554*4d6fc14bSjoerg                _CharT __ch = _Traits::to_char_type(__i);
555*4d6fc14bSjoerg                if (__ct.is(__ct.space, __ch))
556*4d6fc14bSjoerg                    break;
557*4d6fc14bSjoerg                *__s++ = __ch;
558*4d6fc14bSjoerg                 __is.rdbuf()->sbumpc();
559*4d6fc14bSjoerg            }
560*4d6fc14bSjoerg            *__s = _CharT();
561*4d6fc14bSjoerg            __is.width(0);
562*4d6fc14bSjoerg            if (__s == __p)
563*4d6fc14bSjoerg               __state |= ios_base::failbit;
564*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
565*4d6fc14bSjoerg        }
566*4d6fc14bSjoerg        catch (...)
567*4d6fc14bSjoerg        {
568*4d6fc14bSjoerg            __state |= ios_base::badbit;
569*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
570*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
571*4d6fc14bSjoerg            {
572*4d6fc14bSjoerg                throw;
573*4d6fc14bSjoerg            }
574*4d6fc14bSjoerg        }
575*4d6fc14bSjoerg#endif
576*4d6fc14bSjoerg        __is.setstate(__state);
577*4d6fc14bSjoerg    }
578*4d6fc14bSjoerg    return __is;
579*4d6fc14bSjoerg}
580*4d6fc14bSjoerg
581*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
582*4d6fc14bSjoerg
583*4d6fc14bSjoergtemplate<class _CharT, class _Traits, size_t _Np>
584*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
585*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
586*4d6fc14bSjoergoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
587*4d6fc14bSjoerg{
588*4d6fc14bSjoerg    size_t __n = _Np;
589*4d6fc14bSjoerg    if (__is.width() > 0)
590*4d6fc14bSjoerg        __n = _VSTD::min(size_t(__is.width()), _Np);
591*4d6fc14bSjoerg    return _VSTD::__input_c_string(__is, __buf, __n);
592*4d6fc14bSjoerg}
593*4d6fc14bSjoerg
594*4d6fc14bSjoergtemplate<class _Traits, size_t _Np>
595*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
596*4d6fc14bSjoergbasic_istream<char, _Traits>&
597*4d6fc14bSjoergoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
598*4d6fc14bSjoerg{
599*4d6fc14bSjoerg    return __is >> (char(&)[_Np])__buf;
600*4d6fc14bSjoerg}
601*4d6fc14bSjoerg
602*4d6fc14bSjoergtemplate<class _Traits, size_t _Np>
603*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
604*4d6fc14bSjoergbasic_istream<char, _Traits>&
605*4d6fc14bSjoergoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
606*4d6fc14bSjoerg{
607*4d6fc14bSjoerg    return __is >> (char(&)[_Np])__buf;
608*4d6fc14bSjoerg}
609*4d6fc14bSjoerg
610*4d6fc14bSjoerg#else
611*4d6fc14bSjoerg
612*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
613*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
614*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
615*4d6fc14bSjoergoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
616*4d6fc14bSjoerg{
617*4d6fc14bSjoerg    streamsize __n = __is.width();
618*4d6fc14bSjoerg    if (__n <= 0)
619*4d6fc14bSjoerg        __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
620*4d6fc14bSjoerg    return _VSTD::__input_c_string(__is, __s, size_t(__n));
621*4d6fc14bSjoerg}
622*4d6fc14bSjoerg
623*4d6fc14bSjoergtemplate<class _Traits>
624*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
625*4d6fc14bSjoergbasic_istream<char, _Traits>&
626*4d6fc14bSjoergoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
627*4d6fc14bSjoerg{
628*4d6fc14bSjoerg    return __is >> (char*)__s;
629*4d6fc14bSjoerg}
630*4d6fc14bSjoerg
631*4d6fc14bSjoergtemplate<class _Traits>
632*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
633*4d6fc14bSjoergbasic_istream<char, _Traits>&
634*4d6fc14bSjoergoperator>>(basic_istream<char, _Traits>& __is, signed char* __s)
635*4d6fc14bSjoerg{
636*4d6fc14bSjoerg    return __is >> (char*)__s;
637*4d6fc14bSjoerg}
638*4d6fc14bSjoerg
639*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER > 17
640*4d6fc14bSjoerg
641*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
642*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
643*4d6fc14bSjoergoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
644*4d6fc14bSjoerg{
645*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
646*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
647*4d6fc14bSjoerg    if (__sen)
648*4d6fc14bSjoerg    {
649*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
650*4d6fc14bSjoerg        try
651*4d6fc14bSjoerg        {
652*4d6fc14bSjoerg#endif
653*4d6fc14bSjoerg            typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
654*4d6fc14bSjoerg            if (_Traits::eq_int_type(__i, _Traits::eof()))
655*4d6fc14bSjoerg                __state |= ios_base::eofbit | ios_base::failbit;
656*4d6fc14bSjoerg            else
657*4d6fc14bSjoerg                __c = _Traits::to_char_type(__i);
658*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
659*4d6fc14bSjoerg        }
660*4d6fc14bSjoerg        catch (...)
661*4d6fc14bSjoerg        {
662*4d6fc14bSjoerg            __state |= ios_base::badbit;
663*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
664*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
665*4d6fc14bSjoerg            {
666*4d6fc14bSjoerg                throw;
667*4d6fc14bSjoerg            }
668*4d6fc14bSjoerg        }
669*4d6fc14bSjoerg#endif
670*4d6fc14bSjoerg        __is.setstate(__state);
671*4d6fc14bSjoerg    }
672*4d6fc14bSjoerg    return __is;
673*4d6fc14bSjoerg}
674*4d6fc14bSjoerg
675*4d6fc14bSjoergtemplate<class _Traits>
676*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
677*4d6fc14bSjoergbasic_istream<char, _Traits>&
678*4d6fc14bSjoergoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
679*4d6fc14bSjoerg{
680*4d6fc14bSjoerg    return __is >> (char&)__c;
681*4d6fc14bSjoerg}
682*4d6fc14bSjoerg
683*4d6fc14bSjoergtemplate<class _Traits>
684*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
685*4d6fc14bSjoergbasic_istream<char, _Traits>&
686*4d6fc14bSjoergoperator>>(basic_istream<char, _Traits>& __is, signed char& __c)
687*4d6fc14bSjoerg{
688*4d6fc14bSjoerg    return __is >> (char&)__c;
689*4d6fc14bSjoerg}
690*4d6fc14bSjoerg
691*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
692*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
693*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
694*4d6fc14bSjoerg{
695*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
696*4d6fc14bSjoerg    __gc_ = 0;
697*4d6fc14bSjoerg    sentry __s(*this, true);
698*4d6fc14bSjoerg    if (__s)
699*4d6fc14bSjoerg    {
700*4d6fc14bSjoerg        if (__sb)
701*4d6fc14bSjoerg        {
702*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
703*4d6fc14bSjoerg            try
704*4d6fc14bSjoerg            {
705*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
706*4d6fc14bSjoerg                while (true)
707*4d6fc14bSjoerg                {
708*4d6fc14bSjoerg                    typename traits_type::int_type __i = this->rdbuf()->sgetc();
709*4d6fc14bSjoerg                    if (traits_type::eq_int_type(__i, _Traits::eof()))
710*4d6fc14bSjoerg                    {
711*4d6fc14bSjoerg                       __state |= ios_base::eofbit;
712*4d6fc14bSjoerg                       break;
713*4d6fc14bSjoerg                    }
714*4d6fc14bSjoerg                    if (traits_type::eq_int_type(
715*4d6fc14bSjoerg                            __sb->sputc(traits_type::to_char_type(__i)),
716*4d6fc14bSjoerg                            traits_type::eof()))
717*4d6fc14bSjoerg                        break;
718*4d6fc14bSjoerg                    ++__gc_;
719*4d6fc14bSjoerg                    this->rdbuf()->sbumpc();
720*4d6fc14bSjoerg                }
721*4d6fc14bSjoerg                if (__gc_ == 0)
722*4d6fc14bSjoerg                   __state |= ios_base::failbit;
723*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
724*4d6fc14bSjoerg            }
725*4d6fc14bSjoerg            catch (...)
726*4d6fc14bSjoerg            {
727*4d6fc14bSjoerg                __state |= ios_base::badbit;
728*4d6fc14bSjoerg                if (__gc_ == 0)
729*4d6fc14bSjoerg                    __state |= ios_base::failbit;
730*4d6fc14bSjoerg
731*4d6fc14bSjoerg                this->__setstate_nothrow(__state);
732*4d6fc14bSjoerg                if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit)
733*4d6fc14bSjoerg                {
734*4d6fc14bSjoerg                    throw;
735*4d6fc14bSjoerg                }
736*4d6fc14bSjoerg            }
737*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
738*4d6fc14bSjoerg        }
739*4d6fc14bSjoerg        else
740*4d6fc14bSjoerg        {
741*4d6fc14bSjoerg            __state |= ios_base::failbit;
742*4d6fc14bSjoerg        }
743*4d6fc14bSjoerg        this->setstate(__state);
744*4d6fc14bSjoerg    }
745*4d6fc14bSjoerg    return *this;
746*4d6fc14bSjoerg}
747*4d6fc14bSjoerg
748*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
749*4d6fc14bSjoergtypename basic_istream<_CharT, _Traits>::int_type
750*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::get()
751*4d6fc14bSjoerg{
752*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
753*4d6fc14bSjoerg    __gc_ = 0;
754*4d6fc14bSjoerg    int_type __r = traits_type::eof();
755*4d6fc14bSjoerg    sentry __s(*this, true);
756*4d6fc14bSjoerg    if (__s)
757*4d6fc14bSjoerg    {
758*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
759*4d6fc14bSjoerg        try
760*4d6fc14bSjoerg        {
761*4d6fc14bSjoerg#endif
762*4d6fc14bSjoerg            __r = this->rdbuf()->sbumpc();
763*4d6fc14bSjoerg            if (traits_type::eq_int_type(__r, traits_type::eof()))
764*4d6fc14bSjoerg               __state |= ios_base::failbit | ios_base::eofbit;
765*4d6fc14bSjoerg            else
766*4d6fc14bSjoerg                __gc_ = 1;
767*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
768*4d6fc14bSjoerg        }
769*4d6fc14bSjoerg        catch (...)
770*4d6fc14bSjoerg        {
771*4d6fc14bSjoerg            this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
772*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
773*4d6fc14bSjoerg            {
774*4d6fc14bSjoerg                throw;
775*4d6fc14bSjoerg            }
776*4d6fc14bSjoerg        }
777*4d6fc14bSjoerg#endif
778*4d6fc14bSjoerg        this->setstate(__state);
779*4d6fc14bSjoerg    }
780*4d6fc14bSjoerg    return __r;
781*4d6fc14bSjoerg}
782*4d6fc14bSjoerg
783*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
784*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
785*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
786*4d6fc14bSjoerg{
787*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
788*4d6fc14bSjoerg    __gc_ = 0;
789*4d6fc14bSjoerg    sentry __sen(*this, true);
790*4d6fc14bSjoerg    if (__sen)
791*4d6fc14bSjoerg    {
792*4d6fc14bSjoerg        if (__n > 0)
793*4d6fc14bSjoerg        {
794*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
795*4d6fc14bSjoerg            try
796*4d6fc14bSjoerg            {
797*4d6fc14bSjoerg#endif
798*4d6fc14bSjoerg                while (__gc_ < __n-1)
799*4d6fc14bSjoerg                {
800*4d6fc14bSjoerg                    int_type __i = this->rdbuf()->sgetc();
801*4d6fc14bSjoerg                    if (traits_type::eq_int_type(__i, traits_type::eof()))
802*4d6fc14bSjoerg                    {
803*4d6fc14bSjoerg                       __state |= ios_base::eofbit;
804*4d6fc14bSjoerg                       break;
805*4d6fc14bSjoerg                    }
806*4d6fc14bSjoerg                    char_type __ch = traits_type::to_char_type(__i);
807*4d6fc14bSjoerg                    if (traits_type::eq(__ch, __dlm))
808*4d6fc14bSjoerg                        break;
809*4d6fc14bSjoerg                    *__s++ = __ch;
810*4d6fc14bSjoerg                    ++__gc_;
811*4d6fc14bSjoerg                     this->rdbuf()->sbumpc();
812*4d6fc14bSjoerg                }
813*4d6fc14bSjoerg                if (__gc_ == 0)
814*4d6fc14bSjoerg                   __state |= ios_base::failbit;
815*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
816*4d6fc14bSjoerg            }
817*4d6fc14bSjoerg            catch (...)
818*4d6fc14bSjoerg            {
819*4d6fc14bSjoerg                __state |= ios_base::badbit;
820*4d6fc14bSjoerg                this->__setstate_nothrow(__state);
821*4d6fc14bSjoerg                if (this->exceptions() & ios_base::badbit)
822*4d6fc14bSjoerg                {
823*4d6fc14bSjoerg                    if (__n > 0)
824*4d6fc14bSjoerg                        *__s = char_type();
825*4d6fc14bSjoerg                    throw;
826*4d6fc14bSjoerg                }
827*4d6fc14bSjoerg            }
828*4d6fc14bSjoerg#endif
829*4d6fc14bSjoerg        }
830*4d6fc14bSjoerg        else
831*4d6fc14bSjoerg        {
832*4d6fc14bSjoerg            __state |= ios_base::failbit;
833*4d6fc14bSjoerg        }
834*4d6fc14bSjoerg
835*4d6fc14bSjoerg        if (__n > 0)
836*4d6fc14bSjoerg            *__s = char_type();
837*4d6fc14bSjoerg        this->setstate(__state);
838*4d6fc14bSjoerg    }
839*4d6fc14bSjoerg    if (__n > 0)
840*4d6fc14bSjoerg        *__s = char_type();
841*4d6fc14bSjoerg    return *this;
842*4d6fc14bSjoerg}
843*4d6fc14bSjoerg
844*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
845*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
846*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
847*4d6fc14bSjoerg                                    char_type __dlm)
848*4d6fc14bSjoerg{
849*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
850*4d6fc14bSjoerg    __gc_ = 0;
851*4d6fc14bSjoerg    sentry __sen(*this, true);
852*4d6fc14bSjoerg    if (__sen)
853*4d6fc14bSjoerg    {
854*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
855*4d6fc14bSjoerg        try
856*4d6fc14bSjoerg        {
857*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
858*4d6fc14bSjoerg            while (true)
859*4d6fc14bSjoerg            {
860*4d6fc14bSjoerg                typename traits_type::int_type __i = this->rdbuf()->sgetc();
861*4d6fc14bSjoerg                if (traits_type::eq_int_type(__i, traits_type::eof()))
862*4d6fc14bSjoerg                {
863*4d6fc14bSjoerg                   __state |= ios_base::eofbit;
864*4d6fc14bSjoerg                   break;
865*4d6fc14bSjoerg                }
866*4d6fc14bSjoerg                char_type __ch = traits_type::to_char_type(__i);
867*4d6fc14bSjoerg                if (traits_type::eq(__ch, __dlm))
868*4d6fc14bSjoerg                    break;
869*4d6fc14bSjoerg                if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
870*4d6fc14bSjoerg                    break;
871*4d6fc14bSjoerg                ++__gc_;
872*4d6fc14bSjoerg                this->rdbuf()->sbumpc();
873*4d6fc14bSjoerg            }
874*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
875*4d6fc14bSjoerg        }
876*4d6fc14bSjoerg        catch (...)
877*4d6fc14bSjoerg        {
878*4d6fc14bSjoerg            __state |= ios_base::badbit;
879*4d6fc14bSjoerg            // according to the spec, exceptions here are caught but not rethrown
880*4d6fc14bSjoerg        }
881*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
882*4d6fc14bSjoerg        if (__gc_ == 0)
883*4d6fc14bSjoerg           __state |= ios_base::failbit;
884*4d6fc14bSjoerg        this->setstate(__state);
885*4d6fc14bSjoerg    }
886*4d6fc14bSjoerg    return *this;
887*4d6fc14bSjoerg}
888*4d6fc14bSjoerg
889*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
890*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
891*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
892*4d6fc14bSjoerg{
893*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
894*4d6fc14bSjoerg    __gc_ = 0;
895*4d6fc14bSjoerg    sentry __sen(*this, true);
896*4d6fc14bSjoerg    if (__sen)
897*4d6fc14bSjoerg    {
898*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
899*4d6fc14bSjoerg        try
900*4d6fc14bSjoerg        {
901*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
902*4d6fc14bSjoerg            while (true)
903*4d6fc14bSjoerg            {
904*4d6fc14bSjoerg                typename traits_type::int_type __i = this->rdbuf()->sgetc();
905*4d6fc14bSjoerg                if (traits_type::eq_int_type(__i, traits_type::eof()))
906*4d6fc14bSjoerg                {
907*4d6fc14bSjoerg                   __state |= ios_base::eofbit;
908*4d6fc14bSjoerg                   break;
909*4d6fc14bSjoerg                }
910*4d6fc14bSjoerg                char_type __ch = traits_type::to_char_type(__i);
911*4d6fc14bSjoerg                if (traits_type::eq(__ch, __dlm))
912*4d6fc14bSjoerg                {
913*4d6fc14bSjoerg                    this->rdbuf()->sbumpc();
914*4d6fc14bSjoerg                    ++__gc_;
915*4d6fc14bSjoerg                    break;
916*4d6fc14bSjoerg                }
917*4d6fc14bSjoerg                if (__gc_ >= __n-1)
918*4d6fc14bSjoerg                {
919*4d6fc14bSjoerg                    __state |= ios_base::failbit;
920*4d6fc14bSjoerg                    break;
921*4d6fc14bSjoerg                }
922*4d6fc14bSjoerg                *__s++ = __ch;
923*4d6fc14bSjoerg                this->rdbuf()->sbumpc();
924*4d6fc14bSjoerg                ++__gc_;
925*4d6fc14bSjoerg            }
926*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
927*4d6fc14bSjoerg        }
928*4d6fc14bSjoerg        catch (...)
929*4d6fc14bSjoerg        {
930*4d6fc14bSjoerg            __state |= ios_base::badbit;
931*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
932*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
933*4d6fc14bSjoerg            {
934*4d6fc14bSjoerg                if (__n > 0)
935*4d6fc14bSjoerg                    *__s = char_type();
936*4d6fc14bSjoerg                if (__gc_ == 0)
937*4d6fc14bSjoerg                    __state |= ios_base::failbit;
938*4d6fc14bSjoerg                throw;
939*4d6fc14bSjoerg            }
940*4d6fc14bSjoerg        }
941*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
942*4d6fc14bSjoerg    }
943*4d6fc14bSjoerg    if (__n > 0)
944*4d6fc14bSjoerg        *__s = char_type();
945*4d6fc14bSjoerg    if (__gc_ == 0)
946*4d6fc14bSjoerg        __state |= ios_base::failbit;
947*4d6fc14bSjoerg    this->setstate(__state);
948*4d6fc14bSjoerg    return *this;
949*4d6fc14bSjoerg}
950*4d6fc14bSjoerg
951*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
952*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
953*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
954*4d6fc14bSjoerg{
955*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
956*4d6fc14bSjoerg    __gc_ = 0;
957*4d6fc14bSjoerg    sentry __sen(*this, true);
958*4d6fc14bSjoerg    if (__sen)
959*4d6fc14bSjoerg    {
960*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
961*4d6fc14bSjoerg        try
962*4d6fc14bSjoerg        {
963*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
964*4d6fc14bSjoerg            if (__n == numeric_limits<streamsize>::max())
965*4d6fc14bSjoerg            {
966*4d6fc14bSjoerg                while (true)
967*4d6fc14bSjoerg                {
968*4d6fc14bSjoerg                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
969*4d6fc14bSjoerg                    if (traits_type::eq_int_type(__i, traits_type::eof()))
970*4d6fc14bSjoerg                    {
971*4d6fc14bSjoerg                       __state |= ios_base::eofbit;
972*4d6fc14bSjoerg                       break;
973*4d6fc14bSjoerg                    }
974*4d6fc14bSjoerg                    ++__gc_;
975*4d6fc14bSjoerg                    if (traits_type::eq_int_type(__i, __dlm))
976*4d6fc14bSjoerg                        break;
977*4d6fc14bSjoerg                }
978*4d6fc14bSjoerg            }
979*4d6fc14bSjoerg            else
980*4d6fc14bSjoerg            {
981*4d6fc14bSjoerg                while (__gc_ < __n)
982*4d6fc14bSjoerg                {
983*4d6fc14bSjoerg                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
984*4d6fc14bSjoerg                    if (traits_type::eq_int_type(__i, traits_type::eof()))
985*4d6fc14bSjoerg                    {
986*4d6fc14bSjoerg                       __state |= ios_base::eofbit;
987*4d6fc14bSjoerg                       break;
988*4d6fc14bSjoerg                    }
989*4d6fc14bSjoerg                    ++__gc_;
990*4d6fc14bSjoerg                    if (traits_type::eq_int_type(__i, __dlm))
991*4d6fc14bSjoerg                        break;
992*4d6fc14bSjoerg                }
993*4d6fc14bSjoerg            }
994*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
995*4d6fc14bSjoerg        }
996*4d6fc14bSjoerg        catch (...)
997*4d6fc14bSjoerg        {
998*4d6fc14bSjoerg            __state |= ios_base::badbit;
999*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1000*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1001*4d6fc14bSjoerg            {
1002*4d6fc14bSjoerg                throw;
1003*4d6fc14bSjoerg            }
1004*4d6fc14bSjoerg        }
1005*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1006*4d6fc14bSjoerg        this->setstate(__state);
1007*4d6fc14bSjoerg    }
1008*4d6fc14bSjoerg    return *this;
1009*4d6fc14bSjoerg}
1010*4d6fc14bSjoerg
1011*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1012*4d6fc14bSjoergtypename basic_istream<_CharT, _Traits>::int_type
1013*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::peek()
1014*4d6fc14bSjoerg{
1015*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1016*4d6fc14bSjoerg    __gc_ = 0;
1017*4d6fc14bSjoerg    int_type __r = traits_type::eof();
1018*4d6fc14bSjoerg    sentry __sen(*this, true);
1019*4d6fc14bSjoerg    if (__sen)
1020*4d6fc14bSjoerg    {
1021*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1022*4d6fc14bSjoerg        try
1023*4d6fc14bSjoerg        {
1024*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1025*4d6fc14bSjoerg            __r = this->rdbuf()->sgetc();
1026*4d6fc14bSjoerg            if (traits_type::eq_int_type(__r, traits_type::eof()))
1027*4d6fc14bSjoerg                __state |= ios_base::eofbit;
1028*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1029*4d6fc14bSjoerg        }
1030*4d6fc14bSjoerg        catch (...)
1031*4d6fc14bSjoerg        {
1032*4d6fc14bSjoerg            __state |= ios_base::badbit;
1033*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1034*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1035*4d6fc14bSjoerg            {
1036*4d6fc14bSjoerg                throw;
1037*4d6fc14bSjoerg            }
1038*4d6fc14bSjoerg        }
1039*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1040*4d6fc14bSjoerg        this->setstate(__state);
1041*4d6fc14bSjoerg    }
1042*4d6fc14bSjoerg    return __r;
1043*4d6fc14bSjoerg}
1044*4d6fc14bSjoerg
1045*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1046*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1047*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1048*4d6fc14bSjoerg{
1049*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1050*4d6fc14bSjoerg    __gc_ = 0;
1051*4d6fc14bSjoerg    sentry __sen(*this, true);
1052*4d6fc14bSjoerg    if (__sen)
1053*4d6fc14bSjoerg    {
1054*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1055*4d6fc14bSjoerg        try
1056*4d6fc14bSjoerg        {
1057*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1058*4d6fc14bSjoerg            __gc_ = this->rdbuf()->sgetn(__s, __n);
1059*4d6fc14bSjoerg            if (__gc_ != __n)
1060*4d6fc14bSjoerg                __state |= ios_base::failbit | ios_base::eofbit;
1061*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1062*4d6fc14bSjoerg        }
1063*4d6fc14bSjoerg        catch (...)
1064*4d6fc14bSjoerg        {
1065*4d6fc14bSjoerg            __state |= ios_base::badbit;
1066*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1067*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1068*4d6fc14bSjoerg            {
1069*4d6fc14bSjoerg                throw;
1070*4d6fc14bSjoerg            }
1071*4d6fc14bSjoerg        }
1072*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1073*4d6fc14bSjoerg    }
1074*4d6fc14bSjoerg    else
1075*4d6fc14bSjoerg    {
1076*4d6fc14bSjoerg        __state |= ios_base::failbit;
1077*4d6fc14bSjoerg    }
1078*4d6fc14bSjoerg    this->setstate(__state);
1079*4d6fc14bSjoerg    return *this;
1080*4d6fc14bSjoerg}
1081*4d6fc14bSjoerg
1082*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1083*4d6fc14bSjoergstreamsize
1084*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1085*4d6fc14bSjoerg{
1086*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1087*4d6fc14bSjoerg    __gc_ = 0;
1088*4d6fc14bSjoerg    sentry __sen(*this, true);
1089*4d6fc14bSjoerg    if (__sen)
1090*4d6fc14bSjoerg    {
1091*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1092*4d6fc14bSjoerg        try
1093*4d6fc14bSjoerg        {
1094*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1095*4d6fc14bSjoerg            streamsize __c = this->rdbuf()->in_avail();
1096*4d6fc14bSjoerg            switch (__c)
1097*4d6fc14bSjoerg            {
1098*4d6fc14bSjoerg            case -1:
1099*4d6fc14bSjoerg                __state |= ios_base::eofbit;
1100*4d6fc14bSjoerg                break;
1101*4d6fc14bSjoerg            case 0:
1102*4d6fc14bSjoerg                break;
1103*4d6fc14bSjoerg            default:
1104*4d6fc14bSjoerg                __n = _VSTD::min(__c, __n);
1105*4d6fc14bSjoerg                __gc_ = this->rdbuf()->sgetn(__s, __n);
1106*4d6fc14bSjoerg                if (__gc_ != __n)
1107*4d6fc14bSjoerg                    __state |= ios_base::failbit | ios_base::eofbit;
1108*4d6fc14bSjoerg                break;
1109*4d6fc14bSjoerg            }
1110*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1111*4d6fc14bSjoerg        }
1112*4d6fc14bSjoerg        catch (...)
1113*4d6fc14bSjoerg        {
1114*4d6fc14bSjoerg            __state |= ios_base::badbit;
1115*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1116*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1117*4d6fc14bSjoerg            {
1118*4d6fc14bSjoerg                throw;
1119*4d6fc14bSjoerg            }
1120*4d6fc14bSjoerg        }
1121*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1122*4d6fc14bSjoerg    }
1123*4d6fc14bSjoerg    else
1124*4d6fc14bSjoerg    {
1125*4d6fc14bSjoerg        __state |= ios_base::failbit;
1126*4d6fc14bSjoerg    }
1127*4d6fc14bSjoerg    this->setstate(__state);
1128*4d6fc14bSjoerg    return __gc_;
1129*4d6fc14bSjoerg}
1130*4d6fc14bSjoerg
1131*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1132*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1133*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::putback(char_type __c)
1134*4d6fc14bSjoerg{
1135*4d6fc14bSjoerg    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1136*4d6fc14bSjoerg    __gc_ = 0;
1137*4d6fc14bSjoerg    this->clear(__state);
1138*4d6fc14bSjoerg    sentry __sen(*this, true);
1139*4d6fc14bSjoerg    if (__sen)
1140*4d6fc14bSjoerg    {
1141*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1142*4d6fc14bSjoerg        try
1143*4d6fc14bSjoerg        {
1144*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1145*4d6fc14bSjoerg            if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1146*4d6fc14bSjoerg                __state |= ios_base::badbit;
1147*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1148*4d6fc14bSjoerg        }
1149*4d6fc14bSjoerg        catch (...)
1150*4d6fc14bSjoerg        {
1151*4d6fc14bSjoerg            __state |= ios_base::badbit;
1152*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1153*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1154*4d6fc14bSjoerg            {
1155*4d6fc14bSjoerg                throw;
1156*4d6fc14bSjoerg            }
1157*4d6fc14bSjoerg        }
1158*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1159*4d6fc14bSjoerg    }
1160*4d6fc14bSjoerg    else
1161*4d6fc14bSjoerg    {
1162*4d6fc14bSjoerg        __state |= ios_base::failbit;
1163*4d6fc14bSjoerg    }
1164*4d6fc14bSjoerg    this->setstate(__state);
1165*4d6fc14bSjoerg    return *this;
1166*4d6fc14bSjoerg}
1167*4d6fc14bSjoerg
1168*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1169*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1170*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::unget()
1171*4d6fc14bSjoerg{
1172*4d6fc14bSjoerg    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1173*4d6fc14bSjoerg    __gc_ = 0;
1174*4d6fc14bSjoerg    this->clear(__state);
1175*4d6fc14bSjoerg    sentry __sen(*this, true);
1176*4d6fc14bSjoerg    if (__sen)
1177*4d6fc14bSjoerg    {
1178*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1179*4d6fc14bSjoerg        try
1180*4d6fc14bSjoerg        {
1181*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1182*4d6fc14bSjoerg            if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
1183*4d6fc14bSjoerg                __state |= ios_base::badbit;
1184*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1185*4d6fc14bSjoerg        }
1186*4d6fc14bSjoerg        catch (...)
1187*4d6fc14bSjoerg        {
1188*4d6fc14bSjoerg            __state |= ios_base::badbit;
1189*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1190*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1191*4d6fc14bSjoerg            {
1192*4d6fc14bSjoerg                throw;
1193*4d6fc14bSjoerg            }
1194*4d6fc14bSjoerg        }
1195*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1196*4d6fc14bSjoerg    }
1197*4d6fc14bSjoerg    else
1198*4d6fc14bSjoerg    {
1199*4d6fc14bSjoerg        __state |= ios_base::failbit;
1200*4d6fc14bSjoerg    }
1201*4d6fc14bSjoerg    this->setstate(__state);
1202*4d6fc14bSjoerg    return *this;
1203*4d6fc14bSjoerg}
1204*4d6fc14bSjoerg
1205*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1206*4d6fc14bSjoergint
1207*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::sync()
1208*4d6fc14bSjoerg{
1209*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1210*4d6fc14bSjoerg    int __r = 0;
1211*4d6fc14bSjoerg    sentry __sen(*this, true);
1212*4d6fc14bSjoerg    if (__sen)
1213*4d6fc14bSjoerg    {
1214*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1215*4d6fc14bSjoerg        try
1216*4d6fc14bSjoerg        {
1217*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1218*4d6fc14bSjoerg            if (this->rdbuf() == nullptr)
1219*4d6fc14bSjoerg                return -1;
1220*4d6fc14bSjoerg            if (this->rdbuf()->pubsync() == -1)
1221*4d6fc14bSjoerg            {
1222*4d6fc14bSjoerg                __state |= ios_base::badbit;
1223*4d6fc14bSjoerg                return -1;
1224*4d6fc14bSjoerg            }
1225*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1226*4d6fc14bSjoerg        }
1227*4d6fc14bSjoerg        catch (...)
1228*4d6fc14bSjoerg        {
1229*4d6fc14bSjoerg            __state |= ios_base::badbit;
1230*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1231*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1232*4d6fc14bSjoerg            {
1233*4d6fc14bSjoerg                throw;
1234*4d6fc14bSjoerg            }
1235*4d6fc14bSjoerg        }
1236*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1237*4d6fc14bSjoerg        this->setstate(__state);
1238*4d6fc14bSjoerg    }
1239*4d6fc14bSjoerg    return __r;
1240*4d6fc14bSjoerg}
1241*4d6fc14bSjoerg
1242*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1243*4d6fc14bSjoergtypename basic_istream<_CharT, _Traits>::pos_type
1244*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::tellg()
1245*4d6fc14bSjoerg{
1246*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1247*4d6fc14bSjoerg    pos_type __r(-1);
1248*4d6fc14bSjoerg    sentry __sen(*this, true);
1249*4d6fc14bSjoerg    if (__sen)
1250*4d6fc14bSjoerg    {
1251*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1252*4d6fc14bSjoerg        try
1253*4d6fc14bSjoerg        {
1254*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1255*4d6fc14bSjoerg        __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1256*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1257*4d6fc14bSjoerg        }
1258*4d6fc14bSjoerg        catch (...)
1259*4d6fc14bSjoerg        {
1260*4d6fc14bSjoerg            __state |= ios_base::badbit;
1261*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1262*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1263*4d6fc14bSjoerg            {
1264*4d6fc14bSjoerg                throw;
1265*4d6fc14bSjoerg            }
1266*4d6fc14bSjoerg        }
1267*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1268*4d6fc14bSjoerg        this->setstate(__state);
1269*4d6fc14bSjoerg    }
1270*4d6fc14bSjoerg    return __r;
1271*4d6fc14bSjoerg}
1272*4d6fc14bSjoerg
1273*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1274*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1275*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1276*4d6fc14bSjoerg{
1277*4d6fc14bSjoerg    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1278*4d6fc14bSjoerg    this->clear(__state);
1279*4d6fc14bSjoerg    sentry __sen(*this, true);
1280*4d6fc14bSjoerg    if (__sen)
1281*4d6fc14bSjoerg    {
1282*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1283*4d6fc14bSjoerg        try
1284*4d6fc14bSjoerg        {
1285*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1286*4d6fc14bSjoerg            if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1287*4d6fc14bSjoerg                __state |= ios_base::failbit;
1288*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1289*4d6fc14bSjoerg        }
1290*4d6fc14bSjoerg        catch (...)
1291*4d6fc14bSjoerg        {
1292*4d6fc14bSjoerg            __state |= ios_base::badbit;
1293*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1294*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1295*4d6fc14bSjoerg            {
1296*4d6fc14bSjoerg                throw;
1297*4d6fc14bSjoerg            }
1298*4d6fc14bSjoerg        }
1299*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1300*4d6fc14bSjoerg        this->setstate(__state);
1301*4d6fc14bSjoerg    }
1302*4d6fc14bSjoerg    return *this;
1303*4d6fc14bSjoerg}
1304*4d6fc14bSjoerg
1305*4d6fc14bSjoergtemplate<class _CharT, class _Traits>
1306*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1307*4d6fc14bSjoergbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1308*4d6fc14bSjoerg{
1309*4d6fc14bSjoerg    ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1310*4d6fc14bSjoerg    this->clear(__state);
1311*4d6fc14bSjoerg    sentry __sen(*this, true);
1312*4d6fc14bSjoerg    if (__sen)
1313*4d6fc14bSjoerg    {
1314*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1315*4d6fc14bSjoerg        try
1316*4d6fc14bSjoerg        {
1317*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1318*4d6fc14bSjoerg            if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1319*4d6fc14bSjoerg                __state |= ios_base::failbit;
1320*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1321*4d6fc14bSjoerg        }
1322*4d6fc14bSjoerg        catch (...)
1323*4d6fc14bSjoerg        {
1324*4d6fc14bSjoerg            __state |= ios_base::badbit;
1325*4d6fc14bSjoerg            this->__setstate_nothrow(__state);
1326*4d6fc14bSjoerg            if (this->exceptions() & ios_base::badbit)
1327*4d6fc14bSjoerg            {
1328*4d6fc14bSjoerg                throw;
1329*4d6fc14bSjoerg            }
1330*4d6fc14bSjoerg        }
1331*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1332*4d6fc14bSjoerg        this->setstate(__state);
1333*4d6fc14bSjoerg    }
1334*4d6fc14bSjoerg    return *this;
1335*4d6fc14bSjoerg}
1336*4d6fc14bSjoerg
1337*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1338*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1339*4d6fc14bSjoergws(basic_istream<_CharT, _Traits>& __is)
1340*4d6fc14bSjoerg{
1341*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1342*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1343*4d6fc14bSjoerg    if (__sen)
1344*4d6fc14bSjoerg    {
1345*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1346*4d6fc14bSjoerg        try
1347*4d6fc14bSjoerg        {
1348*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1349*4d6fc14bSjoerg            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1350*4d6fc14bSjoerg            while (true)
1351*4d6fc14bSjoerg            {
1352*4d6fc14bSjoerg                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1353*4d6fc14bSjoerg                if (_Traits::eq_int_type(__i, _Traits::eof()))
1354*4d6fc14bSjoerg                {
1355*4d6fc14bSjoerg                   __state |= ios_base::eofbit;
1356*4d6fc14bSjoerg                   break;
1357*4d6fc14bSjoerg                }
1358*4d6fc14bSjoerg                if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
1359*4d6fc14bSjoerg                    break;
1360*4d6fc14bSjoerg                __is.rdbuf()->sbumpc();
1361*4d6fc14bSjoerg            }
1362*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1363*4d6fc14bSjoerg        }
1364*4d6fc14bSjoerg        catch (...)
1365*4d6fc14bSjoerg        {
1366*4d6fc14bSjoerg            __state |= ios_base::badbit;
1367*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
1368*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
1369*4d6fc14bSjoerg            {
1370*4d6fc14bSjoerg                throw;
1371*4d6fc14bSjoerg            }
1372*4d6fc14bSjoerg        }
1373*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
1374*4d6fc14bSjoerg        __is.setstate(__state);
1375*4d6fc14bSjoerg    }
1376*4d6fc14bSjoerg    return __is;
1377*4d6fc14bSjoerg}
1378*4d6fc14bSjoerg
1379*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1380*4d6fc14bSjoerg
1381*4d6fc14bSjoergtemplate <class _Stream, class _Tp, class = void>
1382*4d6fc14bSjoergstruct __is_istreamable : false_type { };
1383*4d6fc14bSjoerg
1384*4d6fc14bSjoergtemplate <class _Stream, class _Tp>
1385*4d6fc14bSjoergstruct __is_istreamable<_Stream, _Tp, decltype(
1386*4d6fc14bSjoerg    declval<_Stream>() >> declval<_Tp>(), void()
1387*4d6fc14bSjoerg)> : true_type { };
1388*4d6fc14bSjoerg
1389*4d6fc14bSjoergtemplate <class _Stream, class _Tp, class = typename enable_if<
1390*4d6fc14bSjoerg    _And<is_base_of<ios_base, _Stream>,
1391*4d6fc14bSjoerg         __is_istreamable<_Stream&, _Tp&&>>::value
1392*4d6fc14bSjoerg>::type>
1393*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY
1394*4d6fc14bSjoerg_Stream&& operator>>(_Stream&& __is, _Tp&& __x)
1395*4d6fc14bSjoerg{
1396*4d6fc14bSjoerg    __is >> _VSTD::forward<_Tp>(__x);
1397*4d6fc14bSjoerg    return _VSTD::move(__is);
1398*4d6fc14bSjoerg}
1399*4d6fc14bSjoerg
1400*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
1401*4d6fc14bSjoerg
1402*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1403*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_iostream
1404*4d6fc14bSjoerg    : public basic_istream<_CharT, _Traits>,
1405*4d6fc14bSjoerg      public basic_ostream<_CharT, _Traits>
1406*4d6fc14bSjoerg{
1407*4d6fc14bSjoergpublic:
1408*4d6fc14bSjoerg    // types:
1409*4d6fc14bSjoerg    typedef _CharT                         char_type;
1410*4d6fc14bSjoerg    typedef _Traits                        traits_type;
1411*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
1412*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
1413*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
1414*4d6fc14bSjoerg
1415*4d6fc14bSjoerg    // constructor/destructor
1416*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1417*4d6fc14bSjoerg    explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1418*4d6fc14bSjoerg      : basic_istream<_CharT, _Traits>(__sb)
1419*4d6fc14bSjoerg    {}
1420*4d6fc14bSjoerg
1421*4d6fc14bSjoerg    virtual ~basic_iostream();
1422*4d6fc14bSjoergprotected:
1423*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1424*4d6fc14bSjoerg    inline _LIBCPP_INLINE_VISIBILITY
1425*4d6fc14bSjoerg    basic_iostream(basic_iostream&& __rhs);
1426*4d6fc14bSjoerg
1427*4d6fc14bSjoerg    // assign/swap
1428*4d6fc14bSjoerg    inline _LIBCPP_INLINE_VISIBILITY
1429*4d6fc14bSjoerg    basic_iostream& operator=(basic_iostream&& __rhs);
1430*4d6fc14bSjoerg#endif
1431*4d6fc14bSjoerg    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
1432*4d6fc14bSjoerg    void swap(basic_iostream& __rhs)
1433*4d6fc14bSjoerg    { basic_istream<char_type, traits_type>::swap(__rhs); }
1434*4d6fc14bSjoerg};
1435*4d6fc14bSjoerg
1436*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1437*4d6fc14bSjoerg
1438*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1439*4d6fc14bSjoergbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
1440*4d6fc14bSjoerg    : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
1441*4d6fc14bSjoerg{
1442*4d6fc14bSjoerg}
1443*4d6fc14bSjoerg
1444*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1445*4d6fc14bSjoergbasic_iostream<_CharT, _Traits>&
1446*4d6fc14bSjoergbasic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1447*4d6fc14bSjoerg{
1448*4d6fc14bSjoerg    swap(__rhs);
1449*4d6fc14bSjoerg    return *this;
1450*4d6fc14bSjoerg}
1451*4d6fc14bSjoerg
1452*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
1453*4d6fc14bSjoerg
1454*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1455*4d6fc14bSjoergbasic_iostream<_CharT, _Traits>::~basic_iostream()
1456*4d6fc14bSjoerg{
1457*4d6fc14bSjoerg}
1458*4d6fc14bSjoerg
1459*4d6fc14bSjoergtemplate<class _CharT, class _Traits, class _Allocator>
1460*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1461*4d6fc14bSjoergoperator>>(basic_istream<_CharT, _Traits>& __is,
1462*4d6fc14bSjoerg           basic_string<_CharT, _Traits, _Allocator>& __str)
1463*4d6fc14bSjoerg{
1464*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1465*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1466*4d6fc14bSjoerg    if (__sen)
1467*4d6fc14bSjoerg    {
1468*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1469*4d6fc14bSjoerg        try
1470*4d6fc14bSjoerg        {
1471*4d6fc14bSjoerg#endif
1472*4d6fc14bSjoerg            __str.clear();
1473*4d6fc14bSjoerg            streamsize __n = __is.width();
1474*4d6fc14bSjoerg            if (__n <= 0)
1475*4d6fc14bSjoerg                __n = __str.max_size();
1476*4d6fc14bSjoerg            if (__n <= 0)
1477*4d6fc14bSjoerg                __n = numeric_limits<streamsize>::max();
1478*4d6fc14bSjoerg            streamsize __c = 0;
1479*4d6fc14bSjoerg            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1480*4d6fc14bSjoerg            while (__c < __n)
1481*4d6fc14bSjoerg            {
1482*4d6fc14bSjoerg                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1483*4d6fc14bSjoerg                if (_Traits::eq_int_type(__i, _Traits::eof()))
1484*4d6fc14bSjoerg                {
1485*4d6fc14bSjoerg                   __state |= ios_base::eofbit;
1486*4d6fc14bSjoerg                   break;
1487*4d6fc14bSjoerg                }
1488*4d6fc14bSjoerg                _CharT __ch = _Traits::to_char_type(__i);
1489*4d6fc14bSjoerg                if (__ct.is(__ct.space, __ch))
1490*4d6fc14bSjoerg                    break;
1491*4d6fc14bSjoerg                __str.push_back(__ch);
1492*4d6fc14bSjoerg                ++__c;
1493*4d6fc14bSjoerg                 __is.rdbuf()->sbumpc();
1494*4d6fc14bSjoerg            }
1495*4d6fc14bSjoerg            __is.width(0);
1496*4d6fc14bSjoerg            if (__c == 0)
1497*4d6fc14bSjoerg               __state |= ios_base::failbit;
1498*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1499*4d6fc14bSjoerg        }
1500*4d6fc14bSjoerg        catch (...)
1501*4d6fc14bSjoerg        {
1502*4d6fc14bSjoerg            __state |= ios_base::badbit;
1503*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
1504*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
1505*4d6fc14bSjoerg            {
1506*4d6fc14bSjoerg                throw;
1507*4d6fc14bSjoerg            }
1508*4d6fc14bSjoerg        }
1509*4d6fc14bSjoerg#endif
1510*4d6fc14bSjoerg        __is.setstate(__state);
1511*4d6fc14bSjoerg    }
1512*4d6fc14bSjoerg    return __is;
1513*4d6fc14bSjoerg}
1514*4d6fc14bSjoerg
1515*4d6fc14bSjoergtemplate<class _CharT, class _Traits, class _Allocator>
1516*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1517*4d6fc14bSjoerggetline(basic_istream<_CharT, _Traits>& __is,
1518*4d6fc14bSjoerg        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1519*4d6fc14bSjoerg{
1520*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1521*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1522*4d6fc14bSjoerg    if (__sen)
1523*4d6fc14bSjoerg    {
1524*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1525*4d6fc14bSjoerg        try
1526*4d6fc14bSjoerg        {
1527*4d6fc14bSjoerg#endif
1528*4d6fc14bSjoerg            __str.clear();
1529*4d6fc14bSjoerg            streamsize __extr = 0;
1530*4d6fc14bSjoerg            while (true)
1531*4d6fc14bSjoerg            {
1532*4d6fc14bSjoerg                typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1533*4d6fc14bSjoerg                if (_Traits::eq_int_type(__i, _Traits::eof()))
1534*4d6fc14bSjoerg                {
1535*4d6fc14bSjoerg                   __state |= ios_base::eofbit;
1536*4d6fc14bSjoerg                   break;
1537*4d6fc14bSjoerg                }
1538*4d6fc14bSjoerg                ++__extr;
1539*4d6fc14bSjoerg                _CharT __ch = _Traits::to_char_type(__i);
1540*4d6fc14bSjoerg                if (_Traits::eq(__ch, __dlm))
1541*4d6fc14bSjoerg                    break;
1542*4d6fc14bSjoerg                __str.push_back(__ch);
1543*4d6fc14bSjoerg                if (__str.size() == __str.max_size())
1544*4d6fc14bSjoerg                {
1545*4d6fc14bSjoerg                    __state |= ios_base::failbit;
1546*4d6fc14bSjoerg                    break;
1547*4d6fc14bSjoerg                }
1548*4d6fc14bSjoerg            }
1549*4d6fc14bSjoerg            if (__extr == 0)
1550*4d6fc14bSjoerg               __state |= ios_base::failbit;
1551*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1552*4d6fc14bSjoerg        }
1553*4d6fc14bSjoerg        catch (...)
1554*4d6fc14bSjoerg        {
1555*4d6fc14bSjoerg            __state |= ios_base::badbit;
1556*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
1557*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
1558*4d6fc14bSjoerg            {
1559*4d6fc14bSjoerg                throw;
1560*4d6fc14bSjoerg            }
1561*4d6fc14bSjoerg        }
1562*4d6fc14bSjoerg#endif
1563*4d6fc14bSjoerg        __is.setstate(__state);
1564*4d6fc14bSjoerg    }
1565*4d6fc14bSjoerg    return __is;
1566*4d6fc14bSjoerg}
1567*4d6fc14bSjoerg
1568*4d6fc14bSjoergtemplate<class _CharT, class _Traits, class _Allocator>
1569*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
1570*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1571*4d6fc14bSjoerggetline(basic_istream<_CharT, _Traits>& __is,
1572*4d6fc14bSjoerg        basic_string<_CharT, _Traits, _Allocator>& __str)
1573*4d6fc14bSjoerg{
1574*4d6fc14bSjoerg    return getline(__is, __str, __is.widen('\n'));
1575*4d6fc14bSjoerg}
1576*4d6fc14bSjoerg
1577*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1578*4d6fc14bSjoerg
1579*4d6fc14bSjoergtemplate<class _CharT, class _Traits, class _Allocator>
1580*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
1581*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1582*4d6fc14bSjoerggetline(basic_istream<_CharT, _Traits>&& __is,
1583*4d6fc14bSjoerg        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1584*4d6fc14bSjoerg{
1585*4d6fc14bSjoerg    return getline(__is, __str, __dlm);
1586*4d6fc14bSjoerg}
1587*4d6fc14bSjoerg
1588*4d6fc14bSjoergtemplate<class _CharT, class _Traits, class _Allocator>
1589*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
1590*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1591*4d6fc14bSjoerggetline(basic_istream<_CharT, _Traits>&& __is,
1592*4d6fc14bSjoerg        basic_string<_CharT, _Traits, _Allocator>& __str)
1593*4d6fc14bSjoerg{
1594*4d6fc14bSjoerg    return getline(__is, __str, __is.widen('\n'));
1595*4d6fc14bSjoerg}
1596*4d6fc14bSjoerg
1597*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
1598*4d6fc14bSjoerg
1599*4d6fc14bSjoergtemplate <class _CharT, class _Traits, size_t _Size>
1600*4d6fc14bSjoergbasic_istream<_CharT, _Traits>&
1601*4d6fc14bSjoergoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1602*4d6fc14bSjoerg{
1603*4d6fc14bSjoerg    ios_base::iostate __state = ios_base::goodbit;
1604*4d6fc14bSjoerg    typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1605*4d6fc14bSjoerg    if (__sen)
1606*4d6fc14bSjoerg    {
1607*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1608*4d6fc14bSjoerg        try
1609*4d6fc14bSjoerg        {
1610*4d6fc14bSjoerg#endif
1611*4d6fc14bSjoerg            basic_string<_CharT, _Traits> __str;
1612*4d6fc14bSjoerg            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1613*4d6fc14bSjoerg            size_t __c = 0;
1614*4d6fc14bSjoerg            _CharT __zero = __ct.widen('0');
1615*4d6fc14bSjoerg            _CharT __one = __ct.widen('1');
1616*4d6fc14bSjoerg            while (__c < _Size)
1617*4d6fc14bSjoerg            {
1618*4d6fc14bSjoerg                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1619*4d6fc14bSjoerg                if (_Traits::eq_int_type(__i, _Traits::eof()))
1620*4d6fc14bSjoerg                {
1621*4d6fc14bSjoerg                   __state |= ios_base::eofbit;
1622*4d6fc14bSjoerg                   break;
1623*4d6fc14bSjoerg                }
1624*4d6fc14bSjoerg                _CharT __ch = _Traits::to_char_type(__i);
1625*4d6fc14bSjoerg                if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
1626*4d6fc14bSjoerg                    break;
1627*4d6fc14bSjoerg                __str.push_back(__ch);
1628*4d6fc14bSjoerg                ++__c;
1629*4d6fc14bSjoerg                 __is.rdbuf()->sbumpc();
1630*4d6fc14bSjoerg            }
1631*4d6fc14bSjoerg            __x = bitset<_Size>(__str);
1632*4d6fc14bSjoerg            if (_Size > 0 && __c == 0)
1633*4d6fc14bSjoerg               __state |= ios_base::failbit;
1634*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
1635*4d6fc14bSjoerg        }
1636*4d6fc14bSjoerg        catch (...)
1637*4d6fc14bSjoerg        {
1638*4d6fc14bSjoerg            __state |= ios_base::badbit;
1639*4d6fc14bSjoerg            __is.__setstate_nothrow(__state);
1640*4d6fc14bSjoerg            if (__is.exceptions() & ios_base::badbit)
1641*4d6fc14bSjoerg            {
1642*4d6fc14bSjoerg                throw;
1643*4d6fc14bSjoerg            }
1644*4d6fc14bSjoerg        }
1645*4d6fc14bSjoerg#endif
1646*4d6fc14bSjoerg        __is.setstate(__state);
1647*4d6fc14bSjoerg    }
1648*4d6fc14bSjoerg    return __is;
1649*4d6fc14bSjoerg}
1650*4d6fc14bSjoerg
1651*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1652*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1653*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
1654*4d6fc14bSjoerg
1655*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD
1656*4d6fc14bSjoerg
1657*4d6fc14bSjoerg_LIBCPP_POP_MACROS
1658*4d6fc14bSjoerg
1659*4d6fc14bSjoerg#endif // _LIBCPP_ISTREAM
1660