blob: 9a8bb44ef3ece8fc5c4974d5a503a6968d44a551 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- istream ----------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_ISTREAM
12#define _LIBCPP_ISTREAM
13
14/*
15 istream synopsis
16
17template <class charT, class traits = char_traits<charT> >
18class basic_istream
19 : virtual public basic_ios<charT,traits>
20{
21public:
22 // types (inherited from basic_ios (27.5.4)):
23 typedef charT char_type;
24 typedef traits traits_type;
25 typedef typename traits_type::int_type int_type;
26 typedef typename traits_type::pos_type pos_type;
27 typedef typename traits_type::off_type off_type;
28
29 // 27.7.1.1.1 Constructor/destructor:
30 explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
31 basic_istream(basic_istream&& rhs);
32 virtual ~basic_istream();
33
34 // 27.7.1.1.2 Assign/swap:
35 basic_istream& operator=(basic_istream&& rhs);
36 void swap(basic_istream& rhs);
37
38 // 27.7.1.1.3 Prefix/suffix:
39 class sentry;
40
41 // 27.7.1.2 Formatted input:
42 basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
43 basic_istream& operator>>(basic_ios<char_type, traits_type>&
44 (*pf)(basic_ios<char_type, traits_type>&));
45 basic_istream& operator>>(ios_base& (*pf)(ios_base&));
46 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
47 basic_istream& operator>>(bool& n);
48 basic_istream& operator>>(short& n);
49 basic_istream& operator>>(unsigned short& n);
50 basic_istream& operator>>(int& n);
51 basic_istream& operator>>(unsigned int& n);
52 basic_istream& operator>>(long& n);
53 basic_istream& operator>>(unsigned long& n);
54 basic_istream& operator>>(long long& n);
55 basic_istream& operator>>(unsigned long long& n);
56 basic_istream& operator>>(float& f);
57 basic_istream& operator>>(double& f);
58 basic_istream& operator>>(long double& f);
59 basic_istream& operator>>(void*& p);
60
61 // 27.7.1.3 Unformatted input:
62 streamsize gcount() const;
63 int_type get();
64 basic_istream& get(char_type& c);
65 basic_istream& get(char_type* s, streamsize n);
66 basic_istream& get(char_type* s, streamsize n, char_type delim);
67 basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
68 basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
69
70 basic_istream& getline(char_type* s, streamsize n);
71 basic_istream& getline(char_type* s, streamsize n, char_type delim);
72
73 basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
74 int_type peek();
75 basic_istream& read (char_type* s, streamsize n);
76 streamsize readsome(char_type* s, streamsize n);
77
78 basic_istream& putback(char_type c);
79 basic_istream& unget();
80 int sync();
81
82 pos_type tellg();
83 basic_istream& seekg(pos_type);
84 basic_istream& seekg(off_type, ios_base::seekdir);
Marshall Clow27d29872014-09-16 15:27:01 +000085protected:
86 basic_istream(const basic_istream& rhs) = delete;
87 basic_istream(basic_istream&& rhs);
88 // 27.7.2.1.2 Assign/swap:
89 basic_istream& operator=(const basic_istream& rhs) = delete;
90 basic_istream& operator=(basic_istream&& rhs);
91 void swap(basic_istream& rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +000092};
93
94// 27.7.1.2.3 character extraction templates:
95template<class charT, class traits>
96 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
97
98template<class traits>
99 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
100
101template<class traits>
102 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
103
104template<class charT, class traits>
105 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
106
107template<class traits>
108 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
109
110template<class traits>
111 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
112
113template <class charT, class traits>
114 void
115 swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
116
117typedef basic_istream<char> istream;
118typedef basic_istream<wchar_t> wistream;
119
120template <class charT, class traits = char_traits<charT> >
121class basic_iostream :
122 public basic_istream<charT,traits>,
123 public basic_ostream<charT,traits>
124{
125public:
126 // types:
127 typedef charT char_type;
128 typedef traits traits_type;
129 typedef typename traits_type::int_type int_type;
130 typedef typename traits_type::pos_type pos_type;
131 typedef typename traits_type::off_type off_type;
132
133 // constructor/destructor
134 explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
135 basic_iostream(basic_iostream&& rhs);
136 virtual ~basic_iostream();
137
138 // assign/swap
139 basic_iostream& operator=(basic_iostream&& rhs);
140 void swap(basic_iostream& rhs);
141};
142
143template <class charT, class traits>
144 void
145 swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
146
147typedef basic_iostream<char> iostream;
148typedef basic_iostream<wchar_t> wiostream;
149
150template <class charT, class traits>
151 basic_istream<charT,traits>&
152 ws(basic_istream<charT,traits>& is);
153
154template <class charT, class traits, class T>
155 basic_istream<charT, traits>&
156 operator>>(basic_istream<charT, traits>&& is, T& x);
157
158} // std
159
160*/
161
162#include <__config>
163#include <ostream>
164
Howard Hinnantc5a5fbd2011-11-29 16:45:27 +0000165#include <__undef_min_max>
166
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000167#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000168#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000169#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000170
171_LIBCPP_BEGIN_NAMESPACE_STD
172
173template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000174class _LIBCPP_TEMPLATE_VIS basic_istream
Howard Hinnantc51e1022010-05-11 19:42:16 +0000175 : virtual public basic_ios<_CharT, _Traits>
176{
177 streamsize __gc_;
178public:
179 // types (inherited from basic_ios (27.5.4)):
180 typedef _CharT char_type;
181 typedef _Traits traits_type;
182 typedef typename traits_type::int_type int_type;
183 typedef typename traits_type::pos_type pos_type;
184 typedef typename traits_type::off_type off_type;
185
186 // 27.7.1.1.1 Constructor/destructor:
Eric Fiselier815ed732016-09-16 00:00:48 +0000187 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
188 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
189 { this->init(__sb); }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000190 virtual ~basic_istream();
191protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +0000192#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +0000193 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000194 basic_istream(basic_istream&& __rhs);
Eric Fiselier78ccf772017-04-18 23:38:41 +0000195
Howard Hinnantc51e1022010-05-11 19:42:16 +0000196 // 27.7.1.1.2 Assign/swap:
Eric Fiselier815ed732016-09-16 00:00:48 +0000197 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000198 basic_istream& operator=(basic_istream&& __rhs);
199#endif
Eric Fiselier815ed732016-09-16 00:00:48 +0000200
201 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
202 void swap(basic_istream& __rhs) {
203 _VSTD::swap(__gc_, __rhs.__gc_);
204 basic_ios<char_type, traits_type>::swap(__rhs);
205 }
Marshall Clow27d29872014-09-16 15:27:01 +0000206
Eric Fiselier2d8515f2017-01-06 20:58:25 +0000207#ifndef _LIBCPP_CXX03_LANG
Marshall Clow242d9c12014-09-16 15:33:53 +0000208 basic_istream (const basic_istream& __rhs) = delete;
209 basic_istream& operator=(const basic_istream& __rhs) = delete;
Marshall Clow27d29872014-09-16 15:27:01 +0000210#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000211public:
212
213 // 27.7.1.1.3 Prefix/suffix:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000214 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000215
216 // 27.7.1.2 Formatted input:
Eric Fiselier815ed732016-09-16 00:00:48 +0000217 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
218 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
219 { return __pf(*this); }
220
221 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000222 basic_istream& operator>>(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000223 (*__pf)(basic_ios<char_type, traits_type>&))
224 { __pf(*this); return *this; }
225
226 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
227 basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
228 { __pf(*this); return *this; }
229
Howard Hinnantc51e1022010-05-11 19:42:16 +0000230 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
231 basic_istream& operator>>(bool& __n);
232 basic_istream& operator>>(short& __n);
233 basic_istream& operator>>(unsigned short& __n);
234 basic_istream& operator>>(int& __n);
235 basic_istream& operator>>(unsigned int& __n);
236 basic_istream& operator>>(long& __n);
237 basic_istream& operator>>(unsigned long& __n);
238 basic_istream& operator>>(long long& __n);
239 basic_istream& operator>>(unsigned long long& __n);
240 basic_istream& operator>>(float& __f);
241 basic_istream& operator>>(double& __f);
242 basic_istream& operator>>(long double& __f);
243 basic_istream& operator>>(void*& __p);
244
245 // 27.7.1.3 Unformatted input:
Howard Hinnant64da2602010-09-22 15:29:08 +0000246 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247 streamsize gcount() const {return __gc_;}
248 int_type get();
Eric Fiselier815ed732016-09-16 00:00:48 +0000249
250 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
251 basic_istream& get(char_type& __c) {
252 int_type __ch = get();
253 if (__ch != traits_type::eof())
254 __c = traits_type::to_char_type(__ch);
255 return *this;
256 }
257
258 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
259 basic_istream& get(char_type* __s, streamsize __n)
260 { return get(__s, __n, this->widen('\n')); }
261
Howard Hinnantc51e1022010-05-11 19:42:16 +0000262 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
Eric Fiselier815ed732016-09-16 00:00:48 +0000263
264 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
265 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
266 { return get(__sb, this->widen('\n')); }
267
Howard Hinnantc51e1022010-05-11 19:42:16 +0000268 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
269
Eric Fiselier815ed732016-09-16 00:00:48 +0000270 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
271 basic_istream& getline(char_type* __s, streamsize __n)
272 { return getline(__s, __n, this->widen('\n')); }
273
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
275
276 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
277 int_type peek();
278 basic_istream& read (char_type* __s, streamsize __n);
279 streamsize readsome(char_type* __s, streamsize __n);
280
281 basic_istream& putback(char_type __c);
282 basic_istream& unget();
283 int sync();
284
285 pos_type tellg();
286 basic_istream& seekg(pos_type __pos);
287 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
288};
289
290template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000291class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292{
293 bool __ok_;
294
295 sentry(const sentry&); // = delete;
296 sentry& operator=(const sentry&); // = delete;
297
298public:
299 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
300// ~sentry() = default;
301
Howard Hinnant64da2602010-09-22 15:29:08 +0000302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant86a291f2012-02-21 21:46:43 +0000303 _LIBCPP_EXPLICIT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304 operator bool() const {return __ok_;}
305};
306
307template <class _CharT, class _Traits>
308basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
309 bool __noskipws)
310 : __ok_(false)
311{
312 if (__is.good())
313 {
314 if (__is.tie())
315 __is.tie()->flush();
316 if (!__noskipws && (__is.flags() & ios_base::skipws))
317 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000318 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000319 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantc834c512011-11-29 18:15:50 +0000320 _Ip __i(__is);
321 _Ip __eof;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000322 for (; __i != __eof; ++__i)
323 if (!__ct.is(__ct.space, *__i))
324 break;
325 if (__i == __eof)
326 __is.setstate(ios_base::failbit | ios_base::eofbit);
327 }
328 __ok_ = __is.good();
329 }
330 else
331 __is.setstate(ios_base::failbit);
332}
333
Eric Fiselier78ccf772017-04-18 23:38:41 +0000334#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000335
336template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
338 : __gc_(__rhs.__gc_)
339{
340 __rhs.__gc_ = 0;
341 this->move(__rhs);
342}
343
344template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000345basic_istream<_CharT, _Traits>&
346basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
347{
348 swap(__rhs);
349 return *this;
350}
351
Eric Fiselier78ccf772017-04-18 23:38:41 +0000352#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353
354template <class _CharT, class _Traits>
355basic_istream<_CharT, _Traits>::~basic_istream()
356{
357}
358
359template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360basic_istream<_CharT, _Traits>&
361basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
362{
363#ifndef _LIBCPP_NO_EXCEPTIONS
364 try
365 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000366#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 sentry __s(*this);
368 if (__s)
369 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000370 typedef istreambuf_iterator<char_type, traits_type> _Ip;
371 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000373 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374 this->setstate(__err);
375 }
376#ifndef _LIBCPP_NO_EXCEPTIONS
377 }
378 catch (...)
379 {
380 this->__set_badbit_and_consider_rethrow();
381 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000382#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 return *this;
384}
385
386template <class _CharT, class _Traits>
387basic_istream<_CharT, _Traits>&
388basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
389{
390#ifndef _LIBCPP_NO_EXCEPTIONS
391 try
392 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000393#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000394 sentry __s(*this);
395 if (__s)
396 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000397 typedef istreambuf_iterator<char_type, traits_type> _Ip;
398 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000400 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401 this->setstate(__err);
402 }
403#ifndef _LIBCPP_NO_EXCEPTIONS
404 }
405 catch (...)
406 {
407 this->__set_badbit_and_consider_rethrow();
408 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000409#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000410 return *this;
411}
412
413template <class _CharT, class _Traits>
414basic_istream<_CharT, _Traits>&
415basic_istream<_CharT, _Traits>::operator>>(long& __n)
416{
417#ifndef _LIBCPP_NO_EXCEPTIONS
418 try
419 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000420#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000421 sentry __s(*this);
422 if (__s)
423 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000424 typedef istreambuf_iterator<char_type, traits_type> _Ip;
425 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000427 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428 this->setstate(__err);
429 }
430#ifndef _LIBCPP_NO_EXCEPTIONS
431 }
432 catch (...)
433 {
434 this->__set_badbit_and_consider_rethrow();
435 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000436#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437 return *this;
438}
439
440template <class _CharT, class _Traits>
441basic_istream<_CharT, _Traits>&
442basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
443{
444#ifndef _LIBCPP_NO_EXCEPTIONS
445 try
446 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000447#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000448 sentry __s(*this);
449 if (__s)
450 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000451 typedef istreambuf_iterator<char_type, traits_type> _Ip;
452 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000453 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000454 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000455 this->setstate(__err);
456 }
457#ifndef _LIBCPP_NO_EXCEPTIONS
458 }
459 catch (...)
460 {
461 this->__set_badbit_and_consider_rethrow();
462 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000463#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464 return *this;
465}
466
467template <class _CharT, class _Traits>
468basic_istream<_CharT, _Traits>&
469basic_istream<_CharT, _Traits>::operator>>(long long& __n)
470{
471#ifndef _LIBCPP_NO_EXCEPTIONS
472 try
473 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000474#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475 sentry __s(*this);
476 if (__s)
477 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000478 typedef istreambuf_iterator<char_type, traits_type> _Ip;
479 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000480 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000481 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482 this->setstate(__err);
483 }
484#ifndef _LIBCPP_NO_EXCEPTIONS
485 }
486 catch (...)
487 {
488 this->__set_badbit_and_consider_rethrow();
489 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000490#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000491 return *this;
492}
493
494template <class _CharT, class _Traits>
495basic_istream<_CharT, _Traits>&
496basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
497{
498#ifndef _LIBCPP_NO_EXCEPTIONS
499 try
500 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000501#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502 sentry __s(*this);
503 if (__s)
504 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000505 typedef istreambuf_iterator<char_type, traits_type> _Ip;
506 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000507 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000508 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000509 this->setstate(__err);
510 }
511#ifndef _LIBCPP_NO_EXCEPTIONS
512 }
513 catch (...)
514 {
515 this->__set_badbit_and_consider_rethrow();
516 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000517#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518 return *this;
519}
520
521template <class _CharT, class _Traits>
522basic_istream<_CharT, _Traits>&
523basic_istream<_CharT, _Traits>::operator>>(float& __n)
524{
525#ifndef _LIBCPP_NO_EXCEPTIONS
526 try
527 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000528#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529 sentry __s(*this);
530 if (__s)
531 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000532 typedef istreambuf_iterator<char_type, traits_type> _Ip;
533 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000535 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536 this->setstate(__err);
537 }
538#ifndef _LIBCPP_NO_EXCEPTIONS
539 }
540 catch (...)
541 {
542 this->__set_badbit_and_consider_rethrow();
543 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000544#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545 return *this;
546}
547
548template <class _CharT, class _Traits>
549basic_istream<_CharT, _Traits>&
550basic_istream<_CharT, _Traits>::operator>>(double& __n)
551{
552#ifndef _LIBCPP_NO_EXCEPTIONS
553 try
554 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000555#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000556 sentry __s(*this);
557 if (__s)
558 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000559 typedef istreambuf_iterator<char_type, traits_type> _Ip;
560 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000561 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000562 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000563 this->setstate(__err);
564 }
565#ifndef _LIBCPP_NO_EXCEPTIONS
566 }
567 catch (...)
568 {
569 this->__set_badbit_and_consider_rethrow();
570 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000571#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000572 return *this;
573}
574
575template <class _CharT, class _Traits>
576basic_istream<_CharT, _Traits>&
577basic_istream<_CharT, _Traits>::operator>>(long double& __n)
578{
579#ifndef _LIBCPP_NO_EXCEPTIONS
580 try
581 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000582#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000583 sentry __s(*this);
584 if (__s)
585 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000586 typedef istreambuf_iterator<char_type, traits_type> _Ip;
587 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000588 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000589 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000590 this->setstate(__err);
591 }
592#ifndef _LIBCPP_NO_EXCEPTIONS
593 }
594 catch (...)
595 {
596 this->__set_badbit_and_consider_rethrow();
597 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000598#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000599 return *this;
600}
601
602template <class _CharT, class _Traits>
603basic_istream<_CharT, _Traits>&
604basic_istream<_CharT, _Traits>::operator>>(bool& __n)
605{
606#ifndef _LIBCPP_NO_EXCEPTIONS
607 try
608 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000609#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610 sentry __s(*this);
611 if (__s)
612 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000613 typedef istreambuf_iterator<char_type, traits_type> _Ip;
614 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000615 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000616 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000617 this->setstate(__err);
618 }
619#ifndef _LIBCPP_NO_EXCEPTIONS
620 }
621 catch (...)
622 {
623 this->__set_badbit_and_consider_rethrow();
624 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000625#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000626 return *this;
627}
628
629template <class _CharT, class _Traits>
630basic_istream<_CharT, _Traits>&
631basic_istream<_CharT, _Traits>::operator>>(void*& __n)
632{
633#ifndef _LIBCPP_NO_EXCEPTIONS
634 try
635 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000636#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000637 sentry __s(*this);
638 if (__s)
639 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000640 typedef istreambuf_iterator<char_type, traits_type> _Ip;
641 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000642 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000643 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000644 this->setstate(__err);
645 }
646#ifndef _LIBCPP_NO_EXCEPTIONS
647 }
648 catch (...)
649 {
650 this->__set_badbit_and_consider_rethrow();
651 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000652#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653 return *this;
654}
655
656template <class _CharT, class _Traits>
657basic_istream<_CharT, _Traits>&
658basic_istream<_CharT, _Traits>::operator>>(short& __n)
659{
660#ifndef _LIBCPP_NO_EXCEPTIONS
661 try
662 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000663#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000664 sentry __s(*this);
665 if (__s)
666 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000667 typedef istreambuf_iterator<char_type, traits_type> _Ip;
668 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000669 ios_base::iostate __err = ios_base::goodbit;
670 long __temp;
Howard Hinnantc834c512011-11-29 18:15:50 +0000671 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000672 if (__temp < numeric_limits<short>::min())
673 {
674 __err |= ios_base::failbit;
675 __n = numeric_limits<short>::min();
676 }
677 else if (__temp > numeric_limits<short>::max())
678 {
679 __err |= ios_base::failbit;
680 __n = numeric_limits<short>::max();
681 }
682 else
683 __n = static_cast<short>(__temp);
684 this->setstate(__err);
685 }
686#ifndef _LIBCPP_NO_EXCEPTIONS
687 }
688 catch (...)
689 {
690 this->__set_badbit_and_consider_rethrow();
691 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000692#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000693 return *this;
694}
695
696template <class _CharT, class _Traits>
697basic_istream<_CharT, _Traits>&
698basic_istream<_CharT, _Traits>::operator>>(int& __n)
699{
700#ifndef _LIBCPP_NO_EXCEPTIONS
701 try
702 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000703#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000704 sentry __s(*this);
705 if (__s)
706 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000707 typedef istreambuf_iterator<char_type, traits_type> _Ip;
708 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000709 ios_base::iostate __err = ios_base::goodbit;
710 long __temp;
Howard Hinnantc834c512011-11-29 18:15:50 +0000711 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000712 if (__temp < numeric_limits<int>::min())
713 {
714 __err |= ios_base::failbit;
715 __n = numeric_limits<int>::min();
716 }
717 else if (__temp > numeric_limits<int>::max())
718 {
719 __err |= ios_base::failbit;
720 __n = numeric_limits<int>::max();
721 }
722 else
723 __n = static_cast<int>(__temp);
724 this->setstate(__err);
725 }
726#ifndef _LIBCPP_NO_EXCEPTIONS
727 }
728 catch (...)
729 {
730 this->__set_badbit_and_consider_rethrow();
731 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000732#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000733 return *this;
734}
735
Howard Hinnantc51e1022010-05-11 19:42:16 +0000736template<class _CharT, class _Traits>
737basic_istream<_CharT, _Traits>&
738operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
739{
740#ifndef _LIBCPP_NO_EXCEPTIONS
741 try
742 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000743#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000744 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
745 if (__sen)
746 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000747 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +0000748 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000749 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
750 streamsize __c = 0;
751 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +0000752 ios_base::iostate __err = ios_base::goodbit;
753 while (__c < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000754 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000755 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
756 if (_Traits::eq_int_type(__i, _Traits::eof()))
757 {
758 __err |= ios_base::eofbit;
759 break;
760 }
761 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000762 if (__ct.is(__ct.space, __ch))
763 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000764 *__s++ = __ch;
765 ++__c;
766 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767 }
768 *__s = _CharT();
769 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000770 if (__c == 0)
771 __err |= ios_base::failbit;
772 __is.setstate(__err);
773 }
774#ifndef _LIBCPP_NO_EXCEPTIONS
775 }
776 catch (...)
777 {
778 __is.__set_badbit_and_consider_rethrow();
779 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000780#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000781 return __is;
782}
783
784template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000785inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000786basic_istream<char, _Traits>&
787operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
788{
789 return __is >> (char*)__s;
790}
791
792template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000794basic_istream<char, _Traits>&
795operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
796{
797 return __is >> (char*)__s;
798}
799
800template<class _CharT, class _Traits>
801basic_istream<_CharT, _Traits>&
802operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
803{
804#ifndef _LIBCPP_NO_EXCEPTIONS
805 try
806 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000807#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000808 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
809 if (__sen)
810 {
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000811 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
812 if (_Traits::eq_int_type(__i, _Traits::eof()))
813 __is.setstate(ios_base::eofbit | ios_base::failbit);
814 else
815 __c = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816 }
817#ifndef _LIBCPP_NO_EXCEPTIONS
818 }
819 catch (...)
820 {
821 __is.__set_badbit_and_consider_rethrow();
822 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000823#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000824 return __is;
825}
826
827template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000828inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000829basic_istream<char, _Traits>&
830operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
831{
832 return __is >> (char&)__c;
833}
834
835template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000836inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000837basic_istream<char, _Traits>&
838operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
839{
840 return __is >> (char&)__c;
841}
842
843template<class _CharT, class _Traits>
844basic_istream<_CharT, _Traits>&
845basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
846{
847 __gc_ = 0;
848#ifndef _LIBCPP_NO_EXCEPTIONS
849 try
850 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000851#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000852 sentry __s(*this, true);
853 if (__s)
854 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000855 if (__sb)
856 {
857#ifndef _LIBCPP_NO_EXCEPTIONS
858 try
859 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000860#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000862 while (true)
863 {
864 typename traits_type::int_type __i = this->rdbuf()->sgetc();
865 if (traits_type::eq_int_type(__i, _Traits::eof()))
866 {
867 __err |= ios_base::eofbit;
868 break;
869 }
870 if (traits_type::eq_int_type(
871 __sb->sputc(traits_type::to_char_type(__i)),
872 traits_type::eof()))
873 break;
874 ++__gc_;
875 this->rdbuf()->sbumpc();
876 }
877 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000878 __err |= ios_base::failbit;
879 this->setstate(__err);
880#ifndef _LIBCPP_NO_EXCEPTIONS
881 }
882 catch (...)
883 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000884 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000885 this->__set_failbit_and_consider_rethrow();
886 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000887#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888 }
889 else
890 this->setstate(ios_base::failbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000891 }
892#ifndef _LIBCPP_NO_EXCEPTIONS
893 }
894 catch (...)
895 {
896 this->__set_badbit_and_consider_rethrow();
897 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000898#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899 return *this;
900}
901
902template<class _CharT, class _Traits>
903typename basic_istream<_CharT, _Traits>::int_type
904basic_istream<_CharT, _Traits>::get()
905{
906 __gc_ = 0;
907 int_type __r = traits_type::eof();
908#ifndef _LIBCPP_NO_EXCEPTIONS
909 try
910 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000911#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912 sentry __s(*this, true);
913 if (__s)
914 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000915 __r = this->rdbuf()->sbumpc();
916 if (traits_type::eq_int_type(__r, traits_type::eof()))
917 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000918 else
Howard Hinnante51e4e92011-09-01 21:02:45 +0000919 __gc_ = 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000920 }
921#ifndef _LIBCPP_NO_EXCEPTIONS
922 }
923 catch (...)
924 {
925 this->__set_badbit_and_consider_rethrow();
926 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000927#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000928 return __r;
929}
930
931template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000932basic_istream<_CharT, _Traits>&
933basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
934{
935 __gc_ = 0;
936#ifndef _LIBCPP_NO_EXCEPTIONS
937 try
938 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000939#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000940 sentry __sen(*this, true);
941 if (__sen)
942 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000943 if (__n > 0)
944 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000945 ios_base::iostate __err = ios_base::goodbit;
946 while (__gc_ < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000948 int_type __i = this->rdbuf()->sgetc();
949 if (traits_type::eq_int_type(__i, traits_type::eof()))
950 {
951 __err |= ios_base::eofbit;
952 break;
953 }
954 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000955 if (traits_type::eq(__ch, __dlm))
956 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000957 *__s++ = __ch;
958 ++__gc_;
959 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000960 }
961 *__s = char_type();
Howard Hinnante51e4e92011-09-01 21:02:45 +0000962 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000963 __err |= ios_base::failbit;
964 this->setstate(__err);
965 }
966 else
967 this->setstate(ios_base::failbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000968 }
969#ifndef _LIBCPP_NO_EXCEPTIONS
970 }
971 catch (...)
972 {
973 this->__set_badbit_and_consider_rethrow();
974 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000975#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000976 return *this;
977}
978
979template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000980basic_istream<_CharT, _Traits>&
981basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
982 char_type __dlm)
983{
984 __gc_ = 0;
985#ifndef _LIBCPP_NO_EXCEPTIONS
986 try
987 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000988#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000989 sentry __sen(*this, true);
990 if (__sen)
991 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000992 ios_base::iostate __err = ios_base::goodbit;
993#ifndef _LIBCPP_NO_EXCEPTIONS
994 try
995 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000996#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000997 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000998 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000999 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1000 if (traits_type::eq_int_type(__i, traits_type::eof()))
1001 {
1002 __err |= ios_base::eofbit;
1003 break;
1004 }
1005 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001006 if (traits_type::eq(__ch, __dlm))
1007 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001008 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001009 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001010 ++__gc_;
1011 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001012 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001013#ifndef _LIBCPP_NO_EXCEPTIONS
1014 }
1015 catch (...)
1016 {
1017 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001018#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +00001019 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020 __err |= ios_base::failbit;
1021 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001022 }
1023#ifndef _LIBCPP_NO_EXCEPTIONS
1024 }
1025 catch (...)
1026 {
1027 this->__set_badbit_and_consider_rethrow();
1028 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001029#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001030 return *this;
1031}
1032
1033template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001034basic_istream<_CharT, _Traits>&
1035basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
1036{
1037 __gc_ = 0;
1038#ifndef _LIBCPP_NO_EXCEPTIONS
1039 try
1040 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001041#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042 sentry __sen(*this, true);
1043 if (__sen)
1044 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001045 ios_base::iostate __err = ios_base::goodbit;
1046 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001048 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1049 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001051 __err |= ios_base::eofbit;
1052 break;
1053 }
1054 char_type __ch = traits_type::to_char_type(__i);
1055 if (traits_type::eq(__ch, __dlm))
1056 {
1057 this->rdbuf()->sbumpc();
1058 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001059 break;
1060 }
Howard Hinnante51e4e92011-09-01 21:02:45 +00001061 if (__gc_ >= __n-1)
1062 {
1063 __err |= ios_base::failbit;
1064 break;
1065 }
1066 *__s++ = __ch;
1067 this->rdbuf()->sbumpc();
1068 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001069 }
Howard Hinnante51e4e92011-09-01 21:02:45 +00001070 if (__n > 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001071 *__s = char_type();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001072 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001073 __err |= ios_base::failbit;
1074 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001075 }
1076#ifndef _LIBCPP_NO_EXCEPTIONS
1077 }
1078 catch (...)
1079 {
1080 this->__set_badbit_and_consider_rethrow();
1081 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001082#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001083 return *this;
1084}
1085
1086template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001087basic_istream<_CharT, _Traits>&
1088basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
1089{
1090 __gc_ = 0;
1091#ifndef _LIBCPP_NO_EXCEPTIONS
1092 try
1093 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001094#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001095 sentry __sen(*this, true);
1096 if (__sen)
1097 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001098 ios_base::iostate __err = ios_base::goodbit;
1099 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001100 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001101 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001102 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001103 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1104 if (traits_type::eq_int_type(__i, traits_type::eof()))
1105 {
1106 __err |= ios_base::eofbit;
1107 break;
1108 }
1109 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +00001110 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001111 break;
1112 }
1113 }
1114 else
1115 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001116 while (__gc_ < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001117 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001118 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1119 if (traits_type::eq_int_type(__i, traits_type::eof()))
1120 {
1121 __err |= ios_base::eofbit;
1122 break;
1123 }
1124 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +00001125 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001126 break;
1127 }
1128 }
Howard Hinnante51e4e92011-09-01 21:02:45 +00001129 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001130 }
1131#ifndef _LIBCPP_NO_EXCEPTIONS
1132 }
1133 catch (...)
1134 {
1135 this->__set_badbit_and_consider_rethrow();
1136 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001137#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001138 return *this;
1139}
1140
1141template<class _CharT, class _Traits>
1142typename basic_istream<_CharT, _Traits>::int_type
1143basic_istream<_CharT, _Traits>::peek()
1144{
1145 __gc_ = 0;
1146 int_type __r = traits_type::eof();
1147#ifndef _LIBCPP_NO_EXCEPTIONS
1148 try
1149 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001150#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001151 sentry __sen(*this, true);
1152 if (__sen)
Howard Hinnanta4427372012-11-01 17:32:07 +00001153 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001154 __r = this->rdbuf()->sgetc();
Howard Hinnanta4427372012-11-01 17:32:07 +00001155 if (traits_type::eq_int_type(__r, traits_type::eof()))
1156 this->setstate(ios_base::eofbit);
1157 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001158#ifndef _LIBCPP_NO_EXCEPTIONS
1159 }
1160 catch (...)
1161 {
1162 this->__set_badbit_and_consider_rethrow();
1163 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001164#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 return __r;
1166}
1167
1168template<class _CharT, class _Traits>
1169basic_istream<_CharT, _Traits>&
1170basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1171{
1172 __gc_ = 0;
1173#ifndef _LIBCPP_NO_EXCEPTIONS
1174 try
1175 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001176#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001177 sentry __sen(*this, true);
1178 if (__sen)
1179 {
Howard Hinnant232466c2013-03-06 19:27:56 +00001180 __gc_ = this->rdbuf()->sgetn(__s, __n);
1181 if (__gc_ != __n)
1182 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001183 }
1184 else
1185 this->setstate(ios_base::failbit);
1186#ifndef _LIBCPP_NO_EXCEPTIONS
1187 }
1188 catch (...)
1189 {
1190 this->__set_badbit_and_consider_rethrow();
1191 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001192#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001193 return *this;
1194}
1195
1196template<class _CharT, class _Traits>
1197streamsize
1198basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1199{
Howard Hinnantaf8555c2012-12-20 15:40:28 +00001200 __gc_ = 0;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001201#ifndef _LIBCPP_NO_EXCEPTIONS
1202 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001203 {
Marshall Clow1c6e3862016-07-13 16:58:48 +00001204#endif // _LIBCPP_NO_EXCEPTIONS
1205 sentry __sen(*this, true);
1206 if (__sen)
1207 {
1208 streamsize __c = this->rdbuf()->in_avail();
1209 switch (__c)
1210 {
1211 case -1:
1212 this->setstate(ios_base::eofbit);
1213 break;
1214 case 0:
1215 break;
1216 default:
1217 read(__s, _VSTD::min(__c, __n));
1218 break;
1219 }
1220 }
1221 else
1222 this->setstate(ios_base::failbit);
1223#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001224 }
Marshall Clow1c6e3862016-07-13 16:58:48 +00001225 catch (...)
1226 {
1227 this->__set_badbit_and_consider_rethrow();
1228 }
1229#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +00001230 return __gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001231}
1232
1233template<class _CharT, class _Traits>
1234basic_istream<_CharT, _Traits>&
1235basic_istream<_CharT, _Traits>::putback(char_type __c)
1236{
1237 __gc_ = 0;
1238#ifndef _LIBCPP_NO_EXCEPTIONS
1239 try
1240 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001241#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001242 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001243 sentry __sen(*this, true);
1244 if (__sen)
1245 {
1246 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1247 this->setstate(ios_base::badbit);
1248 }
1249 else
1250 this->setstate(ios_base::failbit);
1251#ifndef _LIBCPP_NO_EXCEPTIONS
1252 }
1253 catch (...)
1254 {
1255 this->__set_badbit_and_consider_rethrow();
1256 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001257#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001258 return *this;
1259}
1260
1261template<class _CharT, class _Traits>
1262basic_istream<_CharT, _Traits>&
1263basic_istream<_CharT, _Traits>::unget()
1264{
1265 __gc_ = 0;
1266#ifndef _LIBCPP_NO_EXCEPTIONS
1267 try
1268 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001269#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001270 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001271 sentry __sen(*this, true);
1272 if (__sen)
1273 {
1274 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1275 this->setstate(ios_base::badbit);
1276 }
1277 else
1278 this->setstate(ios_base::failbit);
1279#ifndef _LIBCPP_NO_EXCEPTIONS
1280 }
1281 catch (...)
1282 {
1283 this->__set_badbit_and_consider_rethrow();
1284 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001285#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001286 return *this;
1287}
1288
1289template<class _CharT, class _Traits>
1290int
1291basic_istream<_CharT, _Traits>::sync()
1292{
1293 int __r = 0;
1294#ifndef _LIBCPP_NO_EXCEPTIONS
1295 try
1296 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001297#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001298 sentry __sen(*this, true);
1299 if (__sen)
1300 {
1301 if (this->rdbuf() == 0)
1302 return -1;
1303 if (this->rdbuf()->pubsync() == -1)
1304 {
1305 this->setstate(ios_base::badbit);
1306 return -1;
1307 }
1308 }
1309#ifndef _LIBCPP_NO_EXCEPTIONS
1310 }
1311 catch (...)
1312 {
1313 this->__set_badbit_and_consider_rethrow();
1314 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001315#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001316 return __r;
1317}
1318
1319template<class _CharT, class _Traits>
1320typename basic_istream<_CharT, _Traits>::pos_type
1321basic_istream<_CharT, _Traits>::tellg()
1322{
1323 pos_type __r(-1);
1324#ifndef _LIBCPP_NO_EXCEPTIONS
1325 try
1326 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001327#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001328 sentry __sen(*this, true);
1329 if (__sen)
1330 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1331#ifndef _LIBCPP_NO_EXCEPTIONS
1332 }
1333 catch (...)
1334 {
1335 this->__set_badbit_and_consider_rethrow();
1336 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001337#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001338 return __r;
1339}
1340
1341template<class _CharT, class _Traits>
1342basic_istream<_CharT, _Traits>&
1343basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1344{
1345#ifndef _LIBCPP_NO_EXCEPTIONS
1346 try
1347 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001348#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001349 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001350 sentry __sen(*this, true);
1351 if (__sen)
Marshall Clow29c4daa2013-10-31 22:20:45 +00001352 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001353 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1354 this->setstate(ios_base::failbit);
Marshall Clow29c4daa2013-10-31 22:20:45 +00001355 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001356#ifndef _LIBCPP_NO_EXCEPTIONS
1357 }
1358 catch (...)
1359 {
1360 this->__set_badbit_and_consider_rethrow();
1361 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001362#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001363 return *this;
1364}
1365
1366template<class _CharT, class _Traits>
1367basic_istream<_CharT, _Traits>&
1368basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1369{
1370#ifndef _LIBCPP_NO_EXCEPTIONS
1371 try
1372 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001373#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clow41d9e3a2015-10-25 18:31:51 +00001374 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001375 sentry __sen(*this, true);
1376 if (__sen)
Marshall Clow29c4daa2013-10-31 22:20:45 +00001377 {
1378 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1379 this->setstate(ios_base::failbit);
1380 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001381#ifndef _LIBCPP_NO_EXCEPTIONS
1382 }
1383 catch (...)
1384 {
1385 this->__set_badbit_and_consider_rethrow();
1386 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001387#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001388 return *this;
1389}
1390
1391template <class _CharT, class _Traits>
1392basic_istream<_CharT, _Traits>&
1393ws(basic_istream<_CharT, _Traits>& __is)
1394{
1395#ifndef _LIBCPP_NO_EXCEPTIONS
1396 try
1397 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001398#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001399 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1400 if (__sen)
1401 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001402 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001403 while (true)
1404 {
1405 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1406 if (_Traits::eq_int_type(__i, _Traits::eof()))
1407 {
1408 __is.setstate(ios_base::eofbit);
1409 break;
1410 }
1411 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001412 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001413 __is.rdbuf()->sbumpc();
1414 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001415 }
1416#ifndef _LIBCPP_NO_EXCEPTIONS
1417 }
1418 catch (...)
1419 {
1420 __is.__set_badbit_and_consider_rethrow();
1421 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001422#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001423 return __is;
1424}
1425
Eric Fiselier78ccf772017-04-18 23:38:41 +00001426#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001427
1428template <class _CharT, class _Traits, class _Tp>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001429inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001430basic_istream<_CharT, _Traits>&
Eric Fiselier7955ef62016-07-24 04:07:22 +00001431operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001432{
Eric Fiselier7955ef62016-07-24 04:07:22 +00001433 __is >> _VSTD::forward<_Tp>(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001434 return __is;
1435}
1436
Eric Fiselier78ccf772017-04-18 23:38:41 +00001437#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001438
1439template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001440class _LIBCPP_TEMPLATE_VIS basic_iostream
Howard Hinnantc51e1022010-05-11 19:42:16 +00001441 : public basic_istream<_CharT, _Traits>,
1442 public basic_ostream<_CharT, _Traits>
1443{
1444public:
1445 // types:
1446 typedef _CharT char_type;
1447 typedef _Traits traits_type;
1448 typedef typename traits_type::int_type int_type;
1449 typedef typename traits_type::pos_type pos_type;
1450 typedef typename traits_type::off_type off_type;
1451
1452 // constructor/destructor
Eric Fiselier815ed732016-09-16 00:00:48 +00001453 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1454 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1455 : basic_istream<_CharT, _Traits>(__sb)
1456 {}
1457
Howard Hinnantc51e1022010-05-11 19:42:16 +00001458 virtual ~basic_iostream();
1459protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +00001460#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +00001461 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001462 basic_iostream(basic_iostream&& __rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001463
1464 // assign/swap
Eric Fiselier815ed732016-09-16 00:00:48 +00001465 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001466 basic_iostream& operator=(basic_iostream&& __rhs);
1467#endif
Eric Fiselier815ed732016-09-16 00:00:48 +00001468 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1469 void swap(basic_iostream& __rhs)
1470 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001471public:
1472};
1473
Eric Fiselier78ccf772017-04-18 23:38:41 +00001474#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001475
1476template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001477basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001478 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001479{
1480}
1481
1482template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001483basic_iostream<_CharT, _Traits>&
1484basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1485{
1486 swap(__rhs);
1487 return *this;
1488}
1489
Eric Fiselier78ccf772017-04-18 23:38:41 +00001490#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001491
1492template <class _CharT, class _Traits>
1493basic_iostream<_CharT, _Traits>::~basic_iostream()
1494{
1495}
1496
Howard Hinnantc51e1022010-05-11 19:42:16 +00001497template<class _CharT, class _Traits, class _Allocator>
1498basic_istream<_CharT, _Traits>&
1499operator>>(basic_istream<_CharT, _Traits>& __is,
1500 basic_string<_CharT, _Traits, _Allocator>& __str)
1501{
1502#ifndef _LIBCPP_NO_EXCEPTIONS
1503 try
1504 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001505#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001506 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1507 if (__sen)
1508 {
1509 __str.clear();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001510 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001511 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001512 __n = __str.max_size();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001513 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001514 __n = numeric_limits<streamsize>::max();
1515 streamsize __c = 0;
1516 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001517 ios_base::iostate __err = ios_base::goodbit;
1518 while (__c < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001519 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001520 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1521 if (_Traits::eq_int_type(__i, _Traits::eof()))
1522 {
1523 __err |= ios_base::eofbit;
1524 break;
1525 }
1526 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001527 if (__ct.is(__ct.space, __ch))
1528 break;
1529 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001530 ++__c;
1531 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001532 }
1533 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534 if (__c == 0)
1535 __err |= ios_base::failbit;
1536 __is.setstate(__err);
1537 }
1538 else
1539 __is.setstate(ios_base::failbit);
1540#ifndef _LIBCPP_NO_EXCEPTIONS
1541 }
1542 catch (...)
1543 {
1544 __is.__set_badbit_and_consider_rethrow();
1545 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001546#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547 return __is;
1548}
1549
1550template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001551basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552getline(basic_istream<_CharT, _Traits>& __is,
1553 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1554{
1555#ifndef _LIBCPP_NO_EXCEPTIONS
1556 try
1557 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001558#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001559 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1560 if (__sen)
1561 {
1562 __str.clear();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001563 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnante992f762011-10-09 15:20:46 +00001564 streamsize __extr = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001565 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001566 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001567 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1568 if (_Traits::eq_int_type(__i, _Traits::eof()))
1569 {
1570 __err |= ios_base::eofbit;
1571 break;
1572 }
Howard Hinnante992f762011-10-09 15:20:46 +00001573 ++__extr;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001574 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001575 if (_Traits::eq(__ch, __dlm))
1576 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001577 __str.push_back(__ch);
1578 if (__str.size() == __str.max_size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001579 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001580 __err |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001581 break;
1582 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001583 }
Howard Hinnante992f762011-10-09 15:20:46 +00001584 if (__extr == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001585 __err |= ios_base::failbit;
1586 __is.setstate(__err);
1587 }
1588#ifndef _LIBCPP_NO_EXCEPTIONS
1589 }
1590 catch (...)
1591 {
1592 __is.__set_badbit_and_consider_rethrow();
1593 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001594#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001595 return __is;
1596}
1597
1598template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001599inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001600basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001601getline(basic_istream<_CharT, _Traits>& __is,
1602 basic_string<_CharT, _Traits, _Allocator>& __str)
1603{
1604 return getline(__is, __str, __is.widen('\n'));
1605}
1606
Eric Fiselier78ccf772017-04-18 23:38:41 +00001607#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001608
1609template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001610inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001611basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001612getline(basic_istream<_CharT, _Traits>&& __is,
1613 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1614{
1615 return getline(__is, __str, __dlm);
1616}
1617
1618template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001619inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001620basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001621getline(basic_istream<_CharT, _Traits>&& __is,
1622 basic_string<_CharT, _Traits, _Allocator>& __str)
1623{
1624 return getline(__is, __str, __is.widen('\n'));
1625}
1626
Eric Fiselier78ccf772017-04-18 23:38:41 +00001627#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001628
1629template <class _CharT, class _Traits, size_t _Size>
1630basic_istream<_CharT, _Traits>&
1631operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1632{
1633#ifndef _LIBCPP_NO_EXCEPTIONS
1634 try
1635 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001636#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001637 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1638 if (__sen)
1639 {
1640 basic_string<_CharT, _Traits> __str;
1641 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier37c22152016-12-24 00:24:44 +00001642 size_t __c = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001643 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001644 _CharT __zero = __ct.widen('0');
1645 _CharT __one = __ct.widen('1');
Howard Hinnante51e4e92011-09-01 21:02:45 +00001646 while (__c < _Size)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001647 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001648 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1649 if (_Traits::eq_int_type(__i, _Traits::eof()))
1650 {
1651 __err |= ios_base::eofbit;
1652 break;
1653 }
1654 _CharT __ch = _Traits::to_char_type(__i);
1655 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001656 break;
1657 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001658 ++__c;
1659 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001660 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001661 __x = bitset<_Size>(__str);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001662 if (__c == 0)
1663 __err |= ios_base::failbit;
1664 __is.setstate(__err);
1665 }
1666 else
1667 __is.setstate(ios_base::failbit);
1668#ifndef _LIBCPP_NO_EXCEPTIONS
1669 }
1670 catch (...)
1671 {
1672 __is.__set_badbit_and_consider_rethrow();
1673 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001674#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001675 return __is;
1676}
1677
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001678_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1679_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1680_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001681
1682_LIBCPP_END_NAMESPACE_STD
1683
1684#endif // _LIBCPP_ISTREAM