blob: 14fa466057cfcfe4bd300f4b2284be31168c2f31 [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);
85};
86
87// 27.7.1.2.3 character extraction templates:
88template<class charT, class traits>
89 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
90
91template<class traits>
92 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
93
94template<class traits>
95 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
96
97template<class charT, class traits>
98 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
99
100template<class traits>
101 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
102
103template<class traits>
104 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
105
106template <class charT, class traits>
107 void
108 swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
109
110typedef basic_istream<char> istream;
111typedef basic_istream<wchar_t> wistream;
112
113template <class charT, class traits = char_traits<charT> >
114class basic_iostream :
115 public basic_istream<charT,traits>,
116 public basic_ostream<charT,traits>
117{
118public:
119 // types:
120 typedef charT char_type;
121 typedef traits traits_type;
122 typedef typename traits_type::int_type int_type;
123 typedef typename traits_type::pos_type pos_type;
124 typedef typename traits_type::off_type off_type;
125
126 // constructor/destructor
127 explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
128 basic_iostream(basic_iostream&& rhs);
129 virtual ~basic_iostream();
130
131 // assign/swap
132 basic_iostream& operator=(basic_iostream&& rhs);
133 void swap(basic_iostream& rhs);
134};
135
136template <class charT, class traits>
137 void
138 swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
139
140typedef basic_iostream<char> iostream;
141typedef basic_iostream<wchar_t> wiostream;
142
143template <class charT, class traits>
144 basic_istream<charT,traits>&
145 ws(basic_istream<charT,traits>& is);
146
147template <class charT, class traits, class T>
148 basic_istream<charT, traits>&
149 operator>>(basic_istream<charT, traits>&& is, T& x);
150
151} // std
152
153*/
154
155#include <__config>
156#include <ostream>
157
Howard Hinnant66c6f972011-11-29 16:45:27 +0000158#include <__undef_min_max>
159
Howard Hinnant08e17472011-10-17 20:05:10 +0000160#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000161#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000162#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000163
164_LIBCPP_BEGIN_NAMESPACE_STD
165
166template <class _CharT, class _Traits>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000167class _LIBCPP_TYPE_VIS_ONLY basic_istream
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000168 : virtual public basic_ios<_CharT, _Traits>
169{
170 streamsize __gc_;
171public:
172 // types (inherited from basic_ios (27.5.4)):
173 typedef _CharT char_type;
174 typedef _Traits traits_type;
175 typedef typename traits_type::int_type int_type;
176 typedef typename traits_type::pos_type pos_type;
177 typedef typename traits_type::off_type off_type;
178
179 // 27.7.1.1.1 Constructor/destructor:
180 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb);
181 virtual ~basic_istream();
182protected:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000183#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +0000184 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000185 basic_istream(basic_istream&& __rhs);
186#endif
187
188 // 27.7.1.1.2 Assign/swap:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000189#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +0000190 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000191 basic_istream& operator=(basic_istream&& __rhs);
192#endif
193 void swap(basic_istream& __rhs);
194public:
195
196 // 27.7.1.1.3 Prefix/suffix:
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000197 class _LIBCPP_TYPE_VIS_ONLY sentry;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000198
199 // 27.7.1.2 Formatted input:
200 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&));
201 basic_istream& operator>>(basic_ios<char_type, traits_type>&
202 (*__pf)(basic_ios<char_type, traits_type>&));
203 basic_istream& operator>>(ios_base& (*__pf)(ios_base&));
204 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
205 basic_istream& operator>>(bool& __n);
206 basic_istream& operator>>(short& __n);
207 basic_istream& operator>>(unsigned short& __n);
208 basic_istream& operator>>(int& __n);
209 basic_istream& operator>>(unsigned int& __n);
210 basic_istream& operator>>(long& __n);
211 basic_istream& operator>>(unsigned long& __n);
212 basic_istream& operator>>(long long& __n);
213 basic_istream& operator>>(unsigned long long& __n);
214 basic_istream& operator>>(float& __f);
215 basic_istream& operator>>(double& __f);
216 basic_istream& operator>>(long double& __f);
217 basic_istream& operator>>(void*& __p);
218
219 // 27.7.1.3 Unformatted input:
Howard Hinnant68a8e902010-09-22 15:29:08 +0000220 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000221 streamsize gcount() const {return __gc_;}
222 int_type get();
223 basic_istream& get(char_type& __c);
224 basic_istream& get(char_type* __s, streamsize __n);
225 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
226 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb);
227 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
228
229 basic_istream& getline(char_type* __s, streamsize __n);
230 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
231
232 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
233 int_type peek();
234 basic_istream& read (char_type* __s, streamsize __n);
235 streamsize readsome(char_type* __s, streamsize __n);
236
237 basic_istream& putback(char_type __c);
238 basic_istream& unget();
239 int sync();
240
241 pos_type tellg();
242 basic_istream& seekg(pos_type __pos);
243 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
244};
245
246template <class _CharT, class _Traits>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000247class _LIBCPP_TYPE_VIS_ONLY basic_istream<_CharT, _Traits>::sentry
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000248{
249 bool __ok_;
250
251 sentry(const sentry&); // = delete;
252 sentry& operator=(const sentry&); // = delete;
253
254public:
255 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
256// ~sentry() = default;
257
Howard Hinnant68a8e902010-09-22 15:29:08 +0000258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant77861882012-02-21 21:46:43 +0000259 _LIBCPP_EXPLICIT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000260 operator bool() const {return __ok_;}
261};
262
263template <class _CharT, class _Traits>
264basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
265 bool __noskipws)
266 : __ok_(false)
267{
268 if (__is.good())
269 {
270 if (__is.tie())
271 __is.tie()->flush();
272 if (!__noskipws && (__is.flags() & ios_base::skipws))
273 {
Howard Hinnant99968442011-11-29 18:15:50 +0000274 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000275 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant99968442011-11-29 18:15:50 +0000276 _Ip __i(__is);
277 _Ip __eof;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000278 for (; __i != __eof; ++__i)
279 if (!__ct.is(__ct.space, *__i))
280 break;
281 if (__i == __eof)
282 __is.setstate(ios_base::failbit | ios_base::eofbit);
283 }
284 __ok_ = __is.good();
285 }
286 else
287 __is.setstate(ios_base::failbit);
288}
289
290template <class _CharT, class _Traits>
291inline _LIBCPP_INLINE_VISIBILITY
292basic_istream<_CharT, _Traits>::basic_istream(basic_streambuf<char_type, traits_type>* __sb)
293 : __gc_(0)
294{
295 this->init(__sb);
296}
297
Howard Hinnant73d21a42010-09-04 23:28:19 +0000298#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000299
300template <class _CharT, class _Traits>
301inline _LIBCPP_INLINE_VISIBILITY
302basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
303 : __gc_(__rhs.__gc_)
304{
305 __rhs.__gc_ = 0;
306 this->move(__rhs);
307}
308
309template <class _CharT, class _Traits>
310inline _LIBCPP_INLINE_VISIBILITY
311basic_istream<_CharT, _Traits>&
312basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
313{
314 swap(__rhs);
315 return *this;
316}
317
Howard Hinnant73d21a42010-09-04 23:28:19 +0000318#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000319
320template <class _CharT, class _Traits>
321basic_istream<_CharT, _Traits>::~basic_istream()
322{
323}
324
325template <class _CharT, class _Traits>
326inline _LIBCPP_INLINE_VISIBILITY
327void
328basic_istream<_CharT, _Traits>::swap(basic_istream& __rhs)
329{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000330 _VSTD::swap(__gc_, __rhs.__gc_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000331 basic_ios<char_type, traits_type>::swap(__rhs);
332}
333
334template <class _CharT, class _Traits>
335basic_istream<_CharT, _Traits>&
336basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
337{
338#ifndef _LIBCPP_NO_EXCEPTIONS
339 try
340 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000341#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000342 sentry __s(*this);
343 if (__s)
344 {
Howard Hinnant99968442011-11-29 18:15:50 +0000345 typedef istreambuf_iterator<char_type, traits_type> _Ip;
346 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000347 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000348 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000349 this->setstate(__err);
350 }
351#ifndef _LIBCPP_NO_EXCEPTIONS
352 }
353 catch (...)
354 {
355 this->__set_badbit_and_consider_rethrow();
356 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000357#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000358 return *this;
359}
360
361template <class _CharT, class _Traits>
362basic_istream<_CharT, _Traits>&
363basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
364{
365#ifndef _LIBCPP_NO_EXCEPTIONS
366 try
367 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000368#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000369 sentry __s(*this);
370 if (__s)
371 {
Howard Hinnant99968442011-11-29 18:15:50 +0000372 typedef istreambuf_iterator<char_type, traits_type> _Ip;
373 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000374 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000375 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000376 this->setstate(__err);
377 }
378#ifndef _LIBCPP_NO_EXCEPTIONS
379 }
380 catch (...)
381 {
382 this->__set_badbit_and_consider_rethrow();
383 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000384#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000385 return *this;
386}
387
388template <class _CharT, class _Traits>
389basic_istream<_CharT, _Traits>&
390basic_istream<_CharT, _Traits>::operator>>(long& __n)
391{
392#ifndef _LIBCPP_NO_EXCEPTIONS
393 try
394 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000395#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000396 sentry __s(*this);
397 if (__s)
398 {
Howard Hinnant99968442011-11-29 18:15:50 +0000399 typedef istreambuf_iterator<char_type, traits_type> _Ip;
400 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000401 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000402 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000403 this->setstate(__err);
404 }
405#ifndef _LIBCPP_NO_EXCEPTIONS
406 }
407 catch (...)
408 {
409 this->__set_badbit_and_consider_rethrow();
410 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000411#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000412 return *this;
413}
414
415template <class _CharT, class _Traits>
416basic_istream<_CharT, _Traits>&
417basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
418{
419#ifndef _LIBCPP_NO_EXCEPTIONS
420 try
421 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000422#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000423 sentry __s(*this);
424 if (__s)
425 {
Howard Hinnant99968442011-11-29 18:15:50 +0000426 typedef istreambuf_iterator<char_type, traits_type> _Ip;
427 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000428 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000429 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000430 this->setstate(__err);
431 }
432#ifndef _LIBCPP_NO_EXCEPTIONS
433 }
434 catch (...)
435 {
436 this->__set_badbit_and_consider_rethrow();
437 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000438#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000439 return *this;
440}
441
442template <class _CharT, class _Traits>
443basic_istream<_CharT, _Traits>&
444basic_istream<_CharT, _Traits>::operator>>(long long& __n)
445{
446#ifndef _LIBCPP_NO_EXCEPTIONS
447 try
448 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000449#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000450 sentry __s(*this);
451 if (__s)
452 {
Howard Hinnant99968442011-11-29 18:15:50 +0000453 typedef istreambuf_iterator<char_type, traits_type> _Ip;
454 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000455 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000456 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000457 this->setstate(__err);
458 }
459#ifndef _LIBCPP_NO_EXCEPTIONS
460 }
461 catch (...)
462 {
463 this->__set_badbit_and_consider_rethrow();
464 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000465#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000466 return *this;
467}
468
469template <class _CharT, class _Traits>
470basic_istream<_CharT, _Traits>&
471basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
472{
473#ifndef _LIBCPP_NO_EXCEPTIONS
474 try
475 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000476#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000477 sentry __s(*this);
478 if (__s)
479 {
Howard Hinnant99968442011-11-29 18:15:50 +0000480 typedef istreambuf_iterator<char_type, traits_type> _Ip;
481 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000482 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000483 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000484 this->setstate(__err);
485 }
486#ifndef _LIBCPP_NO_EXCEPTIONS
487 }
488 catch (...)
489 {
490 this->__set_badbit_and_consider_rethrow();
491 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000492#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000493 return *this;
494}
495
496template <class _CharT, class _Traits>
497basic_istream<_CharT, _Traits>&
498basic_istream<_CharT, _Traits>::operator>>(float& __n)
499{
500#ifndef _LIBCPP_NO_EXCEPTIONS
501 try
502 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000503#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000504 sentry __s(*this);
505 if (__s)
506 {
Howard Hinnant99968442011-11-29 18:15:50 +0000507 typedef istreambuf_iterator<char_type, traits_type> _Ip;
508 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000509 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000510 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000511 this->setstate(__err);
512 }
513#ifndef _LIBCPP_NO_EXCEPTIONS
514 }
515 catch (...)
516 {
517 this->__set_badbit_and_consider_rethrow();
518 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000519#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520 return *this;
521}
522
523template <class _CharT, class _Traits>
524basic_istream<_CharT, _Traits>&
525basic_istream<_CharT, _Traits>::operator>>(double& __n)
526{
527#ifndef _LIBCPP_NO_EXCEPTIONS
528 try
529 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000530#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000531 sentry __s(*this);
532 if (__s)
533 {
Howard Hinnant99968442011-11-29 18:15:50 +0000534 typedef istreambuf_iterator<char_type, traits_type> _Ip;
535 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000536 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000537 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000538 this->setstate(__err);
539 }
540#ifndef _LIBCPP_NO_EXCEPTIONS
541 }
542 catch (...)
543 {
544 this->__set_badbit_and_consider_rethrow();
545 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000546#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000547 return *this;
548}
549
550template <class _CharT, class _Traits>
551basic_istream<_CharT, _Traits>&
552basic_istream<_CharT, _Traits>::operator>>(long double& __n)
553{
554#ifndef _LIBCPP_NO_EXCEPTIONS
555 try
556 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000557#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000558 sentry __s(*this);
559 if (__s)
560 {
Howard Hinnant99968442011-11-29 18:15:50 +0000561 typedef istreambuf_iterator<char_type, traits_type> _Ip;
562 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000563 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000564 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000565 this->setstate(__err);
566 }
567#ifndef _LIBCPP_NO_EXCEPTIONS
568 }
569 catch (...)
570 {
571 this->__set_badbit_and_consider_rethrow();
572 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000573#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000574 return *this;
575}
576
577template <class _CharT, class _Traits>
578basic_istream<_CharT, _Traits>&
579basic_istream<_CharT, _Traits>::operator>>(bool& __n)
580{
581#ifndef _LIBCPP_NO_EXCEPTIONS
582 try
583 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000584#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000585 sentry __s(*this);
586 if (__s)
587 {
Howard Hinnant99968442011-11-29 18:15:50 +0000588 typedef istreambuf_iterator<char_type, traits_type> _Ip;
589 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000590 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000591 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000592 this->setstate(__err);
593 }
594#ifndef _LIBCPP_NO_EXCEPTIONS
595 }
596 catch (...)
597 {
598 this->__set_badbit_and_consider_rethrow();
599 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000600#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000601 return *this;
602}
603
604template <class _CharT, class _Traits>
605basic_istream<_CharT, _Traits>&
606basic_istream<_CharT, _Traits>::operator>>(void*& __n)
607{
608#ifndef _LIBCPP_NO_EXCEPTIONS
609 try
610 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000611#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000612 sentry __s(*this);
613 if (__s)
614 {
Howard Hinnant99968442011-11-29 18:15:50 +0000615 typedef istreambuf_iterator<char_type, traits_type> _Ip;
616 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000617 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant99968442011-11-29 18:15:50 +0000618 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000619 this->setstate(__err);
620 }
621#ifndef _LIBCPP_NO_EXCEPTIONS
622 }
623 catch (...)
624 {
625 this->__set_badbit_and_consider_rethrow();
626 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000627#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000628 return *this;
629}
630
631template <class _CharT, class _Traits>
632basic_istream<_CharT, _Traits>&
633basic_istream<_CharT, _Traits>::operator>>(short& __n)
634{
635#ifndef _LIBCPP_NO_EXCEPTIONS
636 try
637 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000638#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000639 sentry __s(*this);
640 if (__s)
641 {
Howard Hinnant99968442011-11-29 18:15:50 +0000642 typedef istreambuf_iterator<char_type, traits_type> _Ip;
643 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000644 ios_base::iostate __err = ios_base::goodbit;
645 long __temp;
Howard Hinnant99968442011-11-29 18:15:50 +0000646 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000647 if (__temp < numeric_limits<short>::min())
648 {
649 __err |= ios_base::failbit;
650 __n = numeric_limits<short>::min();
651 }
652 else if (__temp > numeric_limits<short>::max())
653 {
654 __err |= ios_base::failbit;
655 __n = numeric_limits<short>::max();
656 }
657 else
658 __n = static_cast<short>(__temp);
659 this->setstate(__err);
660 }
661#ifndef _LIBCPP_NO_EXCEPTIONS
662 }
663 catch (...)
664 {
665 this->__set_badbit_and_consider_rethrow();
666 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000667#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000668 return *this;
669}
670
671template <class _CharT, class _Traits>
672basic_istream<_CharT, _Traits>&
673basic_istream<_CharT, _Traits>::operator>>(int& __n)
674{
675#ifndef _LIBCPP_NO_EXCEPTIONS
676 try
677 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000678#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000679 sentry __s(*this);
680 if (__s)
681 {
Howard Hinnant99968442011-11-29 18:15:50 +0000682 typedef istreambuf_iterator<char_type, traits_type> _Ip;
683 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000684 ios_base::iostate __err = ios_base::goodbit;
685 long __temp;
Howard Hinnant99968442011-11-29 18:15:50 +0000686 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000687 if (__temp < numeric_limits<int>::min())
688 {
689 __err |= ios_base::failbit;
690 __n = numeric_limits<int>::min();
691 }
692 else if (__temp > numeric_limits<int>::max())
693 {
694 __err |= ios_base::failbit;
695 __n = numeric_limits<int>::max();
696 }
697 else
698 __n = static_cast<int>(__temp);
699 this->setstate(__err);
700 }
701#ifndef _LIBCPP_NO_EXCEPTIONS
702 }
703 catch (...)
704 {
705 this->__set_badbit_and_consider_rethrow();
706 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000707#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000708 return *this;
709}
710
711template <class _CharT, class _Traits>
712inline _LIBCPP_INLINE_VISIBILITY
713basic_istream<_CharT, _Traits>&
714basic_istream<_CharT, _Traits>::operator>>(basic_istream& (*__pf)(basic_istream&))
715{
716 return __pf(*this);
717}
718
719template <class _CharT, class _Traits>
720inline _LIBCPP_INLINE_VISIBILITY
721basic_istream<_CharT, _Traits>&
722basic_istream<_CharT, _Traits>::operator>>(basic_ios<char_type, traits_type>&
723 (*__pf)(basic_ios<char_type, traits_type>&))
724{
725 __pf(*this);
726 return *this;
727}
728
729template <class _CharT, class _Traits>
730inline _LIBCPP_INLINE_VISIBILITY
731basic_istream<_CharT, _Traits>&
732basic_istream<_CharT, _Traits>::operator>>(ios_base& (*__pf)(ios_base&))
733{
734 __pf(*this);
735 return *this;
736}
737
738template<class _CharT, class _Traits>
739basic_istream<_CharT, _Traits>&
740operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
741{
742#ifndef _LIBCPP_NO_EXCEPTIONS
743 try
744 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000745#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000746 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
747 if (__sen)
748 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000749 streamsize __n = __is.width();
Howard Hinnant92a836c2011-09-01 21:02:45 +0000750 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000751 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
752 streamsize __c = 0;
753 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +0000754 ios_base::iostate __err = ios_base::goodbit;
755 while (__c < __n-1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000756 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000757 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
758 if (_Traits::eq_int_type(__i, _Traits::eof()))
759 {
760 __err |= ios_base::eofbit;
761 break;
762 }
763 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000764 if (__ct.is(__ct.space, __ch))
765 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000766 *__s++ = __ch;
767 ++__c;
768 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000769 }
770 *__s = _CharT();
771 __is.width(0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000772 if (__c == 0)
773 __err |= ios_base::failbit;
774 __is.setstate(__err);
775 }
776#ifndef _LIBCPP_NO_EXCEPTIONS
777 }
778 catch (...)
779 {
780 __is.__set_badbit_and_consider_rethrow();
781 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000782#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000783 return __is;
784}
785
786template<class _Traits>
787inline _LIBCPP_INLINE_VISIBILITY
788basic_istream<char, _Traits>&
789operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
790{
791 return __is >> (char*)__s;
792}
793
794template<class _Traits>
795inline _LIBCPP_INLINE_VISIBILITY
796basic_istream<char, _Traits>&
797operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
798{
799 return __is >> (char*)__s;
800}
801
802template<class _CharT, class _Traits>
803basic_istream<_CharT, _Traits>&
804operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
805{
806#ifndef _LIBCPP_NO_EXCEPTIONS
807 try
808 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000809#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000810 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
811 if (__sen)
812 {
Howard Hinnantdf85e572011-02-27 18:02:02 +0000813 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
814 if (_Traits::eq_int_type(__i, _Traits::eof()))
815 __is.setstate(ios_base::eofbit | ios_base::failbit);
816 else
817 __c = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000818 }
819#ifndef _LIBCPP_NO_EXCEPTIONS
820 }
821 catch (...)
822 {
823 __is.__set_badbit_and_consider_rethrow();
824 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000825#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000826 return __is;
827}
828
829template<class _Traits>
830inline _LIBCPP_INLINE_VISIBILITY
831basic_istream<char, _Traits>&
832operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
833{
834 return __is >> (char&)__c;
835}
836
837template<class _Traits>
838inline _LIBCPP_INLINE_VISIBILITY
839basic_istream<char, _Traits>&
840operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
841{
842 return __is >> (char&)__c;
843}
844
845template<class _CharT, class _Traits>
846basic_istream<_CharT, _Traits>&
847basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
848{
849 __gc_ = 0;
850#ifndef _LIBCPP_NO_EXCEPTIONS
851 try
852 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000853#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000854 sentry __s(*this, true);
855 if (__s)
856 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000857 if (__sb)
858 {
859#ifndef _LIBCPP_NO_EXCEPTIONS
860 try
861 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000862#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000863 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000864 while (true)
865 {
866 typename traits_type::int_type __i = this->rdbuf()->sgetc();
867 if (traits_type::eq_int_type(__i, _Traits::eof()))
868 {
869 __err |= ios_base::eofbit;
870 break;
871 }
872 if (traits_type::eq_int_type(
873 __sb->sputc(traits_type::to_char_type(__i)),
874 traits_type::eof()))
875 break;
876 ++__gc_;
877 this->rdbuf()->sbumpc();
878 }
879 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000880 __err |= ios_base::failbit;
881 this->setstate(__err);
882#ifndef _LIBCPP_NO_EXCEPTIONS
883 }
884 catch (...)
885 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000886 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000887 this->__set_failbit_and_consider_rethrow();
888 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000889#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000890 }
891 else
892 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000893 }
894#ifndef _LIBCPP_NO_EXCEPTIONS
895 }
896 catch (...)
897 {
898 this->__set_badbit_and_consider_rethrow();
899 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000900#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000901 return *this;
902}
903
904template<class _CharT, class _Traits>
905typename basic_istream<_CharT, _Traits>::int_type
906basic_istream<_CharT, _Traits>::get()
907{
908 __gc_ = 0;
909 int_type __r = traits_type::eof();
910#ifndef _LIBCPP_NO_EXCEPTIONS
911 try
912 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000913#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000914 sentry __s(*this, true);
915 if (__s)
916 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000917 __r = this->rdbuf()->sbumpc();
918 if (traits_type::eq_int_type(__r, traits_type::eof()))
919 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000920 else
Howard Hinnant92a836c2011-09-01 21:02:45 +0000921 __gc_ = 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000922 }
923#ifndef _LIBCPP_NO_EXCEPTIONS
924 }
925 catch (...)
926 {
927 this->__set_badbit_and_consider_rethrow();
928 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000929#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000930 return __r;
931}
932
933template<class _CharT, class _Traits>
934inline _LIBCPP_INLINE_VISIBILITY
935basic_istream<_CharT, _Traits>&
936basic_istream<_CharT, _Traits>::get(char_type& __c)
937{
938 int_type __ch = get();
939 if (__ch != traits_type::eof())
940 __c = traits_type::to_char_type(__ch);
941 return *this;
942}
943
944template<class _CharT, class _Traits>
945basic_istream<_CharT, _Traits>&
946basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
947{
948 __gc_ = 0;
949#ifndef _LIBCPP_NO_EXCEPTIONS
950 try
951 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000952#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000953 sentry __sen(*this, true);
954 if (__sen)
955 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000956 if (__n > 0)
957 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000958 ios_base::iostate __err = ios_base::goodbit;
959 while (__gc_ < __n-1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000960 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000961 int_type __i = this->rdbuf()->sgetc();
962 if (traits_type::eq_int_type(__i, traits_type::eof()))
963 {
964 __err |= ios_base::eofbit;
965 break;
966 }
967 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000968 if (traits_type::eq(__ch, __dlm))
969 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000970 *__s++ = __ch;
971 ++__gc_;
972 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000973 }
974 *__s = char_type();
Howard Hinnant92a836c2011-09-01 21:02:45 +0000975 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000976 __err |= ios_base::failbit;
977 this->setstate(__err);
978 }
979 else
980 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000981 }
982#ifndef _LIBCPP_NO_EXCEPTIONS
983 }
984 catch (...)
985 {
986 this->__set_badbit_and_consider_rethrow();
987 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000988#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000989 return *this;
990}
991
992template<class _CharT, class _Traits>
993inline _LIBCPP_INLINE_VISIBILITY
994basic_istream<_CharT, _Traits>&
995basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n)
996{
997 return get(__s, __n, this->widen('\n'));
998}
999
1000template<class _CharT, class _Traits>
1001basic_istream<_CharT, _Traits>&
1002basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
1003 char_type __dlm)
1004{
1005 __gc_ = 0;
1006#ifndef _LIBCPP_NO_EXCEPTIONS
1007 try
1008 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001009#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001010 sentry __sen(*this, true);
1011 if (__sen)
1012 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001013 ios_base::iostate __err = ios_base::goodbit;
1014#ifndef _LIBCPP_NO_EXCEPTIONS
1015 try
1016 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001017#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001018 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001019 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001020 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1021 if (traits_type::eq_int_type(__i, traits_type::eof()))
1022 {
1023 __err |= ios_base::eofbit;
1024 break;
1025 }
1026 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001027 if (traits_type::eq(__ch, __dlm))
1028 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001029 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001030 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001031 ++__gc_;
1032 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001033 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001034#ifndef _LIBCPP_NO_EXCEPTIONS
1035 }
1036 catch (...)
1037 {
1038 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001039#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001040 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001041 __err |= ios_base::failbit;
1042 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001043 }
1044#ifndef _LIBCPP_NO_EXCEPTIONS
1045 }
1046 catch (...)
1047 {
1048 this->__set_badbit_and_consider_rethrow();
1049 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001050#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001051 return *this;
1052}
1053
1054template<class _CharT, class _Traits>
1055inline _LIBCPP_INLINE_VISIBILITY
1056basic_istream<_CharT, _Traits>&
1057basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb)
1058{
1059 return get(__sb, this->widen('\n'));
1060}
1061
1062template<class _CharT, class _Traits>
1063basic_istream<_CharT, _Traits>&
1064basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
1065{
1066 __gc_ = 0;
1067#ifndef _LIBCPP_NO_EXCEPTIONS
1068 try
1069 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001070#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001071 sentry __sen(*this, true);
1072 if (__sen)
1073 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001074 ios_base::iostate __err = ios_base::goodbit;
1075 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001076 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001077 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1078 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001079 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001080 __err |= ios_base::eofbit;
1081 break;
1082 }
1083 char_type __ch = traits_type::to_char_type(__i);
1084 if (traits_type::eq(__ch, __dlm))
1085 {
1086 this->rdbuf()->sbumpc();
1087 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001088 break;
1089 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001090 if (__gc_ >= __n-1)
1091 {
1092 __err |= ios_base::failbit;
1093 break;
1094 }
1095 *__s++ = __ch;
1096 this->rdbuf()->sbumpc();
1097 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001098 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001099 if (__n > 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001100 *__s = char_type();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001101 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001102 __err |= ios_base::failbit;
1103 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001104 }
1105#ifndef _LIBCPP_NO_EXCEPTIONS
1106 }
1107 catch (...)
1108 {
1109 this->__set_badbit_and_consider_rethrow();
1110 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001111#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001112 return *this;
1113}
1114
1115template<class _CharT, class _Traits>
1116inline _LIBCPP_INLINE_VISIBILITY
1117basic_istream<_CharT, _Traits>&
1118basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n)
1119{
1120 return getline(__s, __n, this->widen('\n'));
1121}
1122
1123template<class _CharT, class _Traits>
1124basic_istream<_CharT, _Traits>&
1125basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
1126{
1127 __gc_ = 0;
1128#ifndef _LIBCPP_NO_EXCEPTIONS
1129 try
1130 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001131#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001132 sentry __sen(*this, true);
1133 if (__sen)
1134 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001135 ios_base::iostate __err = ios_base::goodbit;
1136 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001137 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001138 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001139 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001140 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1141 if (traits_type::eq_int_type(__i, traits_type::eof()))
1142 {
1143 __err |= ios_base::eofbit;
1144 break;
1145 }
1146 ++__gc_;
Howard Hinnant11b87182013-07-01 00:37:50 +00001147 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001148 break;
1149 }
1150 }
1151 else
1152 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001153 while (__gc_ < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001154 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001155 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1156 if (traits_type::eq_int_type(__i, traits_type::eof()))
1157 {
1158 __err |= ios_base::eofbit;
1159 break;
1160 }
1161 ++__gc_;
Howard Hinnant11b87182013-07-01 00:37:50 +00001162 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001163 break;
1164 }
1165 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001166 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001167 }
1168#ifndef _LIBCPP_NO_EXCEPTIONS
1169 }
1170 catch (...)
1171 {
1172 this->__set_badbit_and_consider_rethrow();
1173 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001174#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001175 return *this;
1176}
1177
1178template<class _CharT, class _Traits>
1179typename basic_istream<_CharT, _Traits>::int_type
1180basic_istream<_CharT, _Traits>::peek()
1181{
1182 __gc_ = 0;
1183 int_type __r = traits_type::eof();
1184#ifndef _LIBCPP_NO_EXCEPTIONS
1185 try
1186 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001187#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001188 sentry __sen(*this, true);
1189 if (__sen)
Howard Hinnant73c85c72012-11-01 17:32:07 +00001190 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001191 __r = this->rdbuf()->sgetc();
Howard Hinnant73c85c72012-11-01 17:32:07 +00001192 if (traits_type::eq_int_type(__r, traits_type::eof()))
1193 this->setstate(ios_base::eofbit);
1194 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001195#ifndef _LIBCPP_NO_EXCEPTIONS
1196 }
1197 catch (...)
1198 {
1199 this->__set_badbit_and_consider_rethrow();
1200 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001201#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001202 return __r;
1203}
1204
1205template<class _CharT, class _Traits>
1206basic_istream<_CharT, _Traits>&
1207basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1208{
1209 __gc_ = 0;
1210#ifndef _LIBCPP_NO_EXCEPTIONS
1211 try
1212 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001213#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001214 sentry __sen(*this, true);
1215 if (__sen)
1216 {
Howard Hinnantcc7bdae2013-03-06 19:27:56 +00001217 __gc_ = this->rdbuf()->sgetn(__s, __n);
1218 if (__gc_ != __n)
1219 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001220 }
1221 else
1222 this->setstate(ios_base::failbit);
1223#ifndef _LIBCPP_NO_EXCEPTIONS
1224 }
1225 catch (...)
1226 {
1227 this->__set_badbit_and_consider_rethrow();
1228 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001229#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001230 return *this;
1231}
1232
1233template<class _CharT, class _Traits>
1234streamsize
1235basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1236{
Howard Hinnantee717d82012-12-20 15:40:28 +00001237 __gc_ = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001238 streamsize __c = this->rdbuf()->in_avail();
1239 switch (__c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001240 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001241 case -1:
1242 this->setstate(ios_base::eofbit);
1243 break;
1244 case 0:
1245 break;
1246 default:
1247 read(__s, _VSTD::min(__c, __n));
1248 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001249 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001250 return __gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001251}
1252
1253template<class _CharT, class _Traits>
1254basic_istream<_CharT, _Traits>&
1255basic_istream<_CharT, _Traits>::putback(char_type __c)
1256{
1257 __gc_ = 0;
1258#ifndef _LIBCPP_NO_EXCEPTIONS
1259 try
1260 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001261#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001262 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001263 sentry __sen(*this, true);
1264 if (__sen)
1265 {
1266 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1267 this->setstate(ios_base::badbit);
1268 }
1269 else
1270 this->setstate(ios_base::failbit);
1271#ifndef _LIBCPP_NO_EXCEPTIONS
1272 }
1273 catch (...)
1274 {
1275 this->__set_badbit_and_consider_rethrow();
1276 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001277#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001278 return *this;
1279}
1280
1281template<class _CharT, class _Traits>
1282basic_istream<_CharT, _Traits>&
1283basic_istream<_CharT, _Traits>::unget()
1284{
1285 __gc_ = 0;
1286#ifndef _LIBCPP_NO_EXCEPTIONS
1287 try
1288 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001289#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001290 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001291 sentry __sen(*this, true);
1292 if (__sen)
1293 {
1294 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1295 this->setstate(ios_base::badbit);
1296 }
1297 else
1298 this->setstate(ios_base::failbit);
1299#ifndef _LIBCPP_NO_EXCEPTIONS
1300 }
1301 catch (...)
1302 {
1303 this->__set_badbit_and_consider_rethrow();
1304 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001305#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001306 return *this;
1307}
1308
1309template<class _CharT, class _Traits>
1310int
1311basic_istream<_CharT, _Traits>::sync()
1312{
1313 int __r = 0;
1314#ifndef _LIBCPP_NO_EXCEPTIONS
1315 try
1316 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001317#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001318 sentry __sen(*this, true);
1319 if (__sen)
1320 {
1321 if (this->rdbuf() == 0)
1322 return -1;
1323 if (this->rdbuf()->pubsync() == -1)
1324 {
1325 this->setstate(ios_base::badbit);
1326 return -1;
1327 }
1328 }
1329#ifndef _LIBCPP_NO_EXCEPTIONS
1330 }
1331 catch (...)
1332 {
1333 this->__set_badbit_and_consider_rethrow();
1334 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001335#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001336 return __r;
1337}
1338
1339template<class _CharT, class _Traits>
1340typename basic_istream<_CharT, _Traits>::pos_type
1341basic_istream<_CharT, _Traits>::tellg()
1342{
1343 pos_type __r(-1);
1344#ifndef _LIBCPP_NO_EXCEPTIONS
1345 try
1346 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001347#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001348 sentry __sen(*this, true);
1349 if (__sen)
1350 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1351#ifndef _LIBCPP_NO_EXCEPTIONS
1352 }
1353 catch (...)
1354 {
1355 this->__set_badbit_and_consider_rethrow();
1356 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001357#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001358 return __r;
1359}
1360
1361template<class _CharT, class _Traits>
1362basic_istream<_CharT, _Traits>&
1363basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1364{
1365#ifndef _LIBCPP_NO_EXCEPTIONS
1366 try
1367 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001368#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001369 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001370 sentry __sen(*this, true);
1371 if (__sen)
Marshall Clow76a86702013-10-31 22:20:45 +00001372 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001373 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1374 this->setstate(ios_base::failbit);
Marshall Clow76a86702013-10-31 22:20:45 +00001375 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001376#ifndef _LIBCPP_NO_EXCEPTIONS
1377 }
1378 catch (...)
1379 {
1380 this->__set_badbit_and_consider_rethrow();
1381 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001382#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001383 return *this;
1384}
1385
1386template<class _CharT, class _Traits>
1387basic_istream<_CharT, _Traits>&
1388basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1389{
1390#ifndef _LIBCPP_NO_EXCEPTIONS
1391 try
1392 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001393#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001394 sentry __sen(*this, true);
1395 if (__sen)
Marshall Clow76a86702013-10-31 22:20:45 +00001396 {
1397 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1398 this->setstate(ios_base::failbit);
1399 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001400#ifndef _LIBCPP_NO_EXCEPTIONS
1401 }
1402 catch (...)
1403 {
1404 this->__set_badbit_and_consider_rethrow();
1405 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001406#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001407 return *this;
1408}
1409
1410template <class _CharT, class _Traits>
1411basic_istream<_CharT, _Traits>&
1412ws(basic_istream<_CharT, _Traits>& __is)
1413{
1414#ifndef _LIBCPP_NO_EXCEPTIONS
1415 try
1416 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001417#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001418 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1419 if (__sen)
1420 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001421 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001422 while (true)
1423 {
1424 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1425 if (_Traits::eq_int_type(__i, _Traits::eof()))
1426 {
1427 __is.setstate(ios_base::eofbit);
1428 break;
1429 }
1430 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001431 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001432 __is.rdbuf()->sbumpc();
1433 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001434 }
1435#ifndef _LIBCPP_NO_EXCEPTIONS
1436 }
1437 catch (...)
1438 {
1439 __is.__set_badbit_and_consider_rethrow();
1440 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001441#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001442 return __is;
1443}
1444
Howard Hinnant73d21a42010-09-04 23:28:19 +00001445#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001446
1447template <class _CharT, class _Traits, class _Tp>
1448inline _LIBCPP_INLINE_VISIBILITY
1449basic_istream<_CharT, _Traits>&
1450operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
1451{
1452 __is >> __x;
1453 return __is;
1454}
1455
Howard Hinnant73d21a42010-09-04 23:28:19 +00001456#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001457
1458template <class _CharT, class _Traits>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001459class _LIBCPP_TYPE_VIS_ONLY basic_iostream
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001460 : public basic_istream<_CharT, _Traits>,
1461 public basic_ostream<_CharT, _Traits>
1462{
1463public:
1464 // types:
1465 typedef _CharT char_type;
1466 typedef _Traits traits_type;
1467 typedef typename traits_type::int_type int_type;
1468 typedef typename traits_type::pos_type pos_type;
1469 typedef typename traits_type::off_type off_type;
1470
1471 // constructor/destructor
1472 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb);
1473 virtual ~basic_iostream();
1474protected:
Howard Hinnant73d21a42010-09-04 23:28:19 +00001475#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +00001476 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001477 basic_iostream(basic_iostream&& __rhs);
1478#endif
1479
1480 // assign/swap
Howard Hinnant73d21a42010-09-04 23:28:19 +00001481#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +00001482 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001483 basic_iostream& operator=(basic_iostream&& __rhs);
1484#endif
1485 void swap(basic_iostream& __rhs);
1486public:
1487};
1488
1489template <class _CharT, class _Traits>
1490inline _LIBCPP_INLINE_VISIBILITY
1491basic_iostream<_CharT, _Traits>::basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1492 : basic_istream<_CharT, _Traits>(__sb)
1493{
1494}
1495
Howard Hinnant73d21a42010-09-04 23:28:19 +00001496#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001497
1498template <class _CharT, class _Traits>
1499inline _LIBCPP_INLINE_VISIBILITY
1500basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001501 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001502{
1503}
1504
1505template <class _CharT, class _Traits>
1506inline _LIBCPP_INLINE_VISIBILITY
1507basic_iostream<_CharT, _Traits>&
1508basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1509{
1510 swap(__rhs);
1511 return *this;
1512}
1513
Howard Hinnant73d21a42010-09-04 23:28:19 +00001514#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001515
1516template <class _CharT, class _Traits>
1517basic_iostream<_CharT, _Traits>::~basic_iostream()
1518{
1519}
1520
1521template <class _CharT, class _Traits>
1522inline _LIBCPP_INLINE_VISIBILITY
1523void
1524basic_iostream<_CharT, _Traits>::swap(basic_iostream& __rhs)
1525{
1526 basic_istream<char_type, traits_type>::swap(__rhs);
1527}
1528
1529template<class _CharT, class _Traits, class _Allocator>
1530basic_istream<_CharT, _Traits>&
1531operator>>(basic_istream<_CharT, _Traits>& __is,
1532 basic_string<_CharT, _Traits, _Allocator>& __str)
1533{
1534#ifndef _LIBCPP_NO_EXCEPTIONS
1535 try
1536 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001537#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001538 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1539 if (__sen)
1540 {
1541 __str.clear();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001542 streamsize __n = __is.width();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001543 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001544 __n = __str.max_size();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001545 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001546 __n = numeric_limits<streamsize>::max();
1547 streamsize __c = 0;
1548 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001549 ios_base::iostate __err = ios_base::goodbit;
1550 while (__c < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001551 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001552 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1553 if (_Traits::eq_int_type(__i, _Traits::eof()))
1554 {
1555 __err |= ios_base::eofbit;
1556 break;
1557 }
1558 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001559 if (__ct.is(__ct.space, __ch))
1560 break;
1561 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001562 ++__c;
1563 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001564 }
1565 __is.width(0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001566 if (__c == 0)
1567 __err |= ios_base::failbit;
1568 __is.setstate(__err);
1569 }
1570 else
1571 __is.setstate(ios_base::failbit);
1572#ifndef _LIBCPP_NO_EXCEPTIONS
1573 }
1574 catch (...)
1575 {
1576 __is.__set_badbit_and_consider_rethrow();
1577 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001578#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001579 return __is;
1580}
1581
1582template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant324bb032010-08-22 00:02:43 +00001583basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001584getline(basic_istream<_CharT, _Traits>& __is,
1585 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1586{
1587#ifndef _LIBCPP_NO_EXCEPTIONS
1588 try
1589 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001590#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001591 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1592 if (__sen)
1593 {
1594 __str.clear();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001595 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantb97de442011-10-09 15:20:46 +00001596 streamsize __extr = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001597 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001598 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001599 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1600 if (_Traits::eq_int_type(__i, _Traits::eof()))
1601 {
1602 __err |= ios_base::eofbit;
1603 break;
1604 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001605 ++__extr;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001606 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001607 if (_Traits::eq(__ch, __dlm))
1608 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001609 __str.push_back(__ch);
1610 if (__str.size() == __str.max_size())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001611 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001612 __err |= ios_base::failbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001613 break;
1614 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001615 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001616 if (__extr == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001617 __err |= ios_base::failbit;
1618 __is.setstate(__err);
1619 }
1620#ifndef _LIBCPP_NO_EXCEPTIONS
1621 }
1622 catch (...)
1623 {
1624 __is.__set_badbit_and_consider_rethrow();
1625 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001626#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001627 return __is;
1628}
1629
1630template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant68a8e902010-09-22 15:29:08 +00001631inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001632basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001633getline(basic_istream<_CharT, _Traits>& __is,
1634 basic_string<_CharT, _Traits, _Allocator>& __str)
1635{
1636 return getline(__is, __str, __is.widen('\n'));
1637}
1638
Howard Hinnant73d21a42010-09-04 23:28:19 +00001639#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001640
1641template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant68a8e902010-09-22 15:29:08 +00001642inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001643basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001644getline(basic_istream<_CharT, _Traits>&& __is,
1645 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1646{
1647 return getline(__is, __str, __dlm);
1648}
1649
1650template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant68a8e902010-09-22 15:29:08 +00001651inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001652basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001653getline(basic_istream<_CharT, _Traits>&& __is,
1654 basic_string<_CharT, _Traits, _Allocator>& __str)
1655{
1656 return getline(__is, __str, __is.widen('\n'));
1657}
1658
Howard Hinnant73d21a42010-09-04 23:28:19 +00001659#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001660
1661template <class _CharT, class _Traits, size_t _Size>
1662basic_istream<_CharT, _Traits>&
1663operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1664{
1665#ifndef _LIBCPP_NO_EXCEPTIONS
1666 try
1667 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001668#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001669 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1670 if (__sen)
1671 {
1672 basic_string<_CharT, _Traits> __str;
1673 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001674 streamsize __c = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001675 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001676 _CharT __zero = __ct.widen('0');
1677 _CharT __one = __ct.widen('1');
Howard Hinnant92a836c2011-09-01 21:02:45 +00001678 while (__c < _Size)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001679 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001680 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1681 if (_Traits::eq_int_type(__i, _Traits::eof()))
1682 {
1683 __err |= ios_base::eofbit;
1684 break;
1685 }
1686 _CharT __ch = _Traits::to_char_type(__i);
1687 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001688 break;
1689 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001690 ++__c;
1691 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001692 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001693 __x = bitset<_Size>(__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001694 if (__c == 0)
1695 __err |= ios_base::failbit;
1696 __is.setstate(__err);
1697 }
1698 else
1699 __is.setstate(ios_base::failbit);
1700#ifndef _LIBCPP_NO_EXCEPTIONS
1701 }
1702 catch (...)
1703 {
1704 __is.__set_badbit_and_consider_rethrow();
1705 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001706#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001707 return __is;
1708}
1709
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001710_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<char>)
1711_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<wchar_t>)
1712_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_iostream<char>)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001713
1714_LIBCPP_END_NAMESPACE_STD
1715
1716#endif // _LIBCPP_ISTREAM