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