blob: 24d9f3a9f63a232d0aaf7dcafd423f32c38ac4b6 [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 Hinnant08e17472011-10-17 20:05:10 +0000158#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000159#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000160#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000161
162_LIBCPP_BEGIN_NAMESPACE_STD
163
164template <class _CharT, class _Traits>
Howard Hinnant68a8e902010-09-22 15:29:08 +0000165class _LIBCPP_VISIBLE basic_istream
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000166 : virtual public basic_ios<_CharT, _Traits>
167{
168 streamsize __gc_;
169public:
170 // types (inherited from basic_ios (27.5.4)):
171 typedef _CharT char_type;
172 typedef _Traits traits_type;
173 typedef typename traits_type::int_type int_type;
174 typedef typename traits_type::pos_type pos_type;
175 typedef typename traits_type::off_type off_type;
176
177 // 27.7.1.1.1 Constructor/destructor:
178 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb);
179 virtual ~basic_istream();
180protected:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000181#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +0000182 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000183 basic_istream(basic_istream&& __rhs);
184#endif
185
186 // 27.7.1.1.2 Assign/swap:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000187#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +0000188 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000189 basic_istream& operator=(basic_istream&& __rhs);
190#endif
191 void swap(basic_istream& __rhs);
192public:
193
194 // 27.7.1.1.3 Prefix/suffix:
195 class sentry;
196
197 // 27.7.1.2 Formatted input:
198 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&));
199 basic_istream& operator>>(basic_ios<char_type, traits_type>&
200 (*__pf)(basic_ios<char_type, traits_type>&));
201 basic_istream& operator>>(ios_base& (*__pf)(ios_base&));
202 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
203 basic_istream& operator>>(bool& __n);
204 basic_istream& operator>>(short& __n);
205 basic_istream& operator>>(unsigned short& __n);
206 basic_istream& operator>>(int& __n);
207 basic_istream& operator>>(unsigned int& __n);
208 basic_istream& operator>>(long& __n);
209 basic_istream& operator>>(unsigned long& __n);
210 basic_istream& operator>>(long long& __n);
211 basic_istream& operator>>(unsigned long long& __n);
212 basic_istream& operator>>(float& __f);
213 basic_istream& operator>>(double& __f);
214 basic_istream& operator>>(long double& __f);
215 basic_istream& operator>>(void*& __p);
216
217 // 27.7.1.3 Unformatted input:
Howard Hinnant68a8e902010-09-22 15:29:08 +0000218 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000219 streamsize gcount() const {return __gc_;}
220 int_type get();
221 basic_istream& get(char_type& __c);
222 basic_istream& get(char_type* __s, streamsize __n);
223 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
224 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb);
225 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
226
227 basic_istream& getline(char_type* __s, streamsize __n);
228 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
229
230 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
231 int_type peek();
232 basic_istream& read (char_type* __s, streamsize __n);
233 streamsize readsome(char_type* __s, streamsize __n);
234
235 basic_istream& putback(char_type __c);
236 basic_istream& unget();
237 int sync();
238
239 pos_type tellg();
240 basic_istream& seekg(pos_type __pos);
241 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
242};
243
244template <class _CharT, class _Traits>
Howard Hinnant68a8e902010-09-22 15:29:08 +0000245class _LIBCPP_VISIBLE basic_istream<_CharT, _Traits>::sentry
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000246{
247 bool __ok_;
248
249 sentry(const sentry&); // = delete;
250 sentry& operator=(const sentry&); // = delete;
251
252public:
253 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
254// ~sentry() = default;
255
Howard Hinnant68a8e902010-09-22 15:29:08 +0000256 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000257 // explicit
258 operator bool() const {return __ok_;}
259};
260
261template <class _CharT, class _Traits>
262basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
263 bool __noskipws)
264 : __ok_(false)
265{
266 if (__is.good())
267 {
268 if (__is.tie())
269 __is.tie()->flush();
270 if (!__noskipws && (__is.flags() & ios_base::skipws))
271 {
272 typedef istreambuf_iterator<_CharT, _Traits> _I;
273 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
274 _I __i(__is);
275 _I __eof;
276 for (; __i != __eof; ++__i)
277 if (!__ct.is(__ct.space, *__i))
278 break;
279 if (__i == __eof)
280 __is.setstate(ios_base::failbit | ios_base::eofbit);
281 }
282 __ok_ = __is.good();
283 }
284 else
285 __is.setstate(ios_base::failbit);
286}
287
288template <class _CharT, class _Traits>
289inline _LIBCPP_INLINE_VISIBILITY
290basic_istream<_CharT, _Traits>::basic_istream(basic_streambuf<char_type, traits_type>* __sb)
291 : __gc_(0)
292{
293 this->init(__sb);
294}
295
Howard Hinnant73d21a42010-09-04 23:28:19 +0000296#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000297
298template <class _CharT, class _Traits>
299inline _LIBCPP_INLINE_VISIBILITY
300basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
301 : __gc_(__rhs.__gc_)
302{
303 __rhs.__gc_ = 0;
304 this->move(__rhs);
305}
306
307template <class _CharT, class _Traits>
308inline _LIBCPP_INLINE_VISIBILITY
309basic_istream<_CharT, _Traits>&
310basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
311{
312 swap(__rhs);
313 return *this;
314}
315
Howard Hinnant73d21a42010-09-04 23:28:19 +0000316#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000317
318template <class _CharT, class _Traits>
319basic_istream<_CharT, _Traits>::~basic_istream()
320{
321}
322
323template <class _CharT, class _Traits>
324inline _LIBCPP_INLINE_VISIBILITY
325void
326basic_istream<_CharT, _Traits>::swap(basic_istream& __rhs)
327{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000328 _VSTD::swap(__gc_, __rhs.__gc_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000329 basic_ios<char_type, traits_type>::swap(__rhs);
330}
331
332template <class _CharT, class _Traits>
333basic_istream<_CharT, _Traits>&
334basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
335{
336#ifndef _LIBCPP_NO_EXCEPTIONS
337 try
338 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000339#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000340 sentry __s(*this);
341 if (__s)
342 {
343 typedef istreambuf_iterator<char_type, traits_type> _I;
344 typedef num_get<char_type, _I> _F;
345 ios_base::iostate __err = ios_base::goodbit;
346 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
347 this->setstate(__err);
348 }
349#ifndef _LIBCPP_NO_EXCEPTIONS
350 }
351 catch (...)
352 {
353 this->__set_badbit_and_consider_rethrow();
354 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000355#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000356 return *this;
357}
358
359template <class _CharT, class _Traits>
360basic_istream<_CharT, _Traits>&
361basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
362{
363#ifndef _LIBCPP_NO_EXCEPTIONS
364 try
365 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000366#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000367 sentry __s(*this);
368 if (__s)
369 {
370 typedef istreambuf_iterator<char_type, traits_type> _I;
371 typedef num_get<char_type, _I> _F;
372 ios_base::iostate __err = ios_base::goodbit;
373 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
374 this->setstate(__err);
375 }
376#ifndef _LIBCPP_NO_EXCEPTIONS
377 }
378 catch (...)
379 {
380 this->__set_badbit_and_consider_rethrow();
381 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000382#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000383 return *this;
384}
385
386template <class _CharT, class _Traits>
387basic_istream<_CharT, _Traits>&
388basic_istream<_CharT, _Traits>::operator>>(long& __n)
389{
390#ifndef _LIBCPP_NO_EXCEPTIONS
391 try
392 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000393#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000394 sentry __s(*this);
395 if (__s)
396 {
397 typedef istreambuf_iterator<char_type, traits_type> _I;
398 typedef num_get<char_type, _I> _F;
399 ios_base::iostate __err = ios_base::goodbit;
400 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
401 this->setstate(__err);
402 }
403#ifndef _LIBCPP_NO_EXCEPTIONS
404 }
405 catch (...)
406 {
407 this->__set_badbit_and_consider_rethrow();
408 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000409#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000410 return *this;
411}
412
413template <class _CharT, class _Traits>
414basic_istream<_CharT, _Traits>&
415basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
416{
417#ifndef _LIBCPP_NO_EXCEPTIONS
418 try
419 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000420#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000421 sentry __s(*this);
422 if (__s)
423 {
424 typedef istreambuf_iterator<char_type, traits_type> _I;
425 typedef num_get<char_type, _I> _F;
426 ios_base::iostate __err = ios_base::goodbit;
427 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
428 this->setstate(__err);
429 }
430#ifndef _LIBCPP_NO_EXCEPTIONS
431 }
432 catch (...)
433 {
434 this->__set_badbit_and_consider_rethrow();
435 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000436#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000437 return *this;
438}
439
440template <class _CharT, class _Traits>
441basic_istream<_CharT, _Traits>&
442basic_istream<_CharT, _Traits>::operator>>(long long& __n)
443{
444#ifndef _LIBCPP_NO_EXCEPTIONS
445 try
446 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000447#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000448 sentry __s(*this);
449 if (__s)
450 {
451 typedef istreambuf_iterator<char_type, traits_type> _I;
452 typedef num_get<char_type, _I> _F;
453 ios_base::iostate __err = ios_base::goodbit;
454 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
455 this->setstate(__err);
456 }
457#ifndef _LIBCPP_NO_EXCEPTIONS
458 }
459 catch (...)
460 {
461 this->__set_badbit_and_consider_rethrow();
462 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000463#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000464 return *this;
465}
466
467template <class _CharT, class _Traits>
468basic_istream<_CharT, _Traits>&
469basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
470{
471#ifndef _LIBCPP_NO_EXCEPTIONS
472 try
473 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000474#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000475 sentry __s(*this);
476 if (__s)
477 {
478 typedef istreambuf_iterator<char_type, traits_type> _I;
479 typedef num_get<char_type, _I> _F;
480 ios_base::iostate __err = ios_base::goodbit;
481 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
482 this->setstate(__err);
483 }
484#ifndef _LIBCPP_NO_EXCEPTIONS
485 }
486 catch (...)
487 {
488 this->__set_badbit_and_consider_rethrow();
489 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000490#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000491 return *this;
492}
493
494template <class _CharT, class _Traits>
495basic_istream<_CharT, _Traits>&
496basic_istream<_CharT, _Traits>::operator>>(float& __n)
497{
498#ifndef _LIBCPP_NO_EXCEPTIONS
499 try
500 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000501#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000502 sentry __s(*this);
503 if (__s)
504 {
505 typedef istreambuf_iterator<char_type, traits_type> _I;
506 typedef num_get<char_type, _I> _F;
507 ios_base::iostate __err = ios_base::goodbit;
508 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
509 this->setstate(__err);
510 }
511#ifndef _LIBCPP_NO_EXCEPTIONS
512 }
513 catch (...)
514 {
515 this->__set_badbit_and_consider_rethrow();
516 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000517#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000518 return *this;
519}
520
521template <class _CharT, class _Traits>
522basic_istream<_CharT, _Traits>&
523basic_istream<_CharT, _Traits>::operator>>(double& __n)
524{
525#ifndef _LIBCPP_NO_EXCEPTIONS
526 try
527 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000528#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000529 sentry __s(*this);
530 if (__s)
531 {
532 typedef istreambuf_iterator<char_type, traits_type> _I;
533 typedef num_get<char_type, _I> _F;
534 ios_base::iostate __err = ios_base::goodbit;
535 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
536 this->setstate(__err);
537 }
538#ifndef _LIBCPP_NO_EXCEPTIONS
539 }
540 catch (...)
541 {
542 this->__set_badbit_and_consider_rethrow();
543 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000544#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000545 return *this;
546}
547
548template <class _CharT, class _Traits>
549basic_istream<_CharT, _Traits>&
550basic_istream<_CharT, _Traits>::operator>>(long double& __n)
551{
552#ifndef _LIBCPP_NO_EXCEPTIONS
553 try
554 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000555#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000556 sentry __s(*this);
557 if (__s)
558 {
559 typedef istreambuf_iterator<char_type, traits_type> _I;
560 typedef num_get<char_type, _I> _F;
561 ios_base::iostate __err = ios_base::goodbit;
562 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
563 this->setstate(__err);
564 }
565#ifndef _LIBCPP_NO_EXCEPTIONS
566 }
567 catch (...)
568 {
569 this->__set_badbit_and_consider_rethrow();
570 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000571#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000572 return *this;
573}
574
575template <class _CharT, class _Traits>
576basic_istream<_CharT, _Traits>&
577basic_istream<_CharT, _Traits>::operator>>(bool& __n)
578{
579#ifndef _LIBCPP_NO_EXCEPTIONS
580 try
581 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000582#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000583 sentry __s(*this);
584 if (__s)
585 {
586 typedef istreambuf_iterator<char_type, traits_type> _I;
587 typedef num_get<char_type, _I> _F;
588 ios_base::iostate __err = ios_base::goodbit;
589 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
590 this->setstate(__err);
591 }
592#ifndef _LIBCPP_NO_EXCEPTIONS
593 }
594 catch (...)
595 {
596 this->__set_badbit_and_consider_rethrow();
597 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000598#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000599 return *this;
600}
601
602template <class _CharT, class _Traits>
603basic_istream<_CharT, _Traits>&
604basic_istream<_CharT, _Traits>::operator>>(void*& __n)
605{
606#ifndef _LIBCPP_NO_EXCEPTIONS
607 try
608 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000609#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000610 sentry __s(*this);
611 if (__s)
612 {
613 typedef istreambuf_iterator<char_type, traits_type> _I;
614 typedef num_get<char_type, _I> _F;
615 ios_base::iostate __err = ios_base::goodbit;
616 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __n);
617 this->setstate(__err);
618 }
619#ifndef _LIBCPP_NO_EXCEPTIONS
620 }
621 catch (...)
622 {
623 this->__set_badbit_and_consider_rethrow();
624 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000625#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000626 return *this;
627}
628
629template <class _CharT, class _Traits>
630basic_istream<_CharT, _Traits>&
631basic_istream<_CharT, _Traits>::operator>>(short& __n)
632{
633#ifndef _LIBCPP_NO_EXCEPTIONS
634 try
635 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000636#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000637 sentry __s(*this);
638 if (__s)
639 {
640 typedef istreambuf_iterator<char_type, traits_type> _I;
641 typedef num_get<char_type, _I> _F;
642 ios_base::iostate __err = ios_base::goodbit;
643 long __temp;
644 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __temp);
645 if (__temp < numeric_limits<short>::min())
646 {
647 __err |= ios_base::failbit;
648 __n = numeric_limits<short>::min();
649 }
650 else if (__temp > numeric_limits<short>::max())
651 {
652 __err |= ios_base::failbit;
653 __n = numeric_limits<short>::max();
654 }
655 else
656 __n = static_cast<short>(__temp);
657 this->setstate(__err);
658 }
659#ifndef _LIBCPP_NO_EXCEPTIONS
660 }
661 catch (...)
662 {
663 this->__set_badbit_and_consider_rethrow();
664 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000665#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000666 return *this;
667}
668
669template <class _CharT, class _Traits>
670basic_istream<_CharT, _Traits>&
671basic_istream<_CharT, _Traits>::operator>>(int& __n)
672{
673#ifndef _LIBCPP_NO_EXCEPTIONS
674 try
675 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000676#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000677 sentry __s(*this);
678 if (__s)
679 {
680 typedef istreambuf_iterator<char_type, traits_type> _I;
681 typedef num_get<char_type, _I> _F;
682 ios_base::iostate __err = ios_base::goodbit;
683 long __temp;
684 use_facet<_F>(this->getloc()).get(_I(*this), _I(), *this, __err, __temp);
685 if (__temp < numeric_limits<int>::min())
686 {
687 __err |= ios_base::failbit;
688 __n = numeric_limits<int>::min();
689 }
690 else if (__temp > numeric_limits<int>::max())
691 {
692 __err |= ios_base::failbit;
693 __n = numeric_limits<int>::max();
694 }
695 else
696 __n = static_cast<int>(__temp);
697 this->setstate(__err);
698 }
699#ifndef _LIBCPP_NO_EXCEPTIONS
700 }
701 catch (...)
702 {
703 this->__set_badbit_and_consider_rethrow();
704 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000705#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000706 return *this;
707}
708
709template <class _CharT, class _Traits>
710inline _LIBCPP_INLINE_VISIBILITY
711basic_istream<_CharT, _Traits>&
712basic_istream<_CharT, _Traits>::operator>>(basic_istream& (*__pf)(basic_istream&))
713{
714 return __pf(*this);
715}
716
717template <class _CharT, class _Traits>
718inline _LIBCPP_INLINE_VISIBILITY
719basic_istream<_CharT, _Traits>&
720basic_istream<_CharT, _Traits>::operator>>(basic_ios<char_type, traits_type>&
721 (*__pf)(basic_ios<char_type, traits_type>&))
722{
723 __pf(*this);
724 return *this;
725}
726
727template <class _CharT, class _Traits>
728inline _LIBCPP_INLINE_VISIBILITY
729basic_istream<_CharT, _Traits>&
730basic_istream<_CharT, _Traits>::operator>>(ios_base& (*__pf)(ios_base&))
731{
732 __pf(*this);
733 return *this;
734}
735
736template<class _CharT, class _Traits>
737basic_istream<_CharT, _Traits>&
738operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
739{
740#ifndef _LIBCPP_NO_EXCEPTIONS
741 try
742 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000743#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000744 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
745 if (__sen)
746 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000747 streamsize __n = __is.width();
Howard Hinnant92a836c2011-09-01 21:02:45 +0000748 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000749 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
750 streamsize __c = 0;
751 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +0000752 ios_base::iostate __err = ios_base::goodbit;
753 while (__c < __n-1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000754 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000755 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
756 if (_Traits::eq_int_type(__i, _Traits::eof()))
757 {
758 __err |= ios_base::eofbit;
759 break;
760 }
761 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000762 if (__ct.is(__ct.space, __ch))
763 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000764 *__s++ = __ch;
765 ++__c;
766 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000767 }
768 *__s = _CharT();
769 __is.width(0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000770 if (__c == 0)
771 __err |= ios_base::failbit;
772 __is.setstate(__err);
773 }
774#ifndef _LIBCPP_NO_EXCEPTIONS
775 }
776 catch (...)
777 {
778 __is.__set_badbit_and_consider_rethrow();
779 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000780#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000781 return __is;
782}
783
784template<class _Traits>
785inline _LIBCPP_INLINE_VISIBILITY
786basic_istream<char, _Traits>&
787operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
788{
789 return __is >> (char*)__s;
790}
791
792template<class _Traits>
793inline _LIBCPP_INLINE_VISIBILITY
794basic_istream<char, _Traits>&
795operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
796{
797 return __is >> (char*)__s;
798}
799
800template<class _CharT, class _Traits>
801basic_istream<_CharT, _Traits>&
802operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
803{
804#ifndef _LIBCPP_NO_EXCEPTIONS
805 try
806 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000807#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000808 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
809 if (__sen)
810 {
Howard Hinnantdf85e572011-02-27 18:02:02 +0000811 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
812 if (_Traits::eq_int_type(__i, _Traits::eof()))
813 __is.setstate(ios_base::eofbit | ios_base::failbit);
814 else
815 __c = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000816 }
817#ifndef _LIBCPP_NO_EXCEPTIONS
818 }
819 catch (...)
820 {
821 __is.__set_badbit_and_consider_rethrow();
822 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000823#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000824 return __is;
825}
826
827template<class _Traits>
828inline _LIBCPP_INLINE_VISIBILITY
829basic_istream<char, _Traits>&
830operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
831{
832 return __is >> (char&)__c;
833}
834
835template<class _Traits>
836inline _LIBCPP_INLINE_VISIBILITY
837basic_istream<char, _Traits>&
838operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
839{
840 return __is >> (char&)__c;
841}
842
843template<class _CharT, class _Traits>
844basic_istream<_CharT, _Traits>&
845basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
846{
847 __gc_ = 0;
848#ifndef _LIBCPP_NO_EXCEPTIONS
849 try
850 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000851#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000852 sentry __s(*this, true);
853 if (__s)
854 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000855 if (__sb)
856 {
857#ifndef _LIBCPP_NO_EXCEPTIONS
858 try
859 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000860#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000861 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000862 while (true)
863 {
864 typename traits_type::int_type __i = this->rdbuf()->sgetc();
865 if (traits_type::eq_int_type(__i, _Traits::eof()))
866 {
867 __err |= ios_base::eofbit;
868 break;
869 }
870 if (traits_type::eq_int_type(
871 __sb->sputc(traits_type::to_char_type(__i)),
872 traits_type::eof()))
873 break;
874 ++__gc_;
875 this->rdbuf()->sbumpc();
876 }
877 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000878 __err |= ios_base::failbit;
879 this->setstate(__err);
880#ifndef _LIBCPP_NO_EXCEPTIONS
881 }
882 catch (...)
883 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000884 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000885 this->__set_failbit_and_consider_rethrow();
886 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000887#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000888 }
889 else
890 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000891 }
892#ifndef _LIBCPP_NO_EXCEPTIONS
893 }
894 catch (...)
895 {
896 this->__set_badbit_and_consider_rethrow();
897 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000898#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000899 return *this;
900}
901
902template<class _CharT, class _Traits>
903typename basic_istream<_CharT, _Traits>::int_type
904basic_istream<_CharT, _Traits>::get()
905{
906 __gc_ = 0;
907 int_type __r = traits_type::eof();
908#ifndef _LIBCPP_NO_EXCEPTIONS
909 try
910 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000911#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000912 sentry __s(*this, true);
913 if (__s)
914 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000915 __r = this->rdbuf()->sbumpc();
916 if (traits_type::eq_int_type(__r, traits_type::eof()))
917 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000918 else
Howard Hinnant92a836c2011-09-01 21:02:45 +0000919 __gc_ = 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000920 }
921#ifndef _LIBCPP_NO_EXCEPTIONS
922 }
923 catch (...)
924 {
925 this->__set_badbit_and_consider_rethrow();
926 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000927#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000928 return __r;
929}
930
931template<class _CharT, class _Traits>
932inline _LIBCPP_INLINE_VISIBILITY
933basic_istream<_CharT, _Traits>&
934basic_istream<_CharT, _Traits>::get(char_type& __c)
935{
936 int_type __ch = get();
937 if (__ch != traits_type::eof())
938 __c = traits_type::to_char_type(__ch);
939 return *this;
940}
941
942template<class _CharT, class _Traits>
943basic_istream<_CharT, _Traits>&
944basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
945{
946 __gc_ = 0;
947#ifndef _LIBCPP_NO_EXCEPTIONS
948 try
949 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000950#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000951 sentry __sen(*this, true);
952 if (__sen)
953 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000954 if (__n > 0)
955 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000956 ios_base::iostate __err = ios_base::goodbit;
957 while (__gc_ < __n-1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000958 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000959 int_type __i = this->rdbuf()->sgetc();
960 if (traits_type::eq_int_type(__i, traits_type::eof()))
961 {
962 __err |= ios_base::eofbit;
963 break;
964 }
965 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000966 if (traits_type::eq(__ch, __dlm))
967 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000968 *__s++ = __ch;
969 ++__gc_;
970 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000971 }
972 *__s = char_type();
Howard Hinnant92a836c2011-09-01 21:02:45 +0000973 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000974 __err |= ios_base::failbit;
975 this->setstate(__err);
976 }
977 else
978 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000979 }
980#ifndef _LIBCPP_NO_EXCEPTIONS
981 }
982 catch (...)
983 {
984 this->__set_badbit_and_consider_rethrow();
985 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000986#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000987 return *this;
988}
989
990template<class _CharT, class _Traits>
991inline _LIBCPP_INLINE_VISIBILITY
992basic_istream<_CharT, _Traits>&
993basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n)
994{
995 return get(__s, __n, this->widen('\n'));
996}
997
998template<class _CharT, class _Traits>
999basic_istream<_CharT, _Traits>&
1000basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
1001 char_type __dlm)
1002{
1003 __gc_ = 0;
1004#ifndef _LIBCPP_NO_EXCEPTIONS
1005 try
1006 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001007#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001008 sentry __sen(*this, true);
1009 if (__sen)
1010 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001011 ios_base::iostate __err = ios_base::goodbit;
1012#ifndef _LIBCPP_NO_EXCEPTIONS
1013 try
1014 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001015#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001016 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001017 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001018 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1019 if (traits_type::eq_int_type(__i, traits_type::eof()))
1020 {
1021 __err |= ios_base::eofbit;
1022 break;
1023 }
1024 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001025 if (traits_type::eq(__ch, __dlm))
1026 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001027 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001028 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001029 ++__gc_;
1030 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001031 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001032#ifndef _LIBCPP_NO_EXCEPTIONS
1033 }
1034 catch (...)
1035 {
1036 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001037#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001038 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001039 __err |= ios_base::failbit;
1040 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001041 }
1042#ifndef _LIBCPP_NO_EXCEPTIONS
1043 }
1044 catch (...)
1045 {
1046 this->__set_badbit_and_consider_rethrow();
1047 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001048#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001049 return *this;
1050}
1051
1052template<class _CharT, class _Traits>
1053inline _LIBCPP_INLINE_VISIBILITY
1054basic_istream<_CharT, _Traits>&
1055basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb)
1056{
1057 return get(__sb, this->widen('\n'));
1058}
1059
1060template<class _CharT, class _Traits>
1061basic_istream<_CharT, _Traits>&
1062basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
1063{
1064 __gc_ = 0;
1065#ifndef _LIBCPP_NO_EXCEPTIONS
1066 try
1067 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001068#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001069 sentry __sen(*this, true);
1070 if (__sen)
1071 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001072 ios_base::iostate __err = ios_base::goodbit;
1073 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001074 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001075 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1076 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001077 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001078 __err |= ios_base::eofbit;
1079 break;
1080 }
1081 char_type __ch = traits_type::to_char_type(__i);
1082 if (traits_type::eq(__ch, __dlm))
1083 {
1084 this->rdbuf()->sbumpc();
1085 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001086 break;
1087 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001088 if (__gc_ >= __n-1)
1089 {
1090 __err |= ios_base::failbit;
1091 break;
1092 }
1093 *__s++ = __ch;
1094 this->rdbuf()->sbumpc();
1095 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001096 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001097 if (__n > 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001098 *__s = char_type();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001099 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001100 __err |= ios_base::failbit;
1101 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001102 }
1103#ifndef _LIBCPP_NO_EXCEPTIONS
1104 }
1105 catch (...)
1106 {
1107 this->__set_badbit_and_consider_rethrow();
1108 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001109#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001110 return *this;
1111}
1112
1113template<class _CharT, class _Traits>
1114inline _LIBCPP_INLINE_VISIBILITY
1115basic_istream<_CharT, _Traits>&
1116basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n)
1117{
1118 return getline(__s, __n, this->widen('\n'));
1119}
1120
1121template<class _CharT, class _Traits>
1122basic_istream<_CharT, _Traits>&
1123basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
1124{
1125 __gc_ = 0;
1126#ifndef _LIBCPP_NO_EXCEPTIONS
1127 try
1128 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001129#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001130 sentry __sen(*this, true);
1131 if (__sen)
1132 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001133 ios_base::iostate __err = ios_base::goodbit;
1134 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001135 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001136 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001137 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001138 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1139 if (traits_type::eq_int_type(__i, traits_type::eof()))
1140 {
1141 __err |= ios_base::eofbit;
1142 break;
1143 }
1144 ++__gc_;
1145 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001146 if (traits_type::eq(__ch, __dlm))
1147 break;
1148 }
1149 }
1150 else
1151 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001152 while (__gc_ < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001153 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001154 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1155 if (traits_type::eq_int_type(__i, traits_type::eof()))
1156 {
1157 __err |= ios_base::eofbit;
1158 break;
1159 }
1160 ++__gc_;
1161 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001162 if (traits_type::eq(__ch, __dlm))
1163 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)
1190 __r = this->rdbuf()->sgetc();
1191#ifndef _LIBCPP_NO_EXCEPTIONS
1192 }
1193 catch (...)
1194 {
1195 this->__set_badbit_and_consider_rethrow();
1196 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001197#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001198 return __r;
1199}
1200
1201template<class _CharT, class _Traits>
1202basic_istream<_CharT, _Traits>&
1203basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1204{
1205 __gc_ = 0;
1206#ifndef _LIBCPP_NO_EXCEPTIONS
1207 try
1208 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001209#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001210 sentry __sen(*this, true);
1211 if (__sen)
1212 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001213 ios_base::iostate __err = ios_base::goodbit;
1214 for (; __gc_ < __n; ++__gc_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001215 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001216 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1217 if (traits_type::eq_int_type(__i, traits_type::eof()))
1218 {
1219 this->setstate(ios_base::failbit | ios_base::eofbit);
1220 break;
1221 }
1222 *__s++ = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001223 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001224 }
1225 else
1226 this->setstate(ios_base::failbit);
1227#ifndef _LIBCPP_NO_EXCEPTIONS
1228 }
1229 catch (...)
1230 {
1231 this->__set_badbit_and_consider_rethrow();
1232 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001233#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001234 return *this;
1235}
1236
1237template<class _CharT, class _Traits>
1238streamsize
1239basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1240{
Howard Hinnant92a836c2011-09-01 21:02:45 +00001241 streamsize __c = this->rdbuf()->in_avail();
1242 switch (__c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001243 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001244 case -1:
1245 this->setstate(ios_base::eofbit);
1246 break;
1247 case 0:
1248 break;
1249 default:
1250 read(__s, _VSTD::min(__c, __n));
1251 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001252 }
Howard Hinnant92a836c2011-09-01 21:02:45 +00001253 return __gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001254}
1255
1256template<class _CharT, class _Traits>
1257basic_istream<_CharT, _Traits>&
1258basic_istream<_CharT, _Traits>::putback(char_type __c)
1259{
1260 __gc_ = 0;
1261#ifndef _LIBCPP_NO_EXCEPTIONS
1262 try
1263 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001264#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001265 sentry __sen(*this, true);
1266 if (__sen)
1267 {
1268 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1269 this->setstate(ios_base::badbit);
1270 }
1271 else
1272 this->setstate(ios_base::failbit);
1273#ifndef _LIBCPP_NO_EXCEPTIONS
1274 }
1275 catch (...)
1276 {
1277 this->__set_badbit_and_consider_rethrow();
1278 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001279#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001280 return *this;
1281}
1282
1283template<class _CharT, class _Traits>
1284basic_istream<_CharT, _Traits>&
1285basic_istream<_CharT, _Traits>::unget()
1286{
1287 __gc_ = 0;
1288#ifndef _LIBCPP_NO_EXCEPTIONS
1289 try
1290 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001291#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001292 sentry __sen(*this, true);
1293 if (__sen)
1294 {
1295 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1296 this->setstate(ios_base::badbit);
1297 }
1298 else
1299 this->setstate(ios_base::failbit);
1300#ifndef _LIBCPP_NO_EXCEPTIONS
1301 }
1302 catch (...)
1303 {
1304 this->__set_badbit_and_consider_rethrow();
1305 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001306#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001307 return *this;
1308}
1309
1310template<class _CharT, class _Traits>
1311int
1312basic_istream<_CharT, _Traits>::sync()
1313{
1314 int __r = 0;
1315#ifndef _LIBCPP_NO_EXCEPTIONS
1316 try
1317 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001318#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001319 sentry __sen(*this, true);
1320 if (__sen)
1321 {
1322 if (this->rdbuf() == 0)
1323 return -1;
1324 if (this->rdbuf()->pubsync() == -1)
1325 {
1326 this->setstate(ios_base::badbit);
1327 return -1;
1328 }
1329 }
1330#ifndef _LIBCPP_NO_EXCEPTIONS
1331 }
1332 catch (...)
1333 {
1334 this->__set_badbit_and_consider_rethrow();
1335 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001336#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001337 return __r;
1338}
1339
1340template<class _CharT, class _Traits>
1341typename basic_istream<_CharT, _Traits>::pos_type
1342basic_istream<_CharT, _Traits>::tellg()
1343{
1344 pos_type __r(-1);
1345#ifndef _LIBCPP_NO_EXCEPTIONS
1346 try
1347 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001348#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001349 sentry __sen(*this, true);
1350 if (__sen)
1351 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1352#ifndef _LIBCPP_NO_EXCEPTIONS
1353 }
1354 catch (...)
1355 {
1356 this->__set_badbit_and_consider_rethrow();
1357 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001358#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001359 return __r;
1360}
1361
1362template<class _CharT, class _Traits>
1363basic_istream<_CharT, _Traits>&
1364basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1365{
1366#ifndef _LIBCPP_NO_EXCEPTIONS
1367 try
1368 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001369#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001370 sentry __sen(*this, true);
1371 if (__sen)
1372 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1373 this->setstate(ios_base::failbit);
1374#ifndef _LIBCPP_NO_EXCEPTIONS
1375 }
1376 catch (...)
1377 {
1378 this->__set_badbit_and_consider_rethrow();
1379 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001380#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001381 return *this;
1382}
1383
1384template<class _CharT, class _Traits>
1385basic_istream<_CharT, _Traits>&
1386basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1387{
1388#ifndef _LIBCPP_NO_EXCEPTIONS
1389 try
1390 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001391#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001392 sentry __sen(*this, true);
1393 if (__sen)
1394 this->rdbuf()->pubseekoff(__off, __dir, ios_base::in);
1395#ifndef _LIBCPP_NO_EXCEPTIONS
1396 }
1397 catch (...)
1398 {
1399 this->__set_badbit_and_consider_rethrow();
1400 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001401#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001402 return *this;
1403}
1404
1405template <class _CharT, class _Traits>
1406basic_istream<_CharT, _Traits>&
1407ws(basic_istream<_CharT, _Traits>& __is)
1408{
1409#ifndef _LIBCPP_NO_EXCEPTIONS
1410 try
1411 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001412#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001413 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1414 if (__sen)
1415 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001416 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001417 while (true)
1418 {
1419 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1420 if (_Traits::eq_int_type(__i, _Traits::eof()))
1421 {
1422 __is.setstate(ios_base::eofbit);
1423 break;
1424 }
1425 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001426 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001427 __is.rdbuf()->sbumpc();
1428 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001429 }
1430#ifndef _LIBCPP_NO_EXCEPTIONS
1431 }
1432 catch (...)
1433 {
1434 __is.__set_badbit_and_consider_rethrow();
1435 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001436#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001437 return __is;
1438}
1439
Howard Hinnant73d21a42010-09-04 23:28:19 +00001440#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001441
1442template <class _CharT, class _Traits, class _Tp>
1443inline _LIBCPP_INLINE_VISIBILITY
1444basic_istream<_CharT, _Traits>&
1445operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
1446{
1447 __is >> __x;
1448 return __is;
1449}
1450
Howard Hinnant73d21a42010-09-04 23:28:19 +00001451#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001452
1453template <class _CharT, class _Traits>
Howard Hinnant68a8e902010-09-22 15:29:08 +00001454class _LIBCPP_VISIBLE basic_iostream
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001455 : public basic_istream<_CharT, _Traits>,
1456 public basic_ostream<_CharT, _Traits>
1457{
1458public:
1459 // types:
1460 typedef _CharT char_type;
1461 typedef _Traits traits_type;
1462 typedef typename traits_type::int_type int_type;
1463 typedef typename traits_type::pos_type pos_type;
1464 typedef typename traits_type::off_type off_type;
1465
1466 // constructor/destructor
1467 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb);
1468 virtual ~basic_iostream();
1469protected:
Howard Hinnant73d21a42010-09-04 23:28:19 +00001470#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +00001471 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001472 basic_iostream(basic_iostream&& __rhs);
1473#endif
1474
1475 // assign/swap
Howard Hinnant73d21a42010-09-04 23:28:19 +00001476#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantac6de542011-07-07 21:03:52 +00001477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001478 basic_iostream& operator=(basic_iostream&& __rhs);
1479#endif
1480 void swap(basic_iostream& __rhs);
1481public:
1482};
1483
1484template <class _CharT, class _Traits>
1485inline _LIBCPP_INLINE_VISIBILITY
1486basic_iostream<_CharT, _Traits>::basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1487 : basic_istream<_CharT, _Traits>(__sb)
1488{
1489}
1490
Howard Hinnant73d21a42010-09-04 23:28:19 +00001491#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001492
1493template <class _CharT, class _Traits>
1494inline _LIBCPP_INLINE_VISIBILITY
1495basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001496 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001497{
1498}
1499
1500template <class _CharT, class _Traits>
1501inline _LIBCPP_INLINE_VISIBILITY
1502basic_iostream<_CharT, _Traits>&
1503basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1504{
1505 swap(__rhs);
1506 return *this;
1507}
1508
Howard Hinnant73d21a42010-09-04 23:28:19 +00001509#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001510
1511template <class _CharT, class _Traits>
1512basic_iostream<_CharT, _Traits>::~basic_iostream()
1513{
1514}
1515
1516template <class _CharT, class _Traits>
1517inline _LIBCPP_INLINE_VISIBILITY
1518void
1519basic_iostream<_CharT, _Traits>::swap(basic_iostream& __rhs)
1520{
1521 basic_istream<char_type, traits_type>::swap(__rhs);
1522}
1523
1524template<class _CharT, class _Traits, class _Allocator>
1525basic_istream<_CharT, _Traits>&
1526operator>>(basic_istream<_CharT, _Traits>& __is,
1527 basic_string<_CharT, _Traits, _Allocator>& __str)
1528{
1529#ifndef _LIBCPP_NO_EXCEPTIONS
1530 try
1531 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001532#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001533 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1534 if (__sen)
1535 {
1536 __str.clear();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001537 streamsize __n = __is.width();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001538 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001539 __n = __str.max_size();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001540 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001541 __n = numeric_limits<streamsize>::max();
1542 streamsize __c = 0;
1543 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001544 ios_base::iostate __err = ios_base::goodbit;
1545 while (__c < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001546 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001547 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1548 if (_Traits::eq_int_type(__i, _Traits::eof()))
1549 {
1550 __err |= ios_base::eofbit;
1551 break;
1552 }
1553 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001554 if (__ct.is(__ct.space, __ch))
1555 break;
1556 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001557 ++__c;
1558 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001559 }
1560 __is.width(0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001561 if (__c == 0)
1562 __err |= ios_base::failbit;
1563 __is.setstate(__err);
1564 }
1565 else
1566 __is.setstate(ios_base::failbit);
1567#ifndef _LIBCPP_NO_EXCEPTIONS
1568 }
1569 catch (...)
1570 {
1571 __is.__set_badbit_and_consider_rethrow();
1572 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001573#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001574 return __is;
1575}
1576
1577template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant324bb032010-08-22 00:02:43 +00001578basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001579getline(basic_istream<_CharT, _Traits>& __is,
1580 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1581{
1582#ifndef _LIBCPP_NO_EXCEPTIONS
1583 try
1584 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001585#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001586 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1587 if (__sen)
1588 {
1589 __str.clear();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001590 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantb97de442011-10-09 15:20:46 +00001591 streamsize __extr = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001592 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001593 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001594 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1595 if (_Traits::eq_int_type(__i, _Traits::eof()))
1596 {
1597 __err |= ios_base::eofbit;
1598 break;
1599 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001600 ++__extr;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001601 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001602 if (_Traits::eq(__ch, __dlm))
1603 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001604 __str.push_back(__ch);
1605 if (__str.size() == __str.max_size())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001606 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001607 __err |= ios_base::failbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001608 break;
1609 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001610 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001611 if (__extr == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001612 __err |= ios_base::failbit;
1613 __is.setstate(__err);
1614 }
1615#ifndef _LIBCPP_NO_EXCEPTIONS
1616 }
1617 catch (...)
1618 {
1619 __is.__set_badbit_and_consider_rethrow();
1620 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001621#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001622 return __is;
1623}
1624
1625template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant68a8e902010-09-22 15:29:08 +00001626inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001627basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001628getline(basic_istream<_CharT, _Traits>& __is,
1629 basic_string<_CharT, _Traits, _Allocator>& __str)
1630{
1631 return getline(__is, __str, __is.widen('\n'));
1632}
1633
Howard Hinnant73d21a42010-09-04 23:28:19 +00001634#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001635
1636template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant68a8e902010-09-22 15:29:08 +00001637inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001638basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001639getline(basic_istream<_CharT, _Traits>&& __is,
1640 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1641{
1642 return getline(__is, __str, __dlm);
1643}
1644
1645template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant68a8e902010-09-22 15:29:08 +00001646inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001647basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001648getline(basic_istream<_CharT, _Traits>&& __is,
1649 basic_string<_CharT, _Traits, _Allocator>& __str)
1650{
1651 return getline(__is, __str, __is.widen('\n'));
1652}
1653
Howard Hinnant73d21a42010-09-04 23:28:19 +00001654#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001655
1656template <class _CharT, class _Traits, size_t _Size>
1657basic_istream<_CharT, _Traits>&
1658operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1659{
1660#ifndef _LIBCPP_NO_EXCEPTIONS
1661 try
1662 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001663#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001664 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1665 if (__sen)
1666 {
1667 basic_string<_CharT, _Traits> __str;
1668 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001669 streamsize __c = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001670 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001671 _CharT __zero = __ct.widen('0');
1672 _CharT __one = __ct.widen('1');
Howard Hinnant92a836c2011-09-01 21:02:45 +00001673 while (__c < _Size)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001674 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001675 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1676 if (_Traits::eq_int_type(__i, _Traits::eof()))
1677 {
1678 __err |= ios_base::eofbit;
1679 break;
1680 }
1681 _CharT __ch = _Traits::to_char_type(__i);
1682 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001683 break;
1684 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001685 ++__c;
1686 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001687 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001688 __x = bitset<_Size>(__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001689 if (__c == 0)
1690 __err |= ios_base::failbit;
1691 __is.setstate(__err);
1692 }
1693 else
1694 __is.setstate(ios_base::failbit);
1695#ifndef _LIBCPP_NO_EXCEPTIONS
1696 }
1697 catch (...)
1698 {
1699 __is.__set_badbit_and_consider_rethrow();
1700 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001701#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001702 return __is;
1703}
1704
1705extern template class basic_istream<char>;
1706extern template class basic_istream<wchar_t>;
1707extern template class basic_iostream<char>;
1708
1709_LIBCPP_END_NAMESPACE_STD
1710
1711#endif // _LIBCPP_ISTREAM