blob: 04845a24341e3a9eeed428c627c04b6d99acf5ad [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- istream ----------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_ISTREAM
12#define _LIBCPP_ISTREAM
13
14/*
15 istream synopsis
16
17template <class charT, class traits = char_traits<charT> >
18class basic_istream
19 : virtual public basic_ios<charT,traits>
20{
21public:
22 // types (inherited from basic_ios (27.5.4)):
23 typedef charT char_type;
24 typedef traits traits_type;
25 typedef typename traits_type::int_type int_type;
26 typedef typename traits_type::pos_type pos_type;
27 typedef typename traits_type::off_type off_type;
28
29 // 27.7.1.1.1 Constructor/destructor:
30 explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
31 basic_istream(basic_istream&& rhs);
32 virtual ~basic_istream();
33
34 // 27.7.1.1.2 Assign/swap:
35 basic_istream& operator=(basic_istream&& rhs);
36 void swap(basic_istream& rhs);
37
38 // 27.7.1.1.3 Prefix/suffix:
39 class sentry;
40
41 // 27.7.1.2 Formatted input:
42 basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
43 basic_istream& operator>>(basic_ios<char_type, traits_type>&
44 (*pf)(basic_ios<char_type, traits_type>&));
45 basic_istream& operator>>(ios_base& (*pf)(ios_base&));
46 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
47 basic_istream& operator>>(bool& n);
48 basic_istream& operator>>(short& n);
49 basic_istream& operator>>(unsigned short& n);
50 basic_istream& operator>>(int& n);
51 basic_istream& operator>>(unsigned int& n);
52 basic_istream& operator>>(long& n);
53 basic_istream& operator>>(unsigned long& n);
54 basic_istream& operator>>(long long& n);
55 basic_istream& operator>>(unsigned long long& n);
56 basic_istream& operator>>(float& f);
57 basic_istream& operator>>(double& f);
58 basic_istream& operator>>(long double& f);
59 basic_istream& operator>>(void*& p);
60
61 // 27.7.1.3 Unformatted input:
62 streamsize gcount() const;
63 int_type get();
64 basic_istream& get(char_type& c);
65 basic_istream& get(char_type* s, streamsize n);
66 basic_istream& get(char_type* s, streamsize n, char_type delim);
67 basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
68 basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
69
70 basic_istream& getline(char_type* s, streamsize n);
71 basic_istream& getline(char_type* s, streamsize n, char_type delim);
72
73 basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
74 int_type peek();
75 basic_istream& read (char_type* s, streamsize n);
76 streamsize readsome(char_type* s, streamsize n);
77
78 basic_istream& putback(char_type c);
79 basic_istream& unget();
80 int sync();
81
82 pos_type tellg();
83 basic_istream& seekg(pos_type);
84 basic_istream& seekg(off_type, ios_base::seekdir);
Marshall Clow27d29872014-09-16 15:27:01 +000085protected:
86 basic_istream(const basic_istream& rhs) = delete;
87 basic_istream(basic_istream&& rhs);
88 // 27.7.2.1.2 Assign/swap:
89 basic_istream& operator=(const basic_istream& rhs) = delete;
90 basic_istream& operator=(basic_istream&& rhs);
91 void swap(basic_istream& rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +000092};
93
94// 27.7.1.2.3 character extraction templates:
95template<class charT, class traits>
96 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
97
98template<class traits>
99 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
100
101template<class traits>
102 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
103
104template<class charT, class traits>
105 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
106
107template<class traits>
108 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
109
110template<class traits>
111 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
112
113template <class charT, class traits>
114 void
115 swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
116
117typedef basic_istream<char> istream;
118typedef basic_istream<wchar_t> wistream;
119
120template <class charT, class traits = char_traits<charT> >
121class basic_iostream :
122 public basic_istream<charT,traits>,
123 public basic_ostream<charT,traits>
124{
125public:
126 // types:
127 typedef charT char_type;
128 typedef traits traits_type;
129 typedef typename traits_type::int_type int_type;
130 typedef typename traits_type::pos_type pos_type;
131 typedef typename traits_type::off_type off_type;
132
133 // constructor/destructor
134 explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
135 basic_iostream(basic_iostream&& rhs);
136 virtual ~basic_iostream();
137
138 // assign/swap
139 basic_iostream& operator=(basic_iostream&& rhs);
140 void swap(basic_iostream& rhs);
141};
142
143template <class charT, class traits>
144 void
145 swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
146
147typedef basic_iostream<char> iostream;
148typedef basic_iostream<wchar_t> wiostream;
149
150template <class charT, class traits>
151 basic_istream<charT,traits>&
152 ws(basic_istream<charT,traits>& is);
153
154template <class charT, class traits, class T>
155 basic_istream<charT, traits>&
156 operator>>(basic_istream<charT, traits>&& is, T& x);
157
158} // std
159
160*/
161
162#include <__config>
163#include <ostream>
164
Howard Hinnantc5a5fbd2011-11-29 16:45:27 +0000165#include <__undef_min_max>
166
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000167#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000168#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000169#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000170
171_LIBCPP_BEGIN_NAMESPACE_STD
172
173template <class _CharT, class _Traits>
Howard Hinnanta37d3cf2013-08-12 18:38:34 +0000174class _LIBCPP_TYPE_VIS_ONLY basic_istream
Howard Hinnantc51e1022010-05-11 19:42:16 +0000175 : virtual public basic_ios<_CharT, _Traits>
176{
177 streamsize __gc_;
178public:
179 // types (inherited from basic_ios (27.5.4)):
180 typedef _CharT char_type;
181 typedef _Traits traits_type;
182 typedef typename traits_type::int_type int_type;
183 typedef typename traits_type::pos_type pos_type;
184 typedef typename traits_type::off_type off_type;
185
186 // 27.7.1.1.1 Constructor/destructor:
Eric Fiselier815ed732016-09-16 00:00:48 +0000187 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
188 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
189 { this->init(__sb); }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000190 virtual ~basic_istream();
191protected:
Howard Hinnant74279a52010-09-04 23:28:19 +0000192#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Eric Fiselier815ed732016-09-16 00:00:48 +0000193 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000194 basic_istream(basic_istream&& __rhs);
195#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000196 // 27.7.1.1.2 Assign/swap:
Howard Hinnant74279a52010-09-04 23:28:19 +0000197#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Eric Fiselier815ed732016-09-16 00:00:48 +0000198 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000199 basic_istream& operator=(basic_istream&& __rhs);
200#endif
Eric Fiselier815ed732016-09-16 00:00:48 +0000201
202 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
203 void swap(basic_istream& __rhs) {
204 _VSTD::swap(__gc_, __rhs.__gc_);
205 basic_ios<char_type, traits_type>::swap(__rhs);
206 }
Marshall Clow27d29872014-09-16 15:27:01 +0000207
Marshall Clowd37f25c2014-09-17 01:58:15 +0000208#if _LIBCPP_STD_VER > 11
Marshall Clow27d29872014-09-16 15:27:01 +0000209#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
Marshall Clow242d9c12014-09-16 15:33:53 +0000210 basic_istream (const basic_istream& __rhs) = delete;
211 basic_istream& operator=(const basic_istream& __rhs) = delete;
Marshall Clow27d29872014-09-16 15:27:01 +0000212#else
Marshall Clowd37f25c2014-09-17 01:58:15 +0000213 basic_istream (const basic_istream& __rhs); // not defined
214 basic_istream& operator=(const basic_istream& __rhs); // not defined
215#endif
Marshall Clow27d29872014-09-16 15:27:01 +0000216#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000217public:
218
219 // 27.7.1.1.3 Prefix/suffix:
Howard Hinnanta37d3cf2013-08-12 18:38:34 +0000220 class _LIBCPP_TYPE_VIS_ONLY sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000221
222 // 27.7.1.2 Formatted input:
Eric Fiselier815ed732016-09-16 00:00:48 +0000223 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
224 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
225 { return __pf(*this); }
226
227 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000228 basic_istream& operator>>(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000229 (*__pf)(basic_ios<char_type, traits_type>&))
230 { __pf(*this); return *this; }
231
232 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
233 basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
234 { __pf(*this); return *this; }
235
Howard Hinnantc51e1022010-05-11 19:42:16 +0000236 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
237 basic_istream& operator>>(bool& __n);
238 basic_istream& operator>>(short& __n);
239 basic_istream& operator>>(unsigned short& __n);
240 basic_istream& operator>>(int& __n);
241 basic_istream& operator>>(unsigned int& __n);
242 basic_istream& operator>>(long& __n);
243 basic_istream& operator>>(unsigned long& __n);
244 basic_istream& operator>>(long long& __n);
245 basic_istream& operator>>(unsigned long long& __n);
246 basic_istream& operator>>(float& __f);
247 basic_istream& operator>>(double& __f);
248 basic_istream& operator>>(long double& __f);
249 basic_istream& operator>>(void*& __p);
250
251 // 27.7.1.3 Unformatted input:
Howard Hinnant64da2602010-09-22 15:29:08 +0000252 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000253 streamsize gcount() const {return __gc_;}
254 int_type get();
Eric Fiselier815ed732016-09-16 00:00:48 +0000255
256 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
257 basic_istream& get(char_type& __c) {
258 int_type __ch = get();
259 if (__ch != traits_type::eof())
260 __c = traits_type::to_char_type(__ch);
261 return *this;
262 }
263
264 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
265 basic_istream& get(char_type* __s, streamsize __n)
266 { return get(__s, __n, this->widen('\n')); }
267
Howard Hinnantc51e1022010-05-11 19:42:16 +0000268 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
Eric Fiselier815ed732016-09-16 00:00:48 +0000269
270 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
271 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
272 { return get(__sb, this->widen('\n')); }
273
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
275
Eric Fiselier815ed732016-09-16 00:00:48 +0000276 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
277 basic_istream& getline(char_type* __s, streamsize __n)
278 { return getline(__s, __n, this->widen('\n')); }
279
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
281
282 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
283 int_type peek();
284 basic_istream& read (char_type* __s, streamsize __n);
285 streamsize readsome(char_type* __s, streamsize __n);
286
287 basic_istream& putback(char_type __c);
288 basic_istream& unget();
289 int sync();
290
291 pos_type tellg();
292 basic_istream& seekg(pos_type __pos);
293 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
294};
295
296template <class _CharT, class _Traits>
Howard Hinnanta37d3cf2013-08-12 18:38:34 +0000297class _LIBCPP_TYPE_VIS_ONLY basic_istream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000298{
299 bool __ok_;
300
301 sentry(const sentry&); // = delete;
302 sentry& operator=(const sentry&); // = delete;
303
304public:
305 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
306// ~sentry() = default;
307
Howard Hinnant64da2602010-09-22 15:29:08 +0000308 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant86a291f2012-02-21 21:46:43 +0000309 _LIBCPP_EXPLICIT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310 operator bool() const {return __ok_;}
311};
312
313template <class _CharT, class _Traits>
314basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
315 bool __noskipws)
316 : __ok_(false)
317{
318 if (__is.good())
319 {
320 if (__is.tie())
321 __is.tie()->flush();
322 if (!__noskipws && (__is.flags() & ios_base::skipws))
323 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000324 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000325 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantc834c512011-11-29 18:15:50 +0000326 _Ip __i(__is);
327 _Ip __eof;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328 for (; __i != __eof; ++__i)
329 if (!__ct.is(__ct.space, *__i))
330 break;
331 if (__i == __eof)
332 __is.setstate(ios_base::failbit | ios_base::eofbit);
333 }
334 __ok_ = __is.good();
335 }
336 else
337 __is.setstate(ios_base::failbit);
338}
339
Howard Hinnant74279a52010-09-04 23:28:19 +0000340#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341
342template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000343basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
344 : __gc_(__rhs.__gc_)
345{
346 __rhs.__gc_ = 0;
347 this->move(__rhs);
348}
349
350template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351basic_istream<_CharT, _Traits>&
352basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
353{
354 swap(__rhs);
355 return *this;
356}
357
Howard Hinnant74279a52010-09-04 23:28:19 +0000358#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +0000359
360template <class _CharT, class _Traits>
361basic_istream<_CharT, _Traits>::~basic_istream()
362{
363}
364
365template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000366basic_istream<_CharT, _Traits>&
367basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
368{
369#ifndef _LIBCPP_NO_EXCEPTIONS
370 try
371 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000372#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373 sentry __s(*this);
374 if (__s)
375 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000376 typedef istreambuf_iterator<char_type, traits_type> _Ip;
377 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000379 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380 this->setstate(__err);
381 }
382#ifndef _LIBCPP_NO_EXCEPTIONS
383 }
384 catch (...)
385 {
386 this->__set_badbit_and_consider_rethrow();
387 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000388#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389 return *this;
390}
391
392template <class _CharT, class _Traits>
393basic_istream<_CharT, _Traits>&
394basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
395{
396#ifndef _LIBCPP_NO_EXCEPTIONS
397 try
398 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000399#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000400 sentry __s(*this);
401 if (__s)
402 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000403 typedef istreambuf_iterator<char_type, traits_type> _Ip;
404 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000406 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407 this->setstate(__err);
408 }
409#ifndef _LIBCPP_NO_EXCEPTIONS
410 }
411 catch (...)
412 {
413 this->__set_badbit_and_consider_rethrow();
414 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000415#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416 return *this;
417}
418
419template <class _CharT, class _Traits>
420basic_istream<_CharT, _Traits>&
421basic_istream<_CharT, _Traits>::operator>>(long& __n)
422{
423#ifndef _LIBCPP_NO_EXCEPTIONS
424 try
425 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000426#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000427 sentry __s(*this);
428 if (__s)
429 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000430 typedef istreambuf_iterator<char_type, traits_type> _Ip;
431 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000433 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000434 this->setstate(__err);
435 }
436#ifndef _LIBCPP_NO_EXCEPTIONS
437 }
438 catch (...)
439 {
440 this->__set_badbit_and_consider_rethrow();
441 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000442#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000443 return *this;
444}
445
446template <class _CharT, class _Traits>
447basic_istream<_CharT, _Traits>&
448basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
449{
450#ifndef _LIBCPP_NO_EXCEPTIONS
451 try
452 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000453#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454 sentry __s(*this);
455 if (__s)
456 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000457 typedef istreambuf_iterator<char_type, traits_type> _Ip;
458 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000459 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000460 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461 this->setstate(__err);
462 }
463#ifndef _LIBCPP_NO_EXCEPTIONS
464 }
465 catch (...)
466 {
467 this->__set_badbit_and_consider_rethrow();
468 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000469#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000470 return *this;
471}
472
473template <class _CharT, class _Traits>
474basic_istream<_CharT, _Traits>&
475basic_istream<_CharT, _Traits>::operator>>(long long& __n)
476{
477#ifndef _LIBCPP_NO_EXCEPTIONS
478 try
479 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000480#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481 sentry __s(*this);
482 if (__s)
483 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000484 typedef istreambuf_iterator<char_type, traits_type> _Ip;
485 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000487 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488 this->setstate(__err);
489 }
490#ifndef _LIBCPP_NO_EXCEPTIONS
491 }
492 catch (...)
493 {
494 this->__set_badbit_and_consider_rethrow();
495 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000496#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497 return *this;
498}
499
500template <class _CharT, class _Traits>
501basic_istream<_CharT, _Traits>&
502basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
503{
504#ifndef _LIBCPP_NO_EXCEPTIONS
505 try
506 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000507#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000508 sentry __s(*this);
509 if (__s)
510 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000511 typedef istreambuf_iterator<char_type, traits_type> _Ip;
512 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000513 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000514 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515 this->setstate(__err);
516 }
517#ifndef _LIBCPP_NO_EXCEPTIONS
518 }
519 catch (...)
520 {
521 this->__set_badbit_and_consider_rethrow();
522 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000523#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000524 return *this;
525}
526
527template <class _CharT, class _Traits>
528basic_istream<_CharT, _Traits>&
529basic_istream<_CharT, _Traits>::operator>>(float& __n)
530{
531#ifndef _LIBCPP_NO_EXCEPTIONS
532 try
533 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000534#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 sentry __s(*this);
536 if (__s)
537 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000538 typedef istreambuf_iterator<char_type, traits_type> _Ip;
539 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000541 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 this->setstate(__err);
543 }
544#ifndef _LIBCPP_NO_EXCEPTIONS
545 }
546 catch (...)
547 {
548 this->__set_badbit_and_consider_rethrow();
549 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000550#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551 return *this;
552}
553
554template <class _CharT, class _Traits>
555basic_istream<_CharT, _Traits>&
556basic_istream<_CharT, _Traits>::operator>>(double& __n)
557{
558#ifndef _LIBCPP_NO_EXCEPTIONS
559 try
560 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000561#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000562 sentry __s(*this);
563 if (__s)
564 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000565 typedef istreambuf_iterator<char_type, traits_type> _Ip;
566 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000567 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000568 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000569 this->setstate(__err);
570 }
571#ifndef _LIBCPP_NO_EXCEPTIONS
572 }
573 catch (...)
574 {
575 this->__set_badbit_and_consider_rethrow();
576 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000577#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578 return *this;
579}
580
581template <class _CharT, class _Traits>
582basic_istream<_CharT, _Traits>&
583basic_istream<_CharT, _Traits>::operator>>(long double& __n)
584{
585#ifndef _LIBCPP_NO_EXCEPTIONS
586 try
587 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000588#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000589 sentry __s(*this);
590 if (__s)
591 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000592 typedef istreambuf_iterator<char_type, traits_type> _Ip;
593 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000594 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000595 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000596 this->setstate(__err);
597 }
598#ifndef _LIBCPP_NO_EXCEPTIONS
599 }
600 catch (...)
601 {
602 this->__set_badbit_and_consider_rethrow();
603 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000604#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000605 return *this;
606}
607
608template <class _CharT, class _Traits>
609basic_istream<_CharT, _Traits>&
610basic_istream<_CharT, _Traits>::operator>>(bool& __n)
611{
612#ifndef _LIBCPP_NO_EXCEPTIONS
613 try
614 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000615#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 sentry __s(*this);
617 if (__s)
618 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000619 typedef istreambuf_iterator<char_type, traits_type> _Ip;
620 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000621 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000622 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000623 this->setstate(__err);
624 }
625#ifndef _LIBCPP_NO_EXCEPTIONS
626 }
627 catch (...)
628 {
629 this->__set_badbit_and_consider_rethrow();
630 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000631#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632 return *this;
633}
634
635template <class _CharT, class _Traits>
636basic_istream<_CharT, _Traits>&
637basic_istream<_CharT, _Traits>::operator>>(void*& __n)
638{
639#ifndef _LIBCPP_NO_EXCEPTIONS
640 try
641 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000642#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643 sentry __s(*this);
644 if (__s)
645 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000646 typedef istreambuf_iterator<char_type, traits_type> _Ip;
647 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000648 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc834c512011-11-29 18:15:50 +0000649 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000650 this->setstate(__err);
651 }
652#ifndef _LIBCPP_NO_EXCEPTIONS
653 }
654 catch (...)
655 {
656 this->__set_badbit_and_consider_rethrow();
657 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000658#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000659 return *this;
660}
661
662template <class _CharT, class _Traits>
663basic_istream<_CharT, _Traits>&
664basic_istream<_CharT, _Traits>::operator>>(short& __n)
665{
666#ifndef _LIBCPP_NO_EXCEPTIONS
667 try
668 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000669#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000670 sentry __s(*this);
671 if (__s)
672 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000673 typedef istreambuf_iterator<char_type, traits_type> _Ip;
674 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000675 ios_base::iostate __err = ios_base::goodbit;
676 long __temp;
Howard Hinnantc834c512011-11-29 18:15:50 +0000677 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000678 if (__temp < numeric_limits<short>::min())
679 {
680 __err |= ios_base::failbit;
681 __n = numeric_limits<short>::min();
682 }
683 else if (__temp > numeric_limits<short>::max())
684 {
685 __err |= ios_base::failbit;
686 __n = numeric_limits<short>::max();
687 }
688 else
689 __n = static_cast<short>(__temp);
690 this->setstate(__err);
691 }
692#ifndef _LIBCPP_NO_EXCEPTIONS
693 }
694 catch (...)
695 {
696 this->__set_badbit_and_consider_rethrow();
697 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000698#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000699 return *this;
700}
701
702template <class _CharT, class _Traits>
703basic_istream<_CharT, _Traits>&
704basic_istream<_CharT, _Traits>::operator>>(int& __n)
705{
706#ifndef _LIBCPP_NO_EXCEPTIONS
707 try
708 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000709#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710 sentry __s(*this);
711 if (__s)
712 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000713 typedef istreambuf_iterator<char_type, traits_type> _Ip;
714 typedef num_get<char_type, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000715 ios_base::iostate __err = ios_base::goodbit;
716 long __temp;
Howard Hinnantc834c512011-11-29 18:15:50 +0000717 use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000718 if (__temp < numeric_limits<int>::min())
719 {
720 __err |= ios_base::failbit;
721 __n = numeric_limits<int>::min();
722 }
723 else if (__temp > numeric_limits<int>::max())
724 {
725 __err |= ios_base::failbit;
726 __n = numeric_limits<int>::max();
727 }
728 else
729 __n = static_cast<int>(__temp);
730 this->setstate(__err);
731 }
732#ifndef _LIBCPP_NO_EXCEPTIONS
733 }
734 catch (...)
735 {
736 this->__set_badbit_and_consider_rethrow();
737 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000738#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000739 return *this;
740}
741
Howard Hinnantc51e1022010-05-11 19:42:16 +0000742template<class _CharT, class _Traits>
743basic_istream<_CharT, _Traits>&
744operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
745{
746#ifndef _LIBCPP_NO_EXCEPTIONS
747 try
748 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000749#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000750 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
751 if (__sen)
752 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000753 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +0000754 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000755 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
756 streamsize __c = 0;
757 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +0000758 ios_base::iostate __err = ios_base::goodbit;
759 while (__c < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000761 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
762 if (_Traits::eq_int_type(__i, _Traits::eof()))
763 {
764 __err |= ios_base::eofbit;
765 break;
766 }
767 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000768 if (__ct.is(__ct.space, __ch))
769 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000770 *__s++ = __ch;
771 ++__c;
772 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000773 }
774 *__s = _CharT();
775 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000776 if (__c == 0)
777 __err |= ios_base::failbit;
778 __is.setstate(__err);
779 }
780#ifndef _LIBCPP_NO_EXCEPTIONS
781 }
782 catch (...)
783 {
784 __is.__set_badbit_and_consider_rethrow();
785 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000786#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787 return __is;
788}
789
790template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000791inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000792basic_istream<char, _Traits>&
793operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
794{
795 return __is >> (char*)__s;
796}
797
798template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000799inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800basic_istream<char, _Traits>&
801operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
802{
803 return __is >> (char*)__s;
804}
805
806template<class _CharT, class _Traits>
807basic_istream<_CharT, _Traits>&
808operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
809{
810#ifndef _LIBCPP_NO_EXCEPTIONS
811 try
812 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000813#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000814 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
815 if (__sen)
816 {
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000817 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
818 if (_Traits::eq_int_type(__i, _Traits::eof()))
819 __is.setstate(ios_base::eofbit | ios_base::failbit);
820 else
821 __c = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000822 }
823#ifndef _LIBCPP_NO_EXCEPTIONS
824 }
825 catch (...)
826 {
827 __is.__set_badbit_and_consider_rethrow();
828 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000829#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000830 return __is;
831}
832
833template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000834inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000835basic_istream<char, _Traits>&
836operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
837{
838 return __is >> (char&)__c;
839}
840
841template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000842inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000843basic_istream<char, _Traits>&
844operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
845{
846 return __is >> (char&)__c;
847}
848
849template<class _CharT, class _Traits>
850basic_istream<_CharT, _Traits>&
851basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
852{
853 __gc_ = 0;
854#ifndef _LIBCPP_NO_EXCEPTIONS
855 try
856 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000857#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000858 sentry __s(*this, true);
859 if (__s)
860 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861 if (__sb)
862 {
863#ifndef _LIBCPP_NO_EXCEPTIONS
864 try
865 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000866#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000867 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000868 while (true)
869 {
870 typename traits_type::int_type __i = this->rdbuf()->sgetc();
871 if (traits_type::eq_int_type(__i, _Traits::eof()))
872 {
873 __err |= ios_base::eofbit;
874 break;
875 }
876 if (traits_type::eq_int_type(
877 __sb->sputc(traits_type::to_char_type(__i)),
878 traits_type::eof()))
879 break;
880 ++__gc_;
881 this->rdbuf()->sbumpc();
882 }
883 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000884 __err |= ios_base::failbit;
885 this->setstate(__err);
886#ifndef _LIBCPP_NO_EXCEPTIONS
887 }
888 catch (...)
889 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000890 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000891 this->__set_failbit_and_consider_rethrow();
892 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000893#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894 }
895 else
896 this->setstate(ios_base::failbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000897 }
898#ifndef _LIBCPP_NO_EXCEPTIONS
899 }
900 catch (...)
901 {
902 this->__set_badbit_and_consider_rethrow();
903 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000904#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905 return *this;
906}
907
908template<class _CharT, class _Traits>
909typename basic_istream<_CharT, _Traits>::int_type
910basic_istream<_CharT, _Traits>::get()
911{
912 __gc_ = 0;
913 int_type __r = traits_type::eof();
914#ifndef _LIBCPP_NO_EXCEPTIONS
915 try
916 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000917#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000918 sentry __s(*this, true);
919 if (__s)
920 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000921 __r = this->rdbuf()->sbumpc();
922 if (traits_type::eq_int_type(__r, traits_type::eof()))
923 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924 else
Howard Hinnante51e4e92011-09-01 21:02:45 +0000925 __gc_ = 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000926 }
927#ifndef _LIBCPP_NO_EXCEPTIONS
928 }
929 catch (...)
930 {
931 this->__set_badbit_and_consider_rethrow();
932 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000933#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000934 return __r;
935}
936
937template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000938basic_istream<_CharT, _Traits>&
939basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
940{
941 __gc_ = 0;
942#ifndef _LIBCPP_NO_EXCEPTIONS
943 try
944 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000945#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000946 sentry __sen(*this, true);
947 if (__sen)
948 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000949 if (__n > 0)
950 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000951 ios_base::iostate __err = ios_base::goodbit;
952 while (__gc_ < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000953 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000954 int_type __i = this->rdbuf()->sgetc();
955 if (traits_type::eq_int_type(__i, traits_type::eof()))
956 {
957 __err |= ios_base::eofbit;
958 break;
959 }
960 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000961 if (traits_type::eq(__ch, __dlm))
962 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000963 *__s++ = __ch;
964 ++__gc_;
965 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000966 }
967 *__s = char_type();
Howard Hinnante51e4e92011-09-01 21:02:45 +0000968 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000969 __err |= ios_base::failbit;
970 this->setstate(__err);
971 }
972 else
973 this->setstate(ios_base::failbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000974 }
975#ifndef _LIBCPP_NO_EXCEPTIONS
976 }
977 catch (...)
978 {
979 this->__set_badbit_and_consider_rethrow();
980 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000981#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000982 return *this;
983}
984
985template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000986basic_istream<_CharT, _Traits>&
987basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
988 char_type __dlm)
989{
990 __gc_ = 0;
991#ifndef _LIBCPP_NO_EXCEPTIONS
992 try
993 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000994#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000995 sentry __sen(*this, true);
996 if (__sen)
997 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000998 ios_base::iostate __err = ios_base::goodbit;
999#ifndef _LIBCPP_NO_EXCEPTIONS
1000 try
1001 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001002#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +00001003 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001004 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001005 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1006 if (traits_type::eq_int_type(__i, traits_type::eof()))
1007 {
1008 __err |= ios_base::eofbit;
1009 break;
1010 }
1011 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001012 if (traits_type::eq(__ch, __dlm))
1013 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001014 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001015 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001016 ++__gc_;
1017 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001018 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001019#ifndef _LIBCPP_NO_EXCEPTIONS
1020 }
1021 catch (...)
1022 {
1023 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001024#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +00001025 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001026 __err |= ios_base::failbit;
1027 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001028 }
1029#ifndef _LIBCPP_NO_EXCEPTIONS
1030 }
1031 catch (...)
1032 {
1033 this->__set_badbit_and_consider_rethrow();
1034 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001035#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001036 return *this;
1037}
1038
1039template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001040basic_istream<_CharT, _Traits>&
1041basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
1042{
1043 __gc_ = 0;
1044#ifndef _LIBCPP_NO_EXCEPTIONS
1045 try
1046 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001047#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001048 sentry __sen(*this, true);
1049 if (__sen)
1050 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001051 ios_base::iostate __err = ios_base::goodbit;
1052 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001054 typename traits_type::int_type __i = this->rdbuf()->sgetc();
1055 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001056 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001057 __err |= ios_base::eofbit;
1058 break;
1059 }
1060 char_type __ch = traits_type::to_char_type(__i);
1061 if (traits_type::eq(__ch, __dlm))
1062 {
1063 this->rdbuf()->sbumpc();
1064 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001065 break;
1066 }
Howard Hinnante51e4e92011-09-01 21:02:45 +00001067 if (__gc_ >= __n-1)
1068 {
1069 __err |= ios_base::failbit;
1070 break;
1071 }
1072 *__s++ = __ch;
1073 this->rdbuf()->sbumpc();
1074 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001075 }
Howard Hinnante51e4e92011-09-01 21:02:45 +00001076 if (__n > 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001077 *__s = char_type();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001078 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079 __err |= ios_base::failbit;
1080 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001081 }
1082#ifndef _LIBCPP_NO_EXCEPTIONS
1083 }
1084 catch (...)
1085 {
1086 this->__set_badbit_and_consider_rethrow();
1087 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001088#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001089 return *this;
1090}
1091
1092template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001093basic_istream<_CharT, _Traits>&
1094basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
1095{
1096 __gc_ = 0;
1097#ifndef _LIBCPP_NO_EXCEPTIONS
1098 try
1099 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001100#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001101 sentry __sen(*this, true);
1102 if (__sen)
1103 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001104 ios_base::iostate __err = ios_base::goodbit;
1105 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001106 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001107 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001108 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001109 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1110 if (traits_type::eq_int_type(__i, traits_type::eof()))
1111 {
1112 __err |= ios_base::eofbit;
1113 break;
1114 }
1115 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +00001116 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001117 break;
1118 }
1119 }
1120 else
1121 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001122 while (__gc_ < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001123 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001124 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1125 if (traits_type::eq_int_type(__i, traits_type::eof()))
1126 {
1127 __err |= ios_base::eofbit;
1128 break;
1129 }
1130 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +00001131 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001132 break;
1133 }
1134 }
Howard Hinnante51e4e92011-09-01 21:02:45 +00001135 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001136 }
1137#ifndef _LIBCPP_NO_EXCEPTIONS
1138 }
1139 catch (...)
1140 {
1141 this->__set_badbit_and_consider_rethrow();
1142 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001143#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001144 return *this;
1145}
1146
1147template<class _CharT, class _Traits>
1148typename basic_istream<_CharT, _Traits>::int_type
1149basic_istream<_CharT, _Traits>::peek()
1150{
1151 __gc_ = 0;
1152 int_type __r = traits_type::eof();
1153#ifndef _LIBCPP_NO_EXCEPTIONS
1154 try
1155 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001156#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001157 sentry __sen(*this, true);
1158 if (__sen)
Howard Hinnanta4427372012-11-01 17:32:07 +00001159 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001160 __r = this->rdbuf()->sgetc();
Howard Hinnanta4427372012-11-01 17:32:07 +00001161 if (traits_type::eq_int_type(__r, traits_type::eof()))
1162 this->setstate(ios_base::eofbit);
1163 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001164#ifndef _LIBCPP_NO_EXCEPTIONS
1165 }
1166 catch (...)
1167 {
1168 this->__set_badbit_and_consider_rethrow();
1169 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001170#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001171 return __r;
1172}
1173
1174template<class _CharT, class _Traits>
1175basic_istream<_CharT, _Traits>&
1176basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1177{
1178 __gc_ = 0;
1179#ifndef _LIBCPP_NO_EXCEPTIONS
1180 try
1181 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001182#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001183 sentry __sen(*this, true);
1184 if (__sen)
1185 {
Howard Hinnant232466c2013-03-06 19:27:56 +00001186 __gc_ = this->rdbuf()->sgetn(__s, __n);
1187 if (__gc_ != __n)
1188 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001189 }
1190 else
1191 this->setstate(ios_base::failbit);
1192#ifndef _LIBCPP_NO_EXCEPTIONS
1193 }
1194 catch (...)
1195 {
1196 this->__set_badbit_and_consider_rethrow();
1197 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001198#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001199 return *this;
1200}
1201
1202template<class _CharT, class _Traits>
1203streamsize
1204basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1205{
Howard Hinnantaf8555c2012-12-20 15:40:28 +00001206 __gc_ = 0;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001207#ifndef _LIBCPP_NO_EXCEPTIONS
1208 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001209 {
Marshall Clow1c6e3862016-07-13 16:58:48 +00001210#endif // _LIBCPP_NO_EXCEPTIONS
1211 sentry __sen(*this, true);
1212 if (__sen)
1213 {
1214 streamsize __c = this->rdbuf()->in_avail();
1215 switch (__c)
1216 {
1217 case -1:
1218 this->setstate(ios_base::eofbit);
1219 break;
1220 case 0:
1221 break;
1222 default:
1223 read(__s, _VSTD::min(__c, __n));
1224 break;
1225 }
1226 }
1227 else
1228 this->setstate(ios_base::failbit);
1229#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001230 }
Marshall Clow1c6e3862016-07-13 16:58:48 +00001231 catch (...)
1232 {
1233 this->__set_badbit_and_consider_rethrow();
1234 }
1235#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +00001236 return __gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001237}
1238
1239template<class _CharT, class _Traits>
1240basic_istream<_CharT, _Traits>&
1241basic_istream<_CharT, _Traits>::putback(char_type __c)
1242{
1243 __gc_ = 0;
1244#ifndef _LIBCPP_NO_EXCEPTIONS
1245 try
1246 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001247#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001248 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001249 sentry __sen(*this, true);
1250 if (__sen)
1251 {
1252 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1253 this->setstate(ios_base::badbit);
1254 }
1255 else
1256 this->setstate(ios_base::failbit);
1257#ifndef _LIBCPP_NO_EXCEPTIONS
1258 }
1259 catch (...)
1260 {
1261 this->__set_badbit_and_consider_rethrow();
1262 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001263#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001264 return *this;
1265}
1266
1267template<class _CharT, class _Traits>
1268basic_istream<_CharT, _Traits>&
1269basic_istream<_CharT, _Traits>::unget()
1270{
1271 __gc_ = 0;
1272#ifndef _LIBCPP_NO_EXCEPTIONS
1273 try
1274 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001275#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001276 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277 sentry __sen(*this, true);
1278 if (__sen)
1279 {
1280 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1281 this->setstate(ios_base::badbit);
1282 }
1283 else
1284 this->setstate(ios_base::failbit);
1285#ifndef _LIBCPP_NO_EXCEPTIONS
1286 }
1287 catch (...)
1288 {
1289 this->__set_badbit_and_consider_rethrow();
1290 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001291#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001292 return *this;
1293}
1294
1295template<class _CharT, class _Traits>
1296int
1297basic_istream<_CharT, _Traits>::sync()
1298{
1299 int __r = 0;
1300#ifndef _LIBCPP_NO_EXCEPTIONS
1301 try
1302 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001303#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001304 sentry __sen(*this, true);
1305 if (__sen)
1306 {
1307 if (this->rdbuf() == 0)
1308 return -1;
1309 if (this->rdbuf()->pubsync() == -1)
1310 {
1311 this->setstate(ios_base::badbit);
1312 return -1;
1313 }
1314 }
1315#ifndef _LIBCPP_NO_EXCEPTIONS
1316 }
1317 catch (...)
1318 {
1319 this->__set_badbit_and_consider_rethrow();
1320 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001321#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001322 return __r;
1323}
1324
1325template<class _CharT, class _Traits>
1326typename basic_istream<_CharT, _Traits>::pos_type
1327basic_istream<_CharT, _Traits>::tellg()
1328{
1329 pos_type __r(-1);
1330#ifndef _LIBCPP_NO_EXCEPTIONS
1331 try
1332 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001333#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334 sentry __sen(*this, true);
1335 if (__sen)
1336 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1337#ifndef _LIBCPP_NO_EXCEPTIONS
1338 }
1339 catch (...)
1340 {
1341 this->__set_badbit_and_consider_rethrow();
1342 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001343#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001344 return __r;
1345}
1346
1347template<class _CharT, class _Traits>
1348basic_istream<_CharT, _Traits>&
1349basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1350{
1351#ifndef _LIBCPP_NO_EXCEPTIONS
1352 try
1353 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001354#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001355 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001356 sentry __sen(*this, true);
1357 if (__sen)
Marshall Clow29c4daa2013-10-31 22:20:45 +00001358 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001359 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1360 this->setstate(ios_base::failbit);
Marshall Clow29c4daa2013-10-31 22:20:45 +00001361 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001362#ifndef _LIBCPP_NO_EXCEPTIONS
1363 }
1364 catch (...)
1365 {
1366 this->__set_badbit_and_consider_rethrow();
1367 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001368#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001369 return *this;
1370}
1371
1372template<class _CharT, class _Traits>
1373basic_istream<_CharT, _Traits>&
1374basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1375{
1376#ifndef _LIBCPP_NO_EXCEPTIONS
1377 try
1378 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001379#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clow41d9e3a2015-10-25 18:31:51 +00001380 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001381 sentry __sen(*this, true);
1382 if (__sen)
Marshall Clow29c4daa2013-10-31 22:20:45 +00001383 {
1384 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1385 this->setstate(ios_base::failbit);
1386 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001387#ifndef _LIBCPP_NO_EXCEPTIONS
1388 }
1389 catch (...)
1390 {
1391 this->__set_badbit_and_consider_rethrow();
1392 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001393#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001394 return *this;
1395}
1396
1397template <class _CharT, class _Traits>
1398basic_istream<_CharT, _Traits>&
1399ws(basic_istream<_CharT, _Traits>& __is)
1400{
1401#ifndef _LIBCPP_NO_EXCEPTIONS
1402 try
1403 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001404#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001405 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1406 if (__sen)
1407 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001408 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001409 while (true)
1410 {
1411 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1412 if (_Traits::eq_int_type(__i, _Traits::eof()))
1413 {
1414 __is.setstate(ios_base::eofbit);
1415 break;
1416 }
1417 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001418 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001419 __is.rdbuf()->sbumpc();
1420 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001421 }
1422#ifndef _LIBCPP_NO_EXCEPTIONS
1423 }
1424 catch (...)
1425 {
1426 __is.__set_badbit_and_consider_rethrow();
1427 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001428#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001429 return __is;
1430}
1431
Howard Hinnant74279a52010-09-04 23:28:19 +00001432#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +00001433
1434template <class _CharT, class _Traits, class _Tp>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001435inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001436basic_istream<_CharT, _Traits>&
Eric Fiselier7955ef62016-07-24 04:07:22 +00001437operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001438{
Eric Fiselier7955ef62016-07-24 04:07:22 +00001439 __is >> _VSTD::forward<_Tp>(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440 return __is;
1441}
1442
Howard Hinnant74279a52010-09-04 23:28:19 +00001443#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +00001444
1445template <class _CharT, class _Traits>
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001446class _LIBCPP_TYPE_VIS_ONLY basic_iostream
Howard Hinnantc51e1022010-05-11 19:42:16 +00001447 : public basic_istream<_CharT, _Traits>,
1448 public basic_ostream<_CharT, _Traits>
1449{
1450public:
1451 // types:
1452 typedef _CharT char_type;
1453 typedef _Traits traits_type;
1454 typedef typename traits_type::int_type int_type;
1455 typedef typename traits_type::pos_type pos_type;
1456 typedef typename traits_type::off_type off_type;
1457
1458 // constructor/destructor
Eric Fiselier815ed732016-09-16 00:00:48 +00001459 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1460 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1461 : basic_istream<_CharT, _Traits>(__sb)
1462 {}
1463
Howard Hinnantc51e1022010-05-11 19:42:16 +00001464 virtual ~basic_iostream();
1465protected:
Howard Hinnant74279a52010-09-04 23:28:19 +00001466#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Eric Fiselier815ed732016-09-16 00:00:48 +00001467 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001468 basic_iostream(basic_iostream&& __rhs);
1469#endif
1470
1471 // assign/swap
Howard Hinnant74279a52010-09-04 23:28:19 +00001472#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Eric Fiselier815ed732016-09-16 00:00:48 +00001473 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001474 basic_iostream& operator=(basic_iostream&& __rhs);
1475#endif
Eric Fiselier815ed732016-09-16 00:00:48 +00001476 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
1477 void swap(basic_iostream& __rhs)
1478 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001479public:
1480};
1481
Howard Hinnant74279a52010-09-04 23:28:19 +00001482#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +00001483
1484template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001485basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001486 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001487{
1488}
1489
1490template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001491basic_iostream<_CharT, _Traits>&
1492basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1493{
1494 swap(__rhs);
1495 return *this;
1496}
1497
Howard Hinnant74279a52010-09-04 23:28:19 +00001498#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +00001499
1500template <class _CharT, class _Traits>
1501basic_iostream<_CharT, _Traits>::~basic_iostream()
1502{
1503}
1504
Howard Hinnantc51e1022010-05-11 19:42:16 +00001505template<class _CharT, class _Traits, class _Allocator>
1506basic_istream<_CharT, _Traits>&
1507operator>>(basic_istream<_CharT, _Traits>& __is,
1508 basic_string<_CharT, _Traits, _Allocator>& __str)
1509{
1510#ifndef _LIBCPP_NO_EXCEPTIONS
1511 try
1512 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001513#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001514 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1515 if (__sen)
1516 {
1517 __str.clear();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001518 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001519 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001520 __n = __str.max_size();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001521 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001522 __n = numeric_limits<streamsize>::max();
1523 streamsize __c = 0;
1524 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001525 ios_base::iostate __err = ios_base::goodbit;
1526 while (__c < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001527 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001528 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1529 if (_Traits::eq_int_type(__i, _Traits::eof()))
1530 {
1531 __err |= ios_base::eofbit;
1532 break;
1533 }
1534 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001535 if (__ct.is(__ct.space, __ch))
1536 break;
1537 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001538 ++__c;
1539 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540 }
1541 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001542 if (__c == 0)
1543 __err |= ios_base::failbit;
1544 __is.setstate(__err);
1545 }
1546 else
1547 __is.setstate(ios_base::failbit);
1548#ifndef _LIBCPP_NO_EXCEPTIONS
1549 }
1550 catch (...)
1551 {
1552 __is.__set_badbit_and_consider_rethrow();
1553 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001554#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001555 return __is;
1556}
1557
1558template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001559basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560getline(basic_istream<_CharT, _Traits>& __is,
1561 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1562{
1563#ifndef _LIBCPP_NO_EXCEPTIONS
1564 try
1565 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001566#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001567 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1568 if (__sen)
1569 {
1570 __str.clear();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001571 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnante992f762011-10-09 15:20:46 +00001572 streamsize __extr = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001573 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001574 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001575 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1576 if (_Traits::eq_int_type(__i, _Traits::eof()))
1577 {
1578 __err |= ios_base::eofbit;
1579 break;
1580 }
Howard Hinnante992f762011-10-09 15:20:46 +00001581 ++__extr;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001582 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001583 if (_Traits::eq(__ch, __dlm))
1584 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001585 __str.push_back(__ch);
1586 if (__str.size() == __str.max_size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001587 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001588 __err |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001589 break;
1590 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001591 }
Howard Hinnante992f762011-10-09 15:20:46 +00001592 if (__extr == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001593 __err |= ios_base::failbit;
1594 __is.setstate(__err);
1595 }
1596#ifndef _LIBCPP_NO_EXCEPTIONS
1597 }
1598 catch (...)
1599 {
1600 __is.__set_badbit_and_consider_rethrow();
1601 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001602#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001603 return __is;
1604}
1605
1606template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001607inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001608basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001609getline(basic_istream<_CharT, _Traits>& __is,
1610 basic_string<_CharT, _Traits, _Allocator>& __str)
1611{
1612 return getline(__is, __str, __is.widen('\n'));
1613}
1614
Howard Hinnant74279a52010-09-04 23:28:19 +00001615#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +00001616
1617template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001618inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001619basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001620getline(basic_istream<_CharT, _Traits>&& __is,
1621 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1622{
1623 return getline(__is, __str, __dlm);
1624}
1625
1626template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001627inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001628basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001629getline(basic_istream<_CharT, _Traits>&& __is,
1630 basic_string<_CharT, _Traits, _Allocator>& __str)
1631{
1632 return getline(__is, __str, __is.widen('\n'));
1633}
1634
Howard Hinnant74279a52010-09-04 23:28:19 +00001635#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636
1637template <class _CharT, class _Traits, size_t _Size>
1638basic_istream<_CharT, _Traits>&
1639operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1640{
1641#ifndef _LIBCPP_NO_EXCEPTIONS
1642 try
1643 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001644#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001645 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1646 if (__sen)
1647 {
1648 basic_string<_CharT, _Traits> __str;
1649 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier37c22152016-12-24 00:24:44 +00001650 size_t __c = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001651 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001652 _CharT __zero = __ct.widen('0');
1653 _CharT __one = __ct.widen('1');
Howard Hinnante51e4e92011-09-01 21:02:45 +00001654 while (__c < _Size)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001655 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001656 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1657 if (_Traits::eq_int_type(__i, _Traits::eof()))
1658 {
1659 __err |= ios_base::eofbit;
1660 break;
1661 }
1662 _CharT __ch = _Traits::to_char_type(__i);
1663 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001664 break;
1665 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001666 ++__c;
1667 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001668 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001669 __x = bitset<_Size>(__str);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001670 if (__c == 0)
1671 __err |= ios_base::failbit;
1672 __is.setstate(__err);
1673 }
1674 else
1675 __is.setstate(ios_base::failbit);
1676#ifndef _LIBCPP_NO_EXCEPTIONS
1677 }
1678 catch (...)
1679 {
1680 __is.__set_badbit_and_consider_rethrow();
1681 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001682#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001683 return __is;
1684}
1685
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001686_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1687_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1688_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689
1690_LIBCPP_END_NAMESPACE_STD
1691
1692#endif // _LIBCPP_ISTREAM