blob: d6217bbb8009d8aa7cbe1d8c735732be6524452d [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- istream ----------------------------------===//
3//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_ISTREAM
11#define _LIBCPP_ISTREAM
12
13/*
14 istream synopsis
15
16template <class charT, class traits = char_traits<charT> >
17class basic_istream
18 : virtual public basic_ios<charT,traits>
19{
20public:
21 // types (inherited from basic_ios (27.5.4)):
22 typedef charT char_type;
23 typedef traits traits_type;
24 typedef typename traits_type::int_type int_type;
25 typedef typename traits_type::pos_type pos_type;
26 typedef typename traits_type::off_type off_type;
27
28 // 27.7.1.1.1 Constructor/destructor:
29 explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
30 basic_istream(basic_istream&& rhs);
31 virtual ~basic_istream();
32
33 // 27.7.1.1.2 Assign/swap:
34 basic_istream& operator=(basic_istream&& rhs);
35 void swap(basic_istream& rhs);
36
37 // 27.7.1.1.3 Prefix/suffix:
38 class sentry;
39
40 // 27.7.1.2 Formatted input:
41 basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
42 basic_istream& operator>>(basic_ios<char_type, traits_type>&
43 (*pf)(basic_ios<char_type, traits_type>&));
44 basic_istream& operator>>(ios_base& (*pf)(ios_base&));
45 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
46 basic_istream& operator>>(bool& n);
47 basic_istream& operator>>(short& n);
48 basic_istream& operator>>(unsigned short& n);
49 basic_istream& operator>>(int& n);
50 basic_istream& operator>>(unsigned int& n);
51 basic_istream& operator>>(long& n);
52 basic_istream& operator>>(unsigned long& n);
53 basic_istream& operator>>(long long& n);
54 basic_istream& operator>>(unsigned long long& n);
55 basic_istream& operator>>(float& f);
56 basic_istream& operator>>(double& f);
57 basic_istream& operator>>(long double& f);
58 basic_istream& operator>>(void*& p);
59
60 // 27.7.1.3 Unformatted input:
61 streamsize gcount() const;
62 int_type get();
63 basic_istream& get(char_type& c);
64 basic_istream& get(char_type* s, streamsize n);
65 basic_istream& get(char_type* s, streamsize n, char_type delim);
66 basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
67 basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
68
69 basic_istream& getline(char_type* s, streamsize n);
70 basic_istream& getline(char_type* s, streamsize n, char_type delim);
71
72 basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
73 int_type peek();
74 basic_istream& read (char_type* s, streamsize n);
75 streamsize readsome(char_type* s, streamsize n);
76
77 basic_istream& putback(char_type c);
78 basic_istream& unget();
79 int sync();
80
81 pos_type tellg();
82 basic_istream& seekg(pos_type);
83 basic_istream& seekg(off_type, ios_base::seekdir);
Marshall Clow27d29872014-09-16 15:27:01 +000084protected:
85 basic_istream(const basic_istream& rhs) = delete;
86 basic_istream(basic_istream&& rhs);
87 // 27.7.2.1.2 Assign/swap:
88 basic_istream& operator=(const basic_istream& rhs) = delete;
89 basic_istream& operator=(basic_istream&& rhs);
90 void swap(basic_istream& rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +000091};
92
93// 27.7.1.2.3 character extraction templates:
94template<class charT, class traits>
95 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
96
97template<class traits>
98 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
99
100template<class traits>
101 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
102
103template<class charT, class traits>
104 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
105
106template<class traits>
107 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
108
109template<class traits>
110 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
111
112template <class charT, class traits>
113 void
114 swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
115
116typedef basic_istream<char> istream;
117typedef basic_istream<wchar_t> wistream;
118
119template <class charT, class traits = char_traits<charT> >
120class basic_iostream :
121 public basic_istream<charT,traits>,
122 public basic_ostream<charT,traits>
123{
124public:
125 // types:
126 typedef charT char_type;
127 typedef traits traits_type;
128 typedef typename traits_type::int_type int_type;
129 typedef typename traits_type::pos_type pos_type;
130 typedef typename traits_type::off_type off_type;
131
132 // constructor/destructor
133 explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
134 basic_iostream(basic_iostream&& rhs);
135 virtual ~basic_iostream();
136
137 // assign/swap
138 basic_iostream& operator=(basic_iostream&& rhs);
139 void swap(basic_iostream& rhs);
140};
141
142template <class charT, class traits>
143 void
144 swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
145
146typedef basic_iostream<char> iostream;
147typedef basic_iostream<wchar_t> wiostream;
148
149template <class charT, class traits>
150 basic_istream<charT,traits>&
151 ws(basic_istream<charT,traits>& is);
152
153template <class charT, class traits, class T>
154 basic_istream<charT, traits>&
155 operator>>(basic_istream<charT, traits>&& is, T& x);
156
157} // std
158
159*/
160
161#include <__config>
Marshall Clow8732fed2018-12-11 04:35:44 +0000162#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000163#include <ostream>
164
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000165#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000167#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000168
Eric Fiselierf4433a32017-05-31 22:07:49 +0000169_LIBCPP_PUSH_MACROS
170#include <__undef_macros>
171
172
Howard Hinnantc51e1022010-05-11 19:42:16 +0000173_LIBCPP_BEGIN_NAMESPACE_STD
174
175template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000176class _LIBCPP_TEMPLATE_VIS basic_istream
Howard Hinnantc51e1022010-05-11 19:42:16 +0000177 : virtual public basic_ios<_CharT, _Traits>
178{
179 streamsize __gc_;
180public:
181 // types (inherited from basic_ios (27.5.4)):
182 typedef _CharT char_type;
183 typedef _Traits traits_type;
184 typedef typename traits_type::int_type int_type;
185 typedef typename traits_type::pos_type pos_type;
186 typedef typename traits_type::off_type off_type;
187
188 // 27.7.1.1.1 Constructor/destructor:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000189 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000190 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
191 { this->init(__sb); }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000192 virtual ~basic_istream();
193protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +0000194#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +0000195 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000196 basic_istream(basic_istream&& __rhs);
Eric Fiselier78ccf772017-04-18 23:38:41 +0000197
Howard Hinnantc51e1022010-05-11 19:42:16 +0000198 // 27.7.1.1.2 Assign/swap:
Eric Fiselier815ed732016-09-16 00:00:48 +0000199 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000200 basic_istream& operator=(basic_istream&& __rhs);
201#endif
Eric Fiselier815ed732016-09-16 00:00:48 +0000202
Louis Dionneb4d05d72018-10-16 19:26:23 +0000203 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000204 void swap(basic_istream& __rhs) {
205 _VSTD::swap(__gc_, __rhs.__gc_);
206 basic_ios<char_type, traits_type>::swap(__rhs);
207 }
Marshall Clow27d29872014-09-16 15:27:01 +0000208
Eric Fiselier2d8515f2017-01-06 20:58:25 +0000209#ifndef _LIBCPP_CXX03_LANG
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#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000213public:
214
215 // 27.7.1.1.3 Prefix/suffix:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000216 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000217
218 // 27.7.1.2 Formatted input:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000219 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000220 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
221 { return __pf(*this); }
222
Louis Dionneb4d05d72018-10-16 19:26:23 +0000223 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224 basic_istream& operator>>(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000225 (*__pf)(basic_ios<char_type, traits_type>&))
226 { __pf(*this); return *this; }
227
Louis Dionneb4d05d72018-10-16 19:26:23 +0000228 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000229 basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
230 { __pf(*this); return *this; }
231
Howard Hinnantc51e1022010-05-11 19:42:16 +0000232 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
233 basic_istream& operator>>(bool& __n);
234 basic_istream& operator>>(short& __n);
235 basic_istream& operator>>(unsigned short& __n);
236 basic_istream& operator>>(int& __n);
237 basic_istream& operator>>(unsigned int& __n);
238 basic_istream& operator>>(long& __n);
239 basic_istream& operator>>(unsigned long& __n);
240 basic_istream& operator>>(long long& __n);
241 basic_istream& operator>>(unsigned long long& __n);
242 basic_istream& operator>>(float& __f);
243 basic_istream& operator>>(double& __f);
244 basic_istream& operator>>(long double& __f);
245 basic_istream& operator>>(void*& __p);
246
247 // 27.7.1.3 Unformatted input:
Howard Hinnant64da2602010-09-22 15:29:08 +0000248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000249 streamsize gcount() const {return __gc_;}
250 int_type get();
Eric Fiselier815ed732016-09-16 00:00:48 +0000251
Louis Dionneb4d05d72018-10-16 19:26:23 +0000252 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000253 basic_istream& get(char_type& __c) {
254 int_type __ch = get();
255 if (__ch != traits_type::eof())
256 __c = traits_type::to_char_type(__ch);
257 return *this;
258 }
259
Louis Dionneb4d05d72018-10-16 19:26:23 +0000260 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000261 basic_istream& get(char_type* __s, streamsize __n)
262 { return get(__s, __n, this->widen('\n')); }
263
Howard Hinnantc51e1022010-05-11 19:42:16 +0000264 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
Eric Fiselier815ed732016-09-16 00:00:48 +0000265
Louis Dionneb4d05d72018-10-16 19:26:23 +0000266 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000267 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
268 { return get(__sb, this->widen('\n')); }
269
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
271
Louis Dionneb4d05d72018-10-16 19:26:23 +0000272 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000273 basic_istream& getline(char_type* __s, streamsize __n)
274 { return getline(__s, __n, this->widen('\n')); }
275
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
277
278 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
279 int_type peek();
280 basic_istream& read (char_type* __s, streamsize __n);
281 streamsize readsome(char_type* __s, streamsize __n);
282
283 basic_istream& putback(char_type __c);
284 basic_istream& unget();
285 int sync();
286
287 pos_type tellg();
288 basic_istream& seekg(pos_type __pos);
289 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
290};
291
292template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000293class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294{
295 bool __ok_;
296
297 sentry(const sentry&); // = delete;
298 sentry& operator=(const sentry&); // = delete;
299
300public:
301 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
302// ~sentry() = default;
303
Howard Hinnant64da2602010-09-22 15:29:08 +0000304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant86a291f2012-02-21 21:46:43 +0000305 _LIBCPP_EXPLICIT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306 operator bool() const {return __ok_;}
307};
308
309template <class _CharT, class _Traits>
310basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
311 bool __noskipws)
312 : __ok_(false)
313{
314 if (__is.good())
315 {
316 if (__is.tie())
317 __is.tie()->flush();
318 if (!__noskipws && (__is.flags() & ios_base::skipws))
319 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000320 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantc834c512011-11-29 18:15:50 +0000322 _Ip __i(__is);
323 _Ip __eof;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 for (; __i != __eof; ++__i)
325 if (!__ct.is(__ct.space, *__i))
326 break;
327 if (__i == __eof)
328 __is.setstate(ios_base::failbit | ios_base::eofbit);
329 }
330 __ok_ = __is.good();
331 }
332 else
333 __is.setstate(ios_base::failbit);
334}
335
Eric Fiselier78ccf772017-04-18 23:38:41 +0000336#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337
338template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
340 : __gc_(__rhs.__gc_)
341{
342 __rhs.__gc_ = 0;
343 this->move(__rhs);
344}
345
346template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000347basic_istream<_CharT, _Traits>&
348basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
349{
350 swap(__rhs);
351 return *this;
352}
353
Eric Fiselier78ccf772017-04-18 23:38:41 +0000354#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355
356template <class _CharT, class _Traits>
357basic_istream<_CharT, _Traits>::~basic_istream()
358{
359}
360
Louis Dionne8ea66082018-07-25 19:40:01 +0000361template <class _Tp, class _CharT, class _Traits>
362_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363basic_istream<_CharT, _Traits>&
Louis Dionne8ea66082018-07-25 19:40:01 +0000364__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000365 ios_base::iostate __state = ios_base::goodbit;
366 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
367 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000368 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000369#ifndef _LIBCPP_NO_EXCEPTIONS
370 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000371 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000372#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000373 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
374 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000375 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000377 }
378 catch (...)
379 {
380 __state |= ios_base::badbit;
381 __is.__setstate_nothrow(__state);
382 if (__is.exceptions() & ios_base::badbit)
383 {
384 throw;
385 }
386 }
387#endif
388 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000390 return __is;
391}
392
393template <class _CharT, class _Traits>
394basic_istream<_CharT, _Traits>&
395basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
396{
397 return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398}
399
400template <class _CharT, class _Traits>
401basic_istream<_CharT, _Traits>&
402basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
403{
Louis Dionne8ea66082018-07-25 19:40:01 +0000404 return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405}
406
407template <class _CharT, class _Traits>
408basic_istream<_CharT, _Traits>&
409basic_istream<_CharT, _Traits>::operator>>(long& __n)
410{
Louis Dionne8ea66082018-07-25 19:40:01 +0000411 return _VSTD::__input_arithmetic<long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412}
413
414template <class _CharT, class _Traits>
415basic_istream<_CharT, _Traits>&
416basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
417{
Louis Dionne8ea66082018-07-25 19:40:01 +0000418 return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419}
420
421template <class _CharT, class _Traits>
422basic_istream<_CharT, _Traits>&
423basic_istream<_CharT, _Traits>::operator>>(long long& __n)
424{
Louis Dionne8ea66082018-07-25 19:40:01 +0000425 return _VSTD::__input_arithmetic<long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426}
427
428template <class _CharT, class _Traits>
429basic_istream<_CharT, _Traits>&
430basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
431{
Louis Dionne8ea66082018-07-25 19:40:01 +0000432 return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433}
434
435template <class _CharT, class _Traits>
436basic_istream<_CharT, _Traits>&
437basic_istream<_CharT, _Traits>::operator>>(float& __n)
438{
Louis Dionne8ea66082018-07-25 19:40:01 +0000439 return _VSTD::__input_arithmetic<float>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440}
441
442template <class _CharT, class _Traits>
443basic_istream<_CharT, _Traits>&
444basic_istream<_CharT, _Traits>::operator>>(double& __n)
445{
Louis Dionne8ea66082018-07-25 19:40:01 +0000446 return _VSTD::__input_arithmetic<double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000447}
448
449template <class _CharT, class _Traits>
450basic_istream<_CharT, _Traits>&
451basic_istream<_CharT, _Traits>::operator>>(long double& __n)
452{
Louis Dionne8ea66082018-07-25 19:40:01 +0000453 return _VSTD::__input_arithmetic<long double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454}
455
456template <class _CharT, class _Traits>
457basic_istream<_CharT, _Traits>&
458basic_istream<_CharT, _Traits>::operator>>(bool& __n)
459{
Louis Dionne8ea66082018-07-25 19:40:01 +0000460 return _VSTD::__input_arithmetic<bool>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461}
462
463template <class _CharT, class _Traits>
464basic_istream<_CharT, _Traits>&
465basic_istream<_CharT, _Traits>::operator>>(void*& __n)
466{
Louis Dionne8ea66082018-07-25 19:40:01 +0000467 return _VSTD::__input_arithmetic<void*>(*this, __n);
468}
469
470template <class _Tp, class _CharT, class _Traits>
471_LIBCPP_INLINE_VISIBILITY
472basic_istream<_CharT, _Traits>&
473__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000474 ios_base::iostate __state = ios_base::goodbit;
475 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
476 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000477 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000478#ifndef _LIBCPP_NO_EXCEPTIONS
479 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000480 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000481#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000482 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
483 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne8ea66082018-07-25 19:40:01 +0000484 long __temp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000485 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
Louis Dionne8ea66082018-07-25 19:40:01 +0000486 if (__temp < numeric_limits<_Tp>::min())
487 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000488 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000489 __n = numeric_limits<_Tp>::min();
490 }
491 else if (__temp > numeric_limits<_Tp>::max())
492 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000493 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000494 __n = numeric_limits<_Tp>::max();
495 }
496 else
Louis Dionne94ee3a02019-04-05 16:33:37 +0000497 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000498 __n = static_cast<_Tp>(__temp);
Louis Dionne94ee3a02019-04-05 16:33:37 +0000499 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000501 }
502 catch (...)
503 {
504 __state |= ios_base::badbit;
505 __is.__setstate_nothrow(__state);
506 if (__is.exceptions() & ios_base::badbit)
507 {
508 throw;
509 }
510 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000511#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000512 __is.setstate(__state);
513 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000514 return __is;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515}
516
517template <class _CharT, class _Traits>
518basic_istream<_CharT, _Traits>&
519basic_istream<_CharT, _Traits>::operator>>(short& __n)
520{
Louis Dionne8ea66082018-07-25 19:40:01 +0000521 return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522}
523
524template <class _CharT, class _Traits>
525basic_istream<_CharT, _Traits>&
526basic_istream<_CharT, _Traits>::operator>>(int& __n)
527{
Louis Dionne8ea66082018-07-25 19:40:01 +0000528 return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529}
530
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531template<class _CharT, class _Traits>
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000532_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533basic_istream<_CharT, _Traits>&
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000534__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000536 ios_base::iostate __state = ios_base::goodbit;
537 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
538 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000539 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000540#ifndef _LIBCPP_NO_EXCEPTIONS
541 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000543#endif
Louis Dionne54f50752019-04-02 19:20:47 +0000544 _CharT* __s = __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000546 while (__s != __p + (__n-1))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000548 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
549 if (_Traits::eq_int_type(__i, _Traits::eof()))
550 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000551 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000552 break;
553 }
554 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555 if (__ct.is(__ct.space, __ch))
556 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000557 *__s++ = __ch;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000558 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000559 }
560 *__s = _CharT();
561 __is.width(0);
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000562 if (__s == __p)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000563 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000564#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000565 }
566 catch (...)
567 {
568 __state |= ios_base::badbit;
569 __is.__setstate_nothrow(__state);
570 if (__is.exceptions() & ios_base::badbit)
571 {
572 throw;
573 }
574 }
575#endif
576 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578 return __is;
579}
580
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000581#if _LIBCPP_STD_VER > 17
582
583template<class _CharT, class _Traits, size_t _Np>
584inline _LIBCPP_INLINE_VISIBILITY
585basic_istream<_CharT, _Traits>&
586operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
587{
Louis Dionne54f50752019-04-02 19:20:47 +0000588 size_t __n = _Np;
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000589 if (__is.width() > 0)
590 __n = _VSTD::min(size_t(__is.width()), _Np);
591 return _VSTD::__input_c_string(__is, __buf, __n);
592}
593
594template<class _Traits, size_t _Np>
595inline _LIBCPP_INLINE_VISIBILITY
596basic_istream<char, _Traits>&
597operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
598{
599 return __is >> (char(&)[_Np])__buf;
600}
601
602template<class _Traits, size_t _Np>
603inline _LIBCPP_INLINE_VISIBILITY
604basic_istream<char, _Traits>&
605operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
606{
607 return __is >> (char(&)[_Np])__buf;
608}
609
610#else
611
612template<class _CharT, class _Traits>
613inline _LIBCPP_INLINE_VISIBILITY
614basic_istream<_CharT, _Traits>&
615operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
616{
617 streamsize __n = __is.width();
618 if (__n <= 0)
619 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
620 return _VSTD::__input_c_string(__is, __s, size_t(__n));
621}
622
Howard Hinnantc51e1022010-05-11 19:42:16 +0000623template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000624inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000625basic_istream<char, _Traits>&
626operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
627{
628 return __is >> (char*)__s;
629}
630
631template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000632inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000633basic_istream<char, _Traits>&
634operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
635{
636 return __is >> (char*)__s;
637}
638
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000639#endif // _LIBCPP_STD_VER > 17
640
Howard Hinnantc51e1022010-05-11 19:42:16 +0000641template<class _CharT, class _Traits>
642basic_istream<_CharT, _Traits>&
643operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
644{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000645 ios_base::iostate __state = ios_base::goodbit;
646 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
647 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000648 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000649#ifndef _LIBCPP_NO_EXCEPTIONS
650 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000651 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000652#endif
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000653 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
654 if (_Traits::eq_int_type(__i, _Traits::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000655 __state |= ios_base::eofbit | ios_base::failbit;
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000656 else
657 __c = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000658#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000659 }
660 catch (...)
661 {
662 __state |= ios_base::badbit;
663 __is.__setstate_nothrow(__state);
664 if (__is.exceptions() & ios_base::badbit)
665 {
666 throw;
667 }
668 }
669#endif
670 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000671 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000672 return __is;
673}
674
675template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000676inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000677basic_istream<char, _Traits>&
678operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
679{
680 return __is >> (char&)__c;
681}
682
683template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000684inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000685basic_istream<char, _Traits>&
686operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
687{
688 return __is >> (char&)__c;
689}
690
691template<class _CharT, class _Traits>
692basic_istream<_CharT, _Traits>&
693basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
694{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000695 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000696 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000697 sentry __s(*this, true);
698 if (__s)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000699 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000700 if (__sb)
Louis Dionne4d23a302019-04-02 21:43:07 +0000701 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000702#ifndef _LIBCPP_NO_EXCEPTIONS
703 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000704 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000705#endif // _LIBCPP_NO_EXCEPTIONS
706 while (true)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000707 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000708 typename traits_type::int_type __i = this->rdbuf()->sgetc();
709 if (traits_type::eq_int_type(__i, _Traits::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000710 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000711 __state |= ios_base::eofbit;
712 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000713 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000714 if (traits_type::eq_int_type(
715 __sb->sputc(traits_type::to_char_type(__i)),
716 traits_type::eof()))
717 break;
718 ++__gc_;
719 this->rdbuf()->sbumpc();
720 }
721 if (__gc_ == 0)
722 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000723#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000724 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000725 catch (...)
726 {
727 __state |= ios_base::badbit;
728 if (__gc_ == 0)
729 __state |= ios_base::failbit;
730
731 this->__setstate_nothrow(__state);
732 if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit)
733 {
734 throw;
735 }
736 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000737#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000738 }
739 else
740 {
741 __state |= ios_base::failbit;
742 }
743 this->setstate(__state);
744 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000745 return *this;
746}
747
748template<class _CharT, class _Traits>
749typename basic_istream<_CharT, _Traits>::int_type
750basic_istream<_CharT, _Traits>::get()
751{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000752 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000753 __gc_ = 0;
754 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000755 sentry __s(*this, true);
756 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000757 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000758#ifndef _LIBCPP_NO_EXCEPTIONS
759 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000761#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000762 __r = this->rdbuf()->sbumpc();
763 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000764 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000765 else
Howard Hinnante51e4e92011-09-01 21:02:45 +0000766 __gc_ = 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000768 }
769 catch (...)
770 {
771 this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
772 if (this->exceptions() & ios_base::badbit)
773 {
774 throw;
775 }
776 }
777#endif
778 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000779 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000780 return __r;
781}
782
783template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000784basic_istream<_CharT, _Traits>&
785basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
786{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000787 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000788 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000789 sentry __sen(*this, true);
790 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000791 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000792 if (__n > 0)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000793 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000794#ifndef _LIBCPP_NO_EXCEPTIONS
795 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000796 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000797#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000798 while (__gc_ < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000799 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000800 int_type __i = this->rdbuf()->sgetc();
801 if (traits_type::eq_int_type(__i, traits_type::eof()))
802 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000803 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000804 break;
805 }
806 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807 if (traits_type::eq(__ch, __dlm))
808 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000809 *__s++ = __ch;
810 ++__gc_;
811 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000812 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000813 if (__gc_ == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000814 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000815#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000816 }
817 catch (...)
818 {
819 __state |= ios_base::badbit;
820 this->__setstate_nothrow(__state);
821 if (this->exceptions() & ios_base::badbit)
822 {
823 if (__n > 0)
824 *__s = char_type();
825 throw;
826 }
827 }
828#endif
829 }
830 else
831 {
832 __state |= ios_base::failbit;
833 }
834
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000835 if (__n > 0)
836 *__s = char_type();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000837 this->setstate(__state);
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000838 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000839 if (__n > 0)
840 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000841 return *this;
842}
843
844template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000845basic_istream<_CharT, _Traits>&
846basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
847 char_type __dlm)
848{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000849 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000850 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000851 sentry __sen(*this, true);
852 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000853 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000854#ifndef _LIBCPP_NO_EXCEPTIONS
855 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000856 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000857#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000858 while (true)
859 {
860 typename traits_type::int_type __i = this->rdbuf()->sgetc();
861 if (traits_type::eq_int_type(__i, traits_type::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000862 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000863 __state |= ios_base::eofbit;
864 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000865 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000866 char_type __ch = traits_type::to_char_type(__i);
867 if (traits_type::eq(__ch, __dlm))
868 break;
869 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
870 break;
871 ++__gc_;
872 this->rdbuf()->sbumpc();
873 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000874#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000875 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000876 catch (...)
877 {
878 __state |= ios_base::badbit;
879 // according to the spec, exceptions here are caught but not rethrown
880 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000881#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000882 if (__gc_ == 0)
883 __state |= ios_base::failbit;
884 this->setstate(__state);
885 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 return *this;
887}
888
889template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000890basic_istream<_CharT, _Traits>&
891basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
892{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000893 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000895 sentry __sen(*this, true);
896 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000897 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000898#ifndef _LIBCPP_NO_EXCEPTIONS
899 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000900 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000901#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000902 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000903 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000904 typename traits_type::int_type __i = this->rdbuf()->sgetc();
905 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000906 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000907 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000908 break;
909 }
910 char_type __ch = traits_type::to_char_type(__i);
911 if (traits_type::eq(__ch, __dlm))
912 {
913 this->rdbuf()->sbumpc();
914 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915 break;
916 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000917 if (__gc_ >= __n-1)
918 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000919 __state |= ios_base::failbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000920 break;
921 }
922 *__s++ = __ch;
923 this->rdbuf()->sbumpc();
924 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000925 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000926#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000927 }
928 catch (...)
929 {
930 __state |= ios_base::badbit;
931 this->__setstate_nothrow(__state);
932 if (this->exceptions() & ios_base::badbit)
933 {
934 if (__n > 0)
935 *__s = char_type();
936 if (__gc_ == 0)
937 __state |= ios_base::failbit;
938 throw;
939 }
940 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000941#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000942 }
943 if (__n > 0)
944 *__s = char_type();
945 if (__gc_ == 0)
946 __state |= ios_base::failbit;
947 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000948 return *this;
949}
950
951template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000952basic_istream<_CharT, _Traits>&
953basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
954{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000955 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000956 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000957 sentry __sen(*this, true);
958 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000959 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000960#ifndef _LIBCPP_NO_EXCEPTIONS
961 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000962 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000963#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000964 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantc51e1022010-05-11 19:42:16 +0000965 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000966 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000967 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000968 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
969 if (traits_type::eq_int_type(__i, traits_type::eof()))
970 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000971 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000972 break;
973 }
974 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000975 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000976 break;
977 }
978 }
979 else
980 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000981 while (__gc_ < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000982 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000983 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
984 if (traits_type::eq_int_type(__i, traits_type::eof()))
985 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000986 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000987 break;
988 }
989 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000990 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000991 break;
992 }
993 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000994#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000995 }
996 catch (...)
997 {
998 __state |= ios_base::badbit;
999 this->__setstate_nothrow(__state);
1000 if (this->exceptions() & ios_base::badbit)
1001 {
1002 throw;
1003 }
1004 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001005#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001006 this->setstate(__state);
1007 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001008 return *this;
1009}
1010
1011template<class _CharT, class _Traits>
1012typename basic_istream<_CharT, _Traits>::int_type
1013basic_istream<_CharT, _Traits>::peek()
1014{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001015 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001016 __gc_ = 0;
1017 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +00001018 sentry __sen(*this, true);
1019 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001020 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001021#ifndef _LIBCPP_NO_EXCEPTIONS
1022 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001023 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001024#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001025 __r = this->rdbuf()->sgetc();
Howard Hinnanta4427372012-11-01 17:32:07 +00001026 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +00001027 __state |= ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001028#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001029 }
1030 catch (...)
1031 {
1032 __state |= ios_base::badbit;
1033 this->__setstate_nothrow(__state);
1034 if (this->exceptions() & ios_base::badbit)
1035 {
1036 throw;
1037 }
1038 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001039#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001040 this->setstate(__state);
1041 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042 return __r;
1043}
1044
1045template<class _CharT, class _Traits>
1046basic_istream<_CharT, _Traits>&
1047basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1048{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001049 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001051 sentry __sen(*this, true);
1052 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001053 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001054#ifndef _LIBCPP_NO_EXCEPTIONS
1055 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001056 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001057#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant232466c2013-03-06 19:27:56 +00001058 __gc_ = this->rdbuf()->sgetn(__s, __n);
1059 if (__gc_ != __n)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001060 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001061#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001062 }
1063 catch (...)
1064 {
1065 __state |= ios_base::badbit;
1066 this->__setstate_nothrow(__state);
1067 if (this->exceptions() & ios_base::badbit)
1068 {
1069 throw;
1070 }
1071 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001072#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001073 }
1074 else
1075 {
1076 __state |= ios_base::failbit;
1077 }
1078 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079 return *this;
1080}
1081
1082template<class _CharT, class _Traits>
1083streamsize
1084basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1085{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001086 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantaf8555c2012-12-20 15:40:28 +00001087 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001088 sentry __sen(*this, true);
1089 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001090 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001091#ifndef _LIBCPP_NO_EXCEPTIONS
1092 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001093 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001094#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clow1c6e3862016-07-13 16:58:48 +00001095 streamsize __c = this->rdbuf()->in_avail();
1096 switch (__c)
1097 {
1098 case -1:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001099 __state |= ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001100 break;
1101 case 0:
1102 break;
1103 default:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001104 __n = _VSTD::min(__c, __n);
1105 __gc_ = this->rdbuf()->sgetn(__s, __n);
1106 if (__gc_ != __n)
1107 __state |= ios_base::failbit | ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001108 break;
1109 }
Marshall Clow1c6e3862016-07-13 16:58:48 +00001110#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001111 }
1112 catch (...)
1113 {
1114 __state |= ios_base::badbit;
1115 this->__setstate_nothrow(__state);
1116 if (this->exceptions() & ios_base::badbit)
1117 {
1118 throw;
1119 }
1120 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001121#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001122 }
1123 else
1124 {
1125 __state |= ios_base::failbit;
1126 }
1127 this->setstate(__state);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001128 return __gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001129}
1130
1131template<class _CharT, class _Traits>
1132basic_istream<_CharT, _Traits>&
1133basic_istream<_CharT, _Traits>::putback(char_type __c)
1134{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001135 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001136 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001137 this->clear(__state);
1138 sentry __sen(*this, true);
1139 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001140 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001141#ifndef _LIBCPP_NO_EXCEPTIONS
1142 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001143 {
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001144#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001145 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1146 __state |= ios_base::badbit;
1147#ifndef _LIBCPP_NO_EXCEPTIONS
1148 }
1149 catch (...)
1150 {
1151 __state |= ios_base::badbit;
1152 this->__setstate_nothrow(__state);
1153 if (this->exceptions() & ios_base::badbit)
1154 {
1155 throw;
1156 }
1157 }
1158#endif // _LIBCPP_NO_EXCEPTIONS
1159 }
1160 else
1161 {
1162 __state |= ios_base::failbit;
1163 }
1164 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 return *this;
1166}
1167
1168template<class _CharT, class _Traits>
1169basic_istream<_CharT, _Traits>&
1170basic_istream<_CharT, _Traits>::unget()
1171{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001172 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001173 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001174 this->clear(__state);
1175 sentry __sen(*this, true);
1176 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001177 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001178#ifndef _LIBCPP_NO_EXCEPTIONS
1179 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001180 {
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001181#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001182 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1183 __state |= ios_base::badbit;
1184#ifndef _LIBCPP_NO_EXCEPTIONS
1185 }
1186 catch (...)
1187 {
1188 __state |= ios_base::badbit;
1189 this->__setstate_nothrow(__state);
1190 if (this->exceptions() & ios_base::badbit)
1191 {
1192 throw;
1193 }
1194 }
1195#endif // _LIBCPP_NO_EXCEPTIONS
1196 }
1197 else
1198 {
1199 __state |= ios_base::failbit;
1200 }
1201 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001202 return *this;
1203}
1204
1205template<class _CharT, class _Traits>
1206int
1207basic_istream<_CharT, _Traits>::sync()
1208{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001209 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001210 int __r = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001211 sentry __sen(*this, true);
1212 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001213 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001214#ifndef _LIBCPP_NO_EXCEPTIONS
1215 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001216 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001217#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001218 if (this->rdbuf() == 0)
1219 return -1;
1220 if (this->rdbuf()->pubsync() == -1)
1221 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001222 __state |= ios_base::badbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223 return -1;
1224 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001225#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001226 }
1227 catch (...)
1228 {
1229 __state |= ios_base::badbit;
1230 this->__setstate_nothrow(__state);
1231 if (this->exceptions() & ios_base::badbit)
1232 {
1233 throw;
1234 }
1235 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001236#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001237 this->setstate(__state);
1238 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001239 return __r;
1240}
1241
1242template<class _CharT, class _Traits>
1243typename basic_istream<_CharT, _Traits>::pos_type
1244basic_istream<_CharT, _Traits>::tellg()
1245{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001246 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001247 pos_type __r(-1);
Louis Dionne94ee3a02019-04-05 16:33:37 +00001248 sentry __sen(*this, true);
1249 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001250 {
Louis Dionne4d23a302019-04-02 21:43:07 +00001251#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001252 try
1253 {
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001254#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001255 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1256#ifndef _LIBCPP_NO_EXCEPTIONS
1257 }
1258 catch (...)
1259 {
1260 __state |= ios_base::badbit;
1261 this->__setstate_nothrow(__state);
1262 if (this->exceptions() & ios_base::badbit)
1263 {
1264 throw;
1265 }
1266 }
1267#endif // _LIBCPP_NO_EXCEPTIONS
1268 this->setstate(__state);
1269 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001270 return __r;
1271}
1272
1273template<class _CharT, class _Traits>
1274basic_istream<_CharT, _Traits>&
1275basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1276{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001277 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1278 this->clear(__state);
1279 sentry __sen(*this, true);
1280 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001281 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001282#ifndef _LIBCPP_NO_EXCEPTIONS
1283 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001284 {
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001285#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001286 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1287 __state |= ios_base::failbit;
1288#ifndef _LIBCPP_NO_EXCEPTIONS
1289 }
1290 catch (...)
1291 {
1292 __state |= ios_base::badbit;
1293 this->__setstate_nothrow(__state);
1294 if (this->exceptions() & ios_base::badbit)
1295 {
1296 throw;
1297 }
1298 }
1299#endif // _LIBCPP_NO_EXCEPTIONS
1300 this->setstate(__state);
1301 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001302 return *this;
1303}
1304
1305template<class _CharT, class _Traits>
1306basic_istream<_CharT, _Traits>&
1307basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1308{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001309 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1310 this->clear(__state);
1311 sentry __sen(*this, true);
1312 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001313 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001314#ifndef _LIBCPP_NO_EXCEPTIONS
1315 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001316 {
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001317#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001318 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1319 __state |= ios_base::failbit;
1320#ifndef _LIBCPP_NO_EXCEPTIONS
1321 }
1322 catch (...)
1323 {
1324 __state |= ios_base::badbit;
1325 this->__setstate_nothrow(__state);
1326 if (this->exceptions() & ios_base::badbit)
1327 {
1328 throw;
1329 }
1330 }
1331#endif // _LIBCPP_NO_EXCEPTIONS
1332 this->setstate(__state);
1333 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334 return *this;
1335}
1336
1337template <class _CharT, class _Traits>
1338basic_istream<_CharT, _Traits>&
1339ws(basic_istream<_CharT, _Traits>& __is)
1340{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001341 ios_base::iostate __state = ios_base::goodbit;
1342 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1343 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001344 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001345#ifndef _LIBCPP_NO_EXCEPTIONS
1346 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001347 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001348#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001349 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001350 while (true)
1351 {
1352 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1353 if (_Traits::eq_int_type(__i, _Traits::eof()))
1354 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001355 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001356 break;
1357 }
1358 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001359 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001360 __is.rdbuf()->sbumpc();
1361 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001362#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001363 }
1364 catch (...)
1365 {
1366 __state |= ios_base::badbit;
1367 __is.__setstate_nothrow(__state);
1368 if (__is.exceptions() & ios_base::badbit)
1369 {
1370 throw;
1371 }
1372 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001373#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001374 __is.setstate(__state);
1375 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001376 return __is;
1377}
1378
Eric Fiselier78ccf772017-04-18 23:38:41 +00001379#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001380
1381template <class _CharT, class _Traits, class _Tp>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001382inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001383basic_istream<_CharT, _Traits>&
Eric Fiselier7955ef62016-07-24 04:07:22 +00001384operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001385{
Eric Fiselier7955ef62016-07-24 04:07:22 +00001386 __is >> _VSTD::forward<_Tp>(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001387 return __is;
1388}
1389
Eric Fiselier78ccf772017-04-18 23:38:41 +00001390#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001391
1392template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001393class _LIBCPP_TEMPLATE_VIS basic_iostream
Howard Hinnantc51e1022010-05-11 19:42:16 +00001394 : public basic_istream<_CharT, _Traits>,
1395 public basic_ostream<_CharT, _Traits>
1396{
1397public:
1398 // types:
1399 typedef _CharT char_type;
1400 typedef _Traits traits_type;
1401 typedef typename traits_type::int_type int_type;
1402 typedef typename traits_type::pos_type pos_type;
1403 typedef typename traits_type::off_type off_type;
1404
1405 // constructor/destructor
Louis Dionneb4d05d72018-10-16 19:26:23 +00001406 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001407 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1408 : basic_istream<_CharT, _Traits>(__sb)
1409 {}
1410
Howard Hinnantc51e1022010-05-11 19:42:16 +00001411 virtual ~basic_iostream();
1412protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +00001413#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +00001414 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001415 basic_iostream(basic_iostream&& __rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001416
1417 // assign/swap
Eric Fiselier815ed732016-09-16 00:00:48 +00001418 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001419 basic_iostream& operator=(basic_iostream&& __rhs);
1420#endif
Louis Dionneb4d05d72018-10-16 19:26:23 +00001421 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001422 void swap(basic_iostream& __rhs)
1423 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001424};
1425
Eric Fiselier78ccf772017-04-18 23:38:41 +00001426#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001427
1428template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001429basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001430 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001431{
1432}
1433
1434template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001435basic_iostream<_CharT, _Traits>&
1436basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1437{
1438 swap(__rhs);
1439 return *this;
1440}
1441
Eric Fiselier78ccf772017-04-18 23:38:41 +00001442#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001443
1444template <class _CharT, class _Traits>
1445basic_iostream<_CharT, _Traits>::~basic_iostream()
1446{
1447}
1448
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449template<class _CharT, class _Traits, class _Allocator>
1450basic_istream<_CharT, _Traits>&
1451operator>>(basic_istream<_CharT, _Traits>& __is,
1452 basic_string<_CharT, _Traits, _Allocator>& __str)
1453{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001454 ios_base::iostate __state = ios_base::goodbit;
1455 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1456 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001457 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001458#ifndef _LIBCPP_NO_EXCEPTIONS
1459 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001460 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001461#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001462 __str.clear();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001463 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001464 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001465 __n = __str.max_size();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001466 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001467 __n = numeric_limits<streamsize>::max();
1468 streamsize __c = 0;
1469 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001470 while (__c < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001471 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001472 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1473 if (_Traits::eq_int_type(__i, _Traits::eof()))
1474 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001475 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001476 break;
1477 }
1478 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001479 if (__ct.is(__ct.space, __ch))
1480 break;
1481 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001482 ++__c;
1483 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001484 }
1485 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001486 if (__c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001487 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001489 }
1490 catch (...)
1491 {
1492 __state |= ios_base::badbit;
1493 __is.__setstate_nothrow(__state);
1494 if (__is.exceptions() & ios_base::badbit)
1495 {
1496 throw;
1497 }
1498 }
1499#endif
1500 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001501 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001502 return __is;
1503}
1504
1505template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001506basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001507getline(basic_istream<_CharT, _Traits>& __is,
1508 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1509{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001510 ios_base::iostate __state = ios_base::goodbit;
1511 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1512 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001513 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001514#ifndef _LIBCPP_NO_EXCEPTIONS
1515 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001516 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001517#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001518 __str.clear();
Howard Hinnante992f762011-10-09 15:20:46 +00001519 streamsize __extr = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001520 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001521 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001522 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1523 if (_Traits::eq_int_type(__i, _Traits::eof()))
1524 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001525 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001526 break;
1527 }
Howard Hinnante992f762011-10-09 15:20:46 +00001528 ++__extr;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001529 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001530 if (_Traits::eq(__ch, __dlm))
1531 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001532 __str.push_back(__ch);
1533 if (__str.size() == __str.max_size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001535 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001536 break;
1537 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001538 }
Howard Hinnante992f762011-10-09 15:20:46 +00001539 if (__extr == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001540 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001541#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001542 }
1543 catch (...)
1544 {
1545 __state |= ios_base::badbit;
1546 __is.__setstate_nothrow(__state);
1547 if (__is.exceptions() & ios_base::badbit)
1548 {
1549 throw;
1550 }
1551 }
1552#endif
1553 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001555 return __is;
1556}
1557
1558template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001559inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001560basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561getline(basic_istream<_CharT, _Traits>& __is,
1562 basic_string<_CharT, _Traits, _Allocator>& __str)
1563{
1564 return getline(__is, __str, __is.widen('\n'));
1565}
1566
Eric Fiselier78ccf772017-04-18 23:38:41 +00001567#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001568
1569template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001570inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001571basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001572getline(basic_istream<_CharT, _Traits>&& __is,
1573 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1574{
1575 return getline(__is, __str, __dlm);
1576}
1577
1578template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001579inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001580basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001581getline(basic_istream<_CharT, _Traits>&& __is,
1582 basic_string<_CharT, _Traits, _Allocator>& __str)
1583{
1584 return getline(__is, __str, __is.widen('\n'));
1585}
1586
Eric Fiselier78ccf772017-04-18 23:38:41 +00001587#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001588
1589template <class _CharT, class _Traits, size_t _Size>
1590basic_istream<_CharT, _Traits>&
1591operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1592{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001593 ios_base::iostate __state = ios_base::goodbit;
1594 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1595 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001596 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001597#ifndef _LIBCPP_NO_EXCEPTIONS
1598 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001599 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001600#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001601 basic_string<_CharT, _Traits> __str;
1602 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier37c22152016-12-24 00:24:44 +00001603 size_t __c = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001604 _CharT __zero = __ct.widen('0');
1605 _CharT __one = __ct.widen('1');
Howard Hinnante51e4e92011-09-01 21:02:45 +00001606 while (__c < _Size)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001607 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001608 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1609 if (_Traits::eq_int_type(__i, _Traits::eof()))
1610 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001611 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001612 break;
1613 }
1614 _CharT __ch = _Traits::to_char_type(__i);
1615 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001616 break;
1617 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001618 ++__c;
1619 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001620 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001621 __x = bitset<_Size>(__str);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001622 if (__c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001623 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001624#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001625 }
1626 catch (...)
1627 {
1628 __state |= ios_base::badbit;
1629 __is.__setstate_nothrow(__state);
1630 if (__is.exceptions() & ios_base::badbit)
1631 {
1632 throw;
1633 }
1634 }
1635#endif
1636 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001637 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001638 return __is;
1639}
1640
Louis Dionne207a9102018-12-06 00:24:58 +00001641#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001642_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1643_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1644_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Mehdi Amini228053d2017-05-04 17:08:54 +00001645#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646
1647_LIBCPP_END_NAMESPACE_STD
1648
Eric Fiselierf4433a32017-05-31 22:07:49 +00001649_LIBCPP_POP_MACROS
1650
Howard Hinnantc51e1022010-05-11 19:42:16 +00001651#endif // _LIBCPP_ISTREAM