blob: 3a76ba831d3c852bdf433731325e7d7f8ae2de7a [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- istream ----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-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 Hinnantbc8d3f92010-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 Clow546eca82014-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 Hinnantbc8d3f92010-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 Hinnant66c6f972011-11-29 16:45:27 +0000165#include <__undef_min_max>
166
Howard Hinnant08e17472011-10-17 20:05:10 +0000167#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000168#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000169#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000170
171_LIBCPP_BEGIN_NAMESPACE_STD
172
173template <class _CharT, class _Traits>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000174class _LIBCPP_TYPE_VIS_ONLY basic_istream
Howard Hinnantbc8d3f92010-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:
187 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb);
188 virtual ~basic_istream();
189protected:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000190#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +0000191 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000192 basic_istream(basic_istream&& __rhs);
193#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000194 // 27.7.1.1.2 Assign/swap:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000195#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +0000196 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000197 basic_istream& operator=(basic_istream&& __rhs);
198#endif
199 void swap(basic_istream& __rhs);
Marshall Clow546eca82014-09-16 15:27:01 +0000200
Marshall Clowbb9902e2014-09-17 01:58:15 +0000201#if _LIBCPP_STD_VER > 11
Marshall Clow546eca82014-09-16 15:27:01 +0000202#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
Marshall Clowd1fae172014-09-16 15:33:53 +0000203 basic_istream (const basic_istream& __rhs) = delete;
204 basic_istream& operator=(const basic_istream& __rhs) = delete;
Marshall Clow546eca82014-09-16 15:27:01 +0000205#else
Marshall Clowbb9902e2014-09-17 01:58:15 +0000206 basic_istream (const basic_istream& __rhs); // not defined
207 basic_istream& operator=(const basic_istream& __rhs); // not defined
208#endif
Marshall Clow546eca82014-09-16 15:27:01 +0000209#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000210public:
211
212 // 27.7.1.1.3 Prefix/suffix:
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000213 class _LIBCPP_TYPE_VIS_ONLY sentry;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000214
215 // 27.7.1.2 Formatted input:
216 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&));
217 basic_istream& operator>>(basic_ios<char_type, traits_type>&
218 (*__pf)(basic_ios<char_type, traits_type>&));
219 basic_istream& operator>>(ios_base& (*__pf)(ios_base&));
220 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
221 basic_istream& operator>>(bool& __n);
222 basic_istream& operator>>(short& __n);
223 basic_istream& operator>>(unsigned short& __n);
224 basic_istream& operator>>(int& __n);
225 basic_istream& operator>>(unsigned int& __n);
226 basic_istream& operator>>(long& __n);
227 basic_istream& operator>>(unsigned long& __n);
228 basic_istream& operator>>(long long& __n);
229 basic_istream& operator>>(unsigned long long& __n);
230 basic_istream& operator>>(float& __f);
231 basic_istream& operator>>(double& __f);
232 basic_istream& operator>>(long double& __f);
233 basic_istream& operator>>(void*& __p);
234
235 // 27.7.1.3 Unformatted input:
Howard Hinnant68a8e902010-09-22 15:29:08 +0000236 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000237 streamsize gcount() const {return __gc_;}
238 int_type get();
239 basic_istream& get(char_type& __c);
240 basic_istream& get(char_type* __s, streamsize __n);
241 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
242 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb);
243 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
244
245 basic_istream& getline(char_type* __s, streamsize __n);
246 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
247
248 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
249 int_type peek();
250 basic_istream& read (char_type* __s, streamsize __n);
251 streamsize readsome(char_type* __s, streamsize __n);
252
253 basic_istream& putback(char_type __c);
254 basic_istream& unget();
255 int sync();
256
257 pos_type tellg();
258 basic_istream& seekg(pos_type __pos);
259 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
260};
261
262template <class _CharT, class _Traits>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000263class _LIBCPP_TYPE_VIS_ONLY basic_istream<_CharT, _Traits>::sentry
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000264{
265 bool __ok_;
266
267 sentry(const sentry&); // = delete;
268 sentry& operator=(const sentry&); // = delete;
269
270public:
271 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
272// ~sentry() = default;
273
Howard Hinnant68a8e902010-09-22 15:29:08 +0000274 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant77861882012-02-21 21:46:43 +0000275 _LIBCPP_EXPLICIT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000276 operator bool() const {return __ok_;}
277};
278
279template <class _CharT, class _Traits>
280basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
281 bool __noskipws)
282 : __ok_(false)
283{
284 if (__is.good())
285 {
286 if (__is.tie())
287 __is.tie()->flush();
288 if (!__noskipws && (__is.flags() & ios_base::skipws))
289 {
Howard Hinnant99968442011-11-29 18:15:50 +0000290 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000291 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant99968442011-11-29 18:15:50 +0000292 _Ip __i(__is);
293 _Ip __eof;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000294 for (; __i != __eof; ++__i)
295 if (!__ct.is(__ct.space, *__i))
296 break;
297 if (__i == __eof)
298 __is.setstate(ios_base::failbit | ios_base::eofbit);
299 }
300 __ok_ = __is.good();
301 }
302 else
303 __is.setstate(ios_base::failbit);
304}
305
306template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000307inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000308basic_istream<_CharT, _Traits>::basic_istream(basic_streambuf<char_type, traits_type>* __sb)
309 : __gc_(0)
310{
311 this->init(__sb);
312}
313
Howard Hinnant73d21a42010-09-04 23:28:19 +0000314#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000315
316template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000317inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000318basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
319 : __gc_(__rhs.__gc_)
320{
321 __rhs.__gc_ = 0;
322 this->move(__rhs);
323}
324
325template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000326inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000327basic_istream<_CharT, _Traits>&
328basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
329{
330 swap(__rhs);
331 return *this;
332}
333
Howard Hinnant73d21a42010-09-04 23:28:19 +0000334#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000335
336template <class _CharT, class _Traits>
337basic_istream<_CharT, _Traits>::~basic_istream()
338{
339}
340
341template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000342inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000343void
344basic_istream<_CharT, _Traits>::swap(basic_istream& __rhs)
345{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000346 _VSTD::swap(__gc_, __rhs.__gc_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000347 basic_ios<char_type, traits_type>::swap(__rhs);
348}
349
350template <class _CharT, class _Traits>
351basic_istream<_CharT, _Traits>&
352basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
353{
354#ifndef _LIBCPP_NO_EXCEPTIONS
355 try
356 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000357#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000358 sentry __s(*this);
359 if (__s)
360 {
Howard Hinnant99968442011-11-29 18:15:50 +0000361 typedef istreambuf_iterator<char_type, traits_type> _Ip;
362 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000363 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000364 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000365 this->setstate(__err);
366 }
367#ifndef _LIBCPP_NO_EXCEPTIONS
368 }
369 catch (...)
370 {
371 this->__set_badbit_and_consider_rethrow();
372 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000373#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000374 return *this;
375}
376
377template <class _CharT, class _Traits>
378basic_istream<_CharT, _Traits>&
379basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
380{
381#ifndef _LIBCPP_NO_EXCEPTIONS
382 try
383 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000384#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000385 sentry __s(*this);
386 if (__s)
387 {
Howard Hinnant99968442011-11-29 18:15:50 +0000388 typedef istreambuf_iterator<char_type, traits_type> _Ip;
389 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000390 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000391 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000392 this->setstate(__err);
393 }
394#ifndef _LIBCPP_NO_EXCEPTIONS
395 }
396 catch (...)
397 {
398 this->__set_badbit_and_consider_rethrow();
399 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000400#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000401 return *this;
402}
403
404template <class _CharT, class _Traits>
405basic_istream<_CharT, _Traits>&
406basic_istream<_CharT, _Traits>::operator>>(long& __n)
407{
408#ifndef _LIBCPP_NO_EXCEPTIONS
409 try
410 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000411#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000412 sentry __s(*this);
413 if (__s)
414 {
Howard Hinnant99968442011-11-29 18:15:50 +0000415 typedef istreambuf_iterator<char_type, traits_type> _Ip;
416 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000417 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000418 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000419 this->setstate(__err);
420 }
421#ifndef _LIBCPP_NO_EXCEPTIONS
422 }
423 catch (...)
424 {
425 this->__set_badbit_and_consider_rethrow();
426 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000427#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000428 return *this;
429}
430
431template <class _CharT, class _Traits>
432basic_istream<_CharT, _Traits>&
433basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
434{
435#ifndef _LIBCPP_NO_EXCEPTIONS
436 try
437 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000438#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000439 sentry __s(*this);
440 if (__s)
441 {
Howard Hinnant99968442011-11-29 18:15:50 +0000442 typedef istreambuf_iterator<char_type, traits_type> _Ip;
443 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000444 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000445 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000446 this->setstate(__err);
447 }
448#ifndef _LIBCPP_NO_EXCEPTIONS
449 }
450 catch (...)
451 {
452 this->__set_badbit_and_consider_rethrow();
453 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000454#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000455 return *this;
456}
457
458template <class _CharT, class _Traits>
459basic_istream<_CharT, _Traits>&
460basic_istream<_CharT, _Traits>::operator>>(long long& __n)
461{
462#ifndef _LIBCPP_NO_EXCEPTIONS
463 try
464 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000465#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000466 sentry __s(*this);
467 if (__s)
468 {
Howard Hinnant99968442011-11-29 18:15:50 +0000469 typedef istreambuf_iterator<char_type, traits_type> _Ip;
470 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000471 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000472 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000473 this->setstate(__err);
474 }
475#ifndef _LIBCPP_NO_EXCEPTIONS
476 }
477 catch (...)
478 {
479 this->__set_badbit_and_consider_rethrow();
480 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000481#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000482 return *this;
483}
484
485template <class _CharT, class _Traits>
486basic_istream<_CharT, _Traits>&
487basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
488{
489#ifndef _LIBCPP_NO_EXCEPTIONS
490 try
491 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000492#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000493 sentry __s(*this);
494 if (__s)
495 {
Howard Hinnant99968442011-11-29 18:15:50 +0000496 typedef istreambuf_iterator<char_type, traits_type> _Ip;
497 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000498 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000499 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000500 this->setstate(__err);
501 }
502#ifndef _LIBCPP_NO_EXCEPTIONS
503 }
504 catch (...)
505 {
506 this->__set_badbit_and_consider_rethrow();
507 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000508#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000509 return *this;
510}
511
512template <class _CharT, class _Traits>
513basic_istream<_CharT, _Traits>&
514basic_istream<_CharT, _Traits>::operator>>(float& __n)
515{
516#ifndef _LIBCPP_NO_EXCEPTIONS
517 try
518 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000519#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520 sentry __s(*this);
521 if (__s)
522 {
Howard Hinnant99968442011-11-29 18:15:50 +0000523 typedef istreambuf_iterator<char_type, traits_type> _Ip;
524 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000525 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000526 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000527 this->setstate(__err);
528 }
529#ifndef _LIBCPP_NO_EXCEPTIONS
530 }
531 catch (...)
532 {
533 this->__set_badbit_and_consider_rethrow();
534 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000535#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000536 return *this;
537}
538
539template <class _CharT, class _Traits>
540basic_istream<_CharT, _Traits>&
541basic_istream<_CharT, _Traits>::operator>>(double& __n)
542{
543#ifndef _LIBCPP_NO_EXCEPTIONS
544 try
545 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000546#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000547 sentry __s(*this);
548 if (__s)
549 {
Howard Hinnant99968442011-11-29 18:15:50 +0000550 typedef istreambuf_iterator<char_type, traits_type> _Ip;
551 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000552 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000553 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000554 this->setstate(__err);
555 }
556#ifndef _LIBCPP_NO_EXCEPTIONS
557 }
558 catch (...)
559 {
560 this->__set_badbit_and_consider_rethrow();
561 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000562#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000563 return *this;
564}
565
566template <class _CharT, class _Traits>
567basic_istream<_CharT, _Traits>&
568basic_istream<_CharT, _Traits>::operator>>(long double& __n)
569{
570#ifndef _LIBCPP_NO_EXCEPTIONS
571 try
572 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000573#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000574 sentry __s(*this);
575 if (__s)
576 {
Howard Hinnant99968442011-11-29 18:15:50 +0000577 typedef istreambuf_iterator<char_type, traits_type> _Ip;
578 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000579 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000580 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000581 this->setstate(__err);
582 }
583#ifndef _LIBCPP_NO_EXCEPTIONS
584 }
585 catch (...)
586 {
587 this->__set_badbit_and_consider_rethrow();
588 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000589#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000590 return *this;
591}
592
593template <class _CharT, class _Traits>
594basic_istream<_CharT, _Traits>&
595basic_istream<_CharT, _Traits>::operator>>(bool& __n)
596{
597#ifndef _LIBCPP_NO_EXCEPTIONS
598 try
599 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000600#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000601 sentry __s(*this);
602 if (__s)
603 {
Howard Hinnant99968442011-11-29 18:15:50 +0000604 typedef istreambuf_iterator<char_type, traits_type> _Ip;
605 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000606 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000607 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000608 this->setstate(__err);
609 }
610#ifndef _LIBCPP_NO_EXCEPTIONS
611 }
612 catch (...)
613 {
614 this->__set_badbit_and_consider_rethrow();
615 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000616#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000617 return *this;
618}
619
620template <class _CharT, class _Traits>
621basic_istream<_CharT, _Traits>&
622basic_istream<_CharT, _Traits>::operator>>(void*& __n)
623{
624#ifndef _LIBCPP_NO_EXCEPTIONS
625 try
626 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000627#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000628 sentry __s(*this);
629 if (__s)
630 {
Howard Hinnant99968442011-11-29 18:15:50 +0000631 typedef istreambuf_iterator<char_type, traits_type> _Ip;
632 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000633 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000634 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000635 this->setstate(__err);
636 }
637#ifndef _LIBCPP_NO_EXCEPTIONS
638 }
639 catch (...)
640 {
641 this->__set_badbit_and_consider_rethrow();
642 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000643#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000644 return *this;
645}
646
647template <class _CharT, class _Traits>
648basic_istream<_CharT, _Traits>&
649basic_istream<_CharT, _Traits>::operator>>(short& __n)
650{
651#ifndef _LIBCPP_NO_EXCEPTIONS
652 try
653 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000654#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000655 sentry __s(*this);
656 if (__s)
657 {
Howard Hinnant99968442011-11-29 18:15:50 +0000658 typedef istreambuf_iterator<char_type, traits_type> _Ip;
659 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000660 ios_base::iostate __err = ios_base::goodbit;
661 long __temp;
Howard Hinnant99968442011-11-29 18:15:50 +0000662 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000663 if (__temp < numeric_limits<short>::min())
664 {
665 __err |= ios_base::failbit;
666 __n = numeric_limits<short>::min();
667 }
668 else if (__temp > numeric_limits<short>::max())
669 {
670 __err |= ios_base::failbit;
671 __n = numeric_limits<short>::max();
672 }
673 else
674 __n = static_cast<short>(__temp);
675 this->setstate(__err);
676 }
677#ifndef _LIBCPP_NO_EXCEPTIONS
678 }
679 catch (...)
680 {
681 this->__set_badbit_and_consider_rethrow();
682 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000683#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000684 return *this;
685}
686
687template <class _CharT, class _Traits>
688basic_istream<_CharT, _Traits>&
689basic_istream<_CharT, _Traits>::operator>>(int& __n)
690{
691#ifndef _LIBCPP_NO_EXCEPTIONS
692 try
693 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000694#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000695 sentry __s(*this);
696 if (__s)
697 {
Howard Hinnant99968442011-11-29 18:15:50 +0000698 typedef istreambuf_iterator<char_type, traits_type> _Ip;
699 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000700 ios_base::iostate __err = ios_base::goodbit;
701 long __temp;
Howard Hinnant99968442011-11-29 18:15:50 +0000702 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000703 if (__temp < numeric_limits<int>::min())
704 {
705 __err |= ios_base::failbit;
706 __n = numeric_limits<int>::min();
707 }
708 else if (__temp > numeric_limits<int>::max())
709 {
710 __err |= ios_base::failbit;
711 __n = numeric_limits<int>::max();
712 }
713 else
714 __n = static_cast<int>(__temp);
715 this->setstate(__err);
716 }
717#ifndef _LIBCPP_NO_EXCEPTIONS
718 }
719 catch (...)
720 {
721 this->__set_badbit_and_consider_rethrow();
722 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000723#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000724 return *this;
725}
726
727template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000728inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000729basic_istream<_CharT, _Traits>&
730basic_istream<_CharT, _Traits>::operator>>(basic_istream& (*__pf)(basic_istream&))
731{
732 return __pf(*this);
733}
734
735template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000736inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000737basic_istream<_CharT, _Traits>&
738basic_istream<_CharT, _Traits>::operator>>(basic_ios<char_type, traits_type>&
739 (*__pf)(basic_ios<char_type, traits_type>&))
740{
741 __pf(*this);
742 return *this;
743}
744
745template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000746inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000747basic_istream<_CharT, _Traits>&
748basic_istream<_CharT, _Traits>::operator>>(ios_base& (*__pf)(ios_base&))
749{
750 __pf(*this);
751 return *this;
752}
753
754template<class _CharT, class _Traits>
755basic_istream<_CharT, _Traits>&
756operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
757{
758#ifndef _LIBCPP_NO_EXCEPTIONS
759 try
760 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000761#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000762 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
763 if (__sen)
764 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000765 streamsize __n = __is.width();
Howard Hinnant92a836c2011-09-01 21:02:45 +0000766 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000767 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
768 streamsize __c = 0;
769 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +0000770 ios_base::iostate __err = ios_base::goodbit;
771 while (__c < __n-1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000772 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000773 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
774 if (_Traits::eq_int_type(__i, _Traits::eof()))
775 {
776 __err |= ios_base::eofbit;
777 break;
778 }
779 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000780 if (__ct.is(__ct.space, __ch))
781 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000782 *__s++ = __ch;
783 ++__c;
784 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000785 }
786 *__s = _CharT();
787 __is.width(0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000788 if (__c == 0)
789 __err |= ios_base::failbit;
790 __is.setstate(__err);
791 }
792#ifndef _LIBCPP_NO_EXCEPTIONS
793 }
794 catch (...)
795 {
796 __is.__set_badbit_and_consider_rethrow();
797 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000798#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000799 return __is;
800}
801
802template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000803inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000804basic_istream<char, _Traits>&
805operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
806{
807 return __is >> (char*)__s;
808}
809
810template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000811inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000812basic_istream<char, _Traits>&
813operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
814{
815 return __is >> (char*)__s;
816}
817
818template<class _CharT, class _Traits>
819basic_istream<_CharT, _Traits>&
820operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
821{
822#ifndef _LIBCPP_NO_EXCEPTIONS
823 try
824 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000825#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000826 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
827 if (__sen)
828 {
Howard Hinnantdf85e572011-02-27 18:02:02 +0000829 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
830 if (_Traits::eq_int_type(__i, _Traits::eof()))
831 __is.setstate(ios_base::eofbit | ios_base::failbit);
832 else
833 __c = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000834 }
835#ifndef _LIBCPP_NO_EXCEPTIONS
836 }
837 catch (...)
838 {
839 __is.__set_badbit_and_consider_rethrow();
840 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000841#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000842 return __is;
843}
844
845template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000846inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000847basic_istream<char, _Traits>&
848operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
849{
850 return __is >> (char&)__c;
851}
852
853template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000854inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000855basic_istream<char, _Traits>&
856operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
857{
858 return __is >> (char&)__c;
859}
860
861template<class _CharT, class _Traits>
862basic_istream<_CharT, _Traits>&
863basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
864{
865 __gc_ = 0;
866#ifndef _LIBCPP_NO_EXCEPTIONS
867 try
868 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000869#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000870 sentry __s(*this, true);
871 if (__s)
872 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000873 if (__sb)
874 {
875#ifndef _LIBCPP_NO_EXCEPTIONS
876 try
877 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000878#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000879 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000880 while (true)
881 {
882 typename traits_type::int_type __i = this->rdbuf()->sgetc();
883 if (traits_type::eq_int_type(__i, _Traits::eof()))
884 {
885 __err |= ios_base::eofbit;
886 break;
887 }
888 if (traits_type::eq_int_type(
889 __sb->sputc(traits_type::to_char_type(__i)),
890 traits_type::eof()))
891 break;
892 ++__gc_;
893 this->rdbuf()->sbumpc();
894 }
895 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000896 __err |= ios_base::failbit;
897 this->setstate(__err);
898#ifndef _LIBCPP_NO_EXCEPTIONS
899 }
900 catch (...)
901 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000902 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000903 this->__set_failbit_and_consider_rethrow();
904 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000905#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000906 }
907 else
908 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000909 }
910#ifndef _LIBCPP_NO_EXCEPTIONS
911 }
912 catch (...)
913 {
914 this->__set_badbit_and_consider_rethrow();
915 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000916#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000917 return *this;
918}
919
920template<class _CharT, class _Traits>
921typename basic_istream<_CharT, _Traits>::int_type
922basic_istream<_CharT, _Traits>::get()
923{
924 __gc_ = 0;
925 int_type __r = traits_type::eof();
926#ifndef _LIBCPP_NO_EXCEPTIONS
927 try
928 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000929#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000930 sentry __s(*this, true);
931 if (__s)
932 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000933 __r = this->rdbuf()->sbumpc();
934 if (traits_type::eq_int_type(__r, traits_type::eof()))
935 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000936 else
Howard Hinnant92a836c2011-09-01 21:02:45 +0000937 __gc_ = 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000938 }
939#ifndef _LIBCPP_NO_EXCEPTIONS
940 }
941 catch (...)
942 {
943 this->__set_badbit_and_consider_rethrow();
944 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000945#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000946 return __r;
947}
948
949template<class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000950inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000951basic_istream<_CharT, _Traits>&
952basic_istream<_CharT, _Traits>::get(char_type& __c)
953{
954 int_type __ch = get();
955 if (__ch != traits_type::eof())
956 __c = traits_type::to_char_type(__ch);
957 return *this;
958}
959
960template<class _CharT, class _Traits>
961basic_istream<_CharT, _Traits>&
962basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
963{
964 __gc_ = 0;
965#ifndef _LIBCPP_NO_EXCEPTIONS
966 try
967 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000968#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000969 sentry __sen(*this, true);
970 if (__sen)
971 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000972 if (__n > 0)
973 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000974 ios_base::iostate __err = ios_base::goodbit;
975 while (__gc_ < __n-1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000976 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000977 int_type __i = this->rdbuf()->sgetc();
978 if (traits_type::eq_int_type(__i, traits_type::eof()))
979 {
980 __err |= ios_base::eofbit;
981 break;
982 }
983 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000984 if (traits_type::eq(__ch, __dlm))
985 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000986 *__s++ = __ch;
987 ++__gc_;
988 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000989 }
990 *__s = char_type();
Howard Hinnant92a836c2011-09-01 21:02:45 +0000991 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000992 __err |= ios_base::failbit;
993 this->setstate(__err);
994 }
995 else
996 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000997 }
998#ifndef _LIBCPP_NO_EXCEPTIONS
999 }
1000 catch (...)
1001 {
1002 this->__set_badbit_and_consider_rethrow();
1003 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001004#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001005 return *this;
1006}
1007
1008template<class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001009inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001010basic_istream<_CharT, _Traits>&
1011basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n)
1012{
1013 return get(__s, __n, this->widen('\n'));
1014}
1015
1016template<class _CharT, class _Traits>
1017basic_istream<_CharT, _Traits>&
1018basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
1019 char_type __dlm)
1020{
1021 __gc_ = 0;
1022#ifndef _LIBCPP_NO_EXCEPTIONS
1023 try
1024 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001025#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001026 sentry __sen(*this, true);
1027 if (__sen)
1028 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001029 ios_base::iostate __err = ios_base::goodbit;
1030#ifndef _LIBCPP_NO_EXCEPTIONS
1031 try
1032 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001033#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001034 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001035 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001036 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1037 if (traits_type::eq_int_type(__i, traits_type::eof()))
1038 {
1039 __err |= ios_base::eofbit;
1040 break;
1041 }
1042 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001043 if (traits_type::eq(__ch, __dlm))
1044 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001045 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001046 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001047 ++__gc_;
1048 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001049 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001050#ifndef _LIBCPP_NO_EXCEPTIONS
1051 }
1052 catch (...)
1053 {
1054 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001055#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001056 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001057 __err |= ios_base::failbit;
1058 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001059 }
1060#ifndef _LIBCPP_NO_EXCEPTIONS
1061 }
1062 catch (...)
1063 {
1064 this->__set_badbit_and_consider_rethrow();
1065 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001066#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001067 return *this;
1068}
1069
1070template<class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001071inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001072basic_istream<_CharT, _Traits>&
1073basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb)
1074{
1075 return get(__sb, this->widen('\n'));
1076}
1077
1078template<class _CharT, class _Traits>
1079basic_istream<_CharT, _Traits>&
1080basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
1081{
1082 __gc_ = 0;
1083#ifndef _LIBCPP_NO_EXCEPTIONS
1084 try
1085 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001086#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001087 sentry __sen(*this, true);
1088 if (__sen)
1089 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001090 ios_base::iostate __err = ios_base::goodbit;
1091 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001092 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001093 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1094 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001095 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001096 __err |= ios_base::eofbit;
1097 break;
1098 }
1099 char_type __ch = traits_type::to_char_type(__i);
1100 if (traits_type::eq(__ch, __dlm))
1101 {
1102 this->rdbuf()->sbumpc();
1103 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001104 break;
1105 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001106 if (__gc_ >= __n-1)
1107 {
1108 __err |= ios_base::failbit;
1109 break;
1110 }
1111 *__s++ = __ch;
1112 this->rdbuf()->sbumpc();
1113 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001114 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001115 if (__n > 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001116 *__s = char_type();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001117 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001118 __err |= ios_base::failbit;
1119 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001120 }
1121#ifndef _LIBCPP_NO_EXCEPTIONS
1122 }
1123 catch (...)
1124 {
1125 this->__set_badbit_and_consider_rethrow();
1126 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001127#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001128 return *this;
1129}
1130
1131template<class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001132inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001133basic_istream<_CharT, _Traits>&
1134basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n)
1135{
1136 return getline(__s, __n, this->widen('\n'));
1137}
1138
1139template<class _CharT, class _Traits>
1140basic_istream<_CharT, _Traits>&
1141basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
1142{
1143 __gc_ = 0;
1144#ifndef _LIBCPP_NO_EXCEPTIONS
1145 try
1146 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001147#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001148 sentry __sen(*this, true);
1149 if (__sen)
1150 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001151 ios_base::iostate __err = ios_base::goodbit;
1152 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001153 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001154 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001155 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001156 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1157 if (traits_type::eq_int_type(__i, traits_type::eof()))
1158 {
1159 __err |= ios_base::eofbit;
1160 break;
1161 }
1162 ++__gc_;
Howard Hinnant11b87182013-07-01 00:37:50 +00001163 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001164 break;
1165 }
1166 }
1167 else
1168 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001169 while (__gc_ < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001170 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001171 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1172 if (traits_type::eq_int_type(__i, traits_type::eof()))
1173 {
1174 __err |= ios_base::eofbit;
1175 break;
1176 }
1177 ++__gc_;
Howard Hinnant11b87182013-07-01 00:37:50 +00001178 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001179 break;
1180 }
1181 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001182 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001183 }
1184#ifndef _LIBCPP_NO_EXCEPTIONS
1185 }
1186 catch (...)
1187 {
1188 this->__set_badbit_and_consider_rethrow();
1189 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001190#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001191 return *this;
1192}
1193
1194template<class _CharT, class _Traits>
1195typename basic_istream<_CharT, _Traits>::int_type
1196basic_istream<_CharT, _Traits>::peek()
1197{
1198 __gc_ = 0;
1199 int_type __r = traits_type::eof();
1200#ifndef _LIBCPP_NO_EXCEPTIONS
1201 try
1202 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001203#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001204 sentry __sen(*this, true);
1205 if (__sen)
Howard Hinnant73c85c72012-11-01 17:32:07 +00001206 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001207 __r = this->rdbuf()->sgetc();
Howard Hinnant73c85c72012-11-01 17:32:07 +00001208 if (traits_type::eq_int_type(__r, traits_type::eof()))
1209 this->setstate(ios_base::eofbit);
1210 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001211#ifndef _LIBCPP_NO_EXCEPTIONS
1212 }
1213 catch (...)
1214 {
1215 this->__set_badbit_and_consider_rethrow();
1216 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001217#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001218 return __r;
1219}
1220
1221template<class _CharT, class _Traits>
1222basic_istream<_CharT, _Traits>&
1223basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1224{
1225 __gc_ = 0;
1226#ifndef _LIBCPP_NO_EXCEPTIONS
1227 try
1228 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001229#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001230 sentry __sen(*this, true);
1231 if (__sen)
1232 {
Howard Hinnantcc7bdae2013-03-06 19:27:56 +00001233 __gc_ = this->rdbuf()->sgetn(__s, __n);
1234 if (__gc_ != __n)
1235 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001236 }
1237 else
1238 this->setstate(ios_base::failbit);
1239#ifndef _LIBCPP_NO_EXCEPTIONS
1240 }
1241 catch (...)
1242 {
1243 this->__set_badbit_and_consider_rethrow();
1244 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001245#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001246 return *this;
1247}
1248
1249template<class _CharT, class _Traits>
1250streamsize
1251basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1252{
Howard Hinnantee717d82012-12-20 15:40:28 +00001253 __gc_ = 0;
Marshall Clowa80de492016-07-13 16:58:48 +00001254#ifndef _LIBCPP_NO_EXCEPTIONS
1255 try
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001256 {
Marshall Clowa80de492016-07-13 16:58:48 +00001257#endif // _LIBCPP_NO_EXCEPTIONS
1258 sentry __sen(*this, true);
1259 if (__sen)
1260 {
1261 streamsize __c = this->rdbuf()->in_avail();
1262 switch (__c)
1263 {
1264 case -1:
1265 this->setstate(ios_base::eofbit);
1266 break;
1267 case 0:
1268 break;
1269 default:
1270 read(__s, _VSTD::min(__c, __n));
1271 break;
1272 }
1273 }
1274 else
1275 this->setstate(ios_base::failbit);
1276#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001277 }
Marshall Clowa80de492016-07-13 16:58:48 +00001278 catch (...)
1279 {
1280 this->__set_badbit_and_consider_rethrow();
1281 }
1282#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001283 return __gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001284}
1285
1286template<class _CharT, class _Traits>
1287basic_istream<_CharT, _Traits>&
1288basic_istream<_CharT, _Traits>::putback(char_type __c)
1289{
1290 __gc_ = 0;
1291#ifndef _LIBCPP_NO_EXCEPTIONS
1292 try
1293 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001294#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001295 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001296 sentry __sen(*this, true);
1297 if (__sen)
1298 {
1299 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1300 this->setstate(ios_base::badbit);
1301 }
1302 else
1303 this->setstate(ios_base::failbit);
1304#ifndef _LIBCPP_NO_EXCEPTIONS
1305 }
1306 catch (...)
1307 {
1308 this->__set_badbit_and_consider_rethrow();
1309 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001310#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001311 return *this;
1312}
1313
1314template<class _CharT, class _Traits>
1315basic_istream<_CharT, _Traits>&
1316basic_istream<_CharT, _Traits>::unget()
1317{
1318 __gc_ = 0;
1319#ifndef _LIBCPP_NO_EXCEPTIONS
1320 try
1321 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001322#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001323 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001324 sentry __sen(*this, true);
1325 if (__sen)
1326 {
1327 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1328 this->setstate(ios_base::badbit);
1329 }
1330 else
1331 this->setstate(ios_base::failbit);
1332#ifndef _LIBCPP_NO_EXCEPTIONS
1333 }
1334 catch (...)
1335 {
1336 this->__set_badbit_and_consider_rethrow();
1337 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001338#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001339 return *this;
1340}
1341
1342template<class _CharT, class _Traits>
1343int
1344basic_istream<_CharT, _Traits>::sync()
1345{
1346 int __r = 0;
1347#ifndef _LIBCPP_NO_EXCEPTIONS
1348 try
1349 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001350#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001351 sentry __sen(*this, true);
1352 if (__sen)
1353 {
1354 if (this->rdbuf() == 0)
1355 return -1;
1356 if (this->rdbuf()->pubsync() == -1)
1357 {
1358 this->setstate(ios_base::badbit);
1359 return -1;
1360 }
1361 }
1362#ifndef _LIBCPP_NO_EXCEPTIONS
1363 }
1364 catch (...)
1365 {
1366 this->__set_badbit_and_consider_rethrow();
1367 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001368#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001369 return __r;
1370}
1371
1372template<class _CharT, class _Traits>
1373typename basic_istream<_CharT, _Traits>::pos_type
1374basic_istream<_CharT, _Traits>::tellg()
1375{
1376 pos_type __r(-1);
1377#ifndef _LIBCPP_NO_EXCEPTIONS
1378 try
1379 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001380#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001381 sentry __sen(*this, true);
1382 if (__sen)
1383 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1384#ifndef _LIBCPP_NO_EXCEPTIONS
1385 }
1386 catch (...)
1387 {
1388 this->__set_badbit_and_consider_rethrow();
1389 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001390#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001391 return __r;
1392}
1393
1394template<class _CharT, class _Traits>
1395basic_istream<_CharT, _Traits>&
1396basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1397{
1398#ifndef _LIBCPP_NO_EXCEPTIONS
1399 try
1400 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001401#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001402 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001403 sentry __sen(*this, true);
1404 if (__sen)
Marshall Clow76a86702013-10-31 22:20:45 +00001405 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001406 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1407 this->setstate(ios_base::failbit);
Marshall Clow76a86702013-10-31 22:20:45 +00001408 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001409#ifndef _LIBCPP_NO_EXCEPTIONS
1410 }
1411 catch (...)
1412 {
1413 this->__set_badbit_and_consider_rethrow();
1414 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001415#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001416 return *this;
1417}
1418
1419template<class _CharT, class _Traits>
1420basic_istream<_CharT, _Traits>&
1421basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1422{
1423#ifndef _LIBCPP_NO_EXCEPTIONS
1424 try
1425 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001426#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clowdbef2bb2015-10-25 18:31:51 +00001427 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001428 sentry __sen(*this, true);
1429 if (__sen)
Marshall Clow76a86702013-10-31 22:20:45 +00001430 {
1431 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1432 this->setstate(ios_base::failbit);
1433 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001434#ifndef _LIBCPP_NO_EXCEPTIONS
1435 }
1436 catch (...)
1437 {
1438 this->__set_badbit_and_consider_rethrow();
1439 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001440#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001441 return *this;
1442}
1443
1444template <class _CharT, class _Traits>
1445basic_istream<_CharT, _Traits>&
1446ws(basic_istream<_CharT, _Traits>& __is)
1447{
1448#ifndef _LIBCPP_NO_EXCEPTIONS
1449 try
1450 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001451#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001452 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1453 if (__sen)
1454 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001455 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001456 while (true)
1457 {
1458 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1459 if (_Traits::eq_int_type(__i, _Traits::eof()))
1460 {
1461 __is.setstate(ios_base::eofbit);
1462 break;
1463 }
1464 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001465 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001466 __is.rdbuf()->sbumpc();
1467 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001468 }
1469#ifndef _LIBCPP_NO_EXCEPTIONS
1470 }
1471 catch (...)
1472 {
1473 __is.__set_badbit_and_consider_rethrow();
1474 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001475#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001476 return __is;
1477}
1478
Howard Hinnant73d21a42010-09-04 23:28:19 +00001479#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001480
1481template <class _CharT, class _Traits, class _Tp>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001482inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001483basic_istream<_CharT, _Traits>&
Eric Fiselier7f630e82016-07-24 04:07:22 +00001484operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001485{
Eric Fiselier7f630e82016-07-24 04:07:22 +00001486 __is >> _VSTD::forward<_Tp>(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001487 return __is;
1488}
1489
Howard Hinnant73d21a42010-09-04 23:28:19 +00001490#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001491
1492template <class _CharT, class _Traits>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001493class _LIBCPP_TYPE_VIS_ONLY basic_iostream
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001494 : public basic_istream<_CharT, _Traits>,
1495 public basic_ostream<_CharT, _Traits>
1496{
1497public:
1498 // types:
1499 typedef _CharT char_type;
1500 typedef _Traits traits_type;
1501 typedef typename traits_type::int_type int_type;
1502 typedef typename traits_type::pos_type pos_type;
1503 typedef typename traits_type::off_type off_type;
1504
1505 // constructor/destructor
1506 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb);
1507 virtual ~basic_iostream();
1508protected:
Howard Hinnant73d21a42010-09-04 23:28:19 +00001509#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +00001510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001511 basic_iostream(basic_iostream&& __rhs);
1512#endif
1513
1514 // assign/swap
Howard Hinnant73d21a42010-09-04 23:28:19 +00001515#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +00001516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001517 basic_iostream& operator=(basic_iostream&& __rhs);
1518#endif
1519 void swap(basic_iostream& __rhs);
1520public:
1521};
1522
1523template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001524inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001525basic_iostream<_CharT, _Traits>::basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1526 : basic_istream<_CharT, _Traits>(__sb)
1527{
1528}
1529
Howard Hinnant73d21a42010-09-04 23:28:19 +00001530#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001531
1532template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001533inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001534basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001535 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001536{
1537}
1538
1539template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001540inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001541basic_iostream<_CharT, _Traits>&
1542basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1543{
1544 swap(__rhs);
1545 return *this;
1546}
1547
Howard Hinnant73d21a42010-09-04 23:28:19 +00001548#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001549
1550template <class _CharT, class _Traits>
1551basic_iostream<_CharT, _Traits>::~basic_iostream()
1552{
1553}
1554
1555template <class _CharT, class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001556inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001557void
1558basic_iostream<_CharT, _Traits>::swap(basic_iostream& __rhs)
1559{
1560 basic_istream<char_type, traits_type>::swap(__rhs);
1561}
1562
1563template<class _CharT, class _Traits, class _Allocator>
1564basic_istream<_CharT, _Traits>&
1565operator>>(basic_istream<_CharT, _Traits>& __is,
1566 basic_string<_CharT, _Traits, _Allocator>& __str)
1567{
1568#ifndef _LIBCPP_NO_EXCEPTIONS
1569 try
1570 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001571#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001572 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1573 if (__sen)
1574 {
1575 __str.clear();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001576 streamsize __n = __is.width();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001577 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001578 __n = __str.max_size();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001579 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001580 __n = numeric_limits<streamsize>::max();
1581 streamsize __c = 0;
1582 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001583 ios_base::iostate __err = ios_base::goodbit;
1584 while (__c < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001585 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001586 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1587 if (_Traits::eq_int_type(__i, _Traits::eof()))
1588 {
1589 __err |= ios_base::eofbit;
1590 break;
1591 }
1592 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001593 if (__ct.is(__ct.space, __ch))
1594 break;
1595 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001596 ++__c;
1597 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001598 }
1599 __is.width(0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001600 if (__c == 0)
1601 __err |= ios_base::failbit;
1602 __is.setstate(__err);
1603 }
1604 else
1605 __is.setstate(ios_base::failbit);
1606#ifndef _LIBCPP_NO_EXCEPTIONS
1607 }
1608 catch (...)
1609 {
1610 __is.__set_badbit_and_consider_rethrow();
1611 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001612#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001613 return __is;
1614}
1615
1616template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant324bb032010-08-22 00:02:43 +00001617basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001618getline(basic_istream<_CharT, _Traits>& __is,
1619 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1620{
1621#ifndef _LIBCPP_NO_EXCEPTIONS
1622 try
1623 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001624#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001625 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1626 if (__sen)
1627 {
1628 __str.clear();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001629 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantb97de442011-10-09 15:20:46 +00001630 streamsize __extr = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001631 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001632 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001633 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1634 if (_Traits::eq_int_type(__i, _Traits::eof()))
1635 {
1636 __err |= ios_base::eofbit;
1637 break;
1638 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001639 ++__extr;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001640 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001641 if (_Traits::eq(__ch, __dlm))
1642 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001643 __str.push_back(__ch);
1644 if (__str.size() == __str.max_size())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001645 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001646 __err |= ios_base::failbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001647 break;
1648 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001649 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001650 if (__extr == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001651 __err |= ios_base::failbit;
1652 __is.setstate(__err);
1653 }
1654#ifndef _LIBCPP_NO_EXCEPTIONS
1655 }
1656 catch (...)
1657 {
1658 __is.__set_badbit_and_consider_rethrow();
1659 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001660#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001661 return __is;
1662}
1663
1664template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001665inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001666basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001667getline(basic_istream<_CharT, _Traits>& __is,
1668 basic_string<_CharT, _Traits, _Allocator>& __str)
1669{
1670 return getline(__is, __str, __is.widen('\n'));
1671}
1672
Howard Hinnant73d21a42010-09-04 23:28:19 +00001673#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001674
1675template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001676inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001677basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001678getline(basic_istream<_CharT, _Traits>&& __is,
1679 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1680{
1681 return getline(__is, __str, __dlm);
1682}
1683
1684template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001685inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001686basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001687getline(basic_istream<_CharT, _Traits>&& __is,
1688 basic_string<_CharT, _Traits, _Allocator>& __str)
1689{
1690 return getline(__is, __str, __is.widen('\n'));
1691}
1692
Howard Hinnant73d21a42010-09-04 23:28:19 +00001693#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001694
1695template <class _CharT, class _Traits, size_t _Size>
1696basic_istream<_CharT, _Traits>&
1697operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1698{
1699#ifndef _LIBCPP_NO_EXCEPTIONS
1700 try
1701 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001702#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001703 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1704 if (__sen)
1705 {
1706 basic_string<_CharT, _Traits> __str;
1707 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001708 streamsize __c = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001709 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001710 _CharT __zero = __ct.widen('0');
1711 _CharT __one = __ct.widen('1');
Howard Hinnant92a836c2011-09-01 21:02:45 +00001712 while (__c < _Size)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001713 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001714 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1715 if (_Traits::eq_int_type(__i, _Traits::eof()))
1716 {
1717 __err |= ios_base::eofbit;
1718 break;
1719 }
1720 _CharT __ch = _Traits::to_char_type(__i);
1721 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001722 break;
1723 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001724 ++__c;
1725 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001726 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001727 __x = bitset<_Size>(__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001728 if (__c == 0)
1729 __err |= ios_base::failbit;
1730 __is.setstate(__err);
1731 }
1732 else
1733 __is.setstate(ios_base::failbit);
1734#ifndef _LIBCPP_NO_EXCEPTIONS
1735 }
1736 catch (...)
1737 {
1738 __is.__set_badbit_and_consider_rethrow();
1739 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001740#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001741 return __is;
1742}
1743
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001744_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<char>)
1745_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<wchar_t>)
1746_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_iostream<char>)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001747
1748_LIBCPP_END_NAMESPACE_STD
1749
1750#endif // _LIBCPP_ISTREAM