blob: 8735a79c21a2483639a0bf388f4ecd0652d9a7a5 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
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
Louis Dionned9f73b12020-09-23 08:49:00 -0400153// rvalue stream extraction
154template <class Stream, class T>
155 Stream&& operator>>(Stream&& is, T&& x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000156
157} // std
158
159*/
160
161#include <__config>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000162#include <__utility/forward.h>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000163#include <ostream>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400164#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000165
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000166#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500167# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000168#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000169
Eric Fiselierf4433a32017-05-31 22:07:49 +0000170_LIBCPP_PUSH_MACROS
171#include <__undef_macros>
172
173
Howard Hinnantc51e1022010-05-11 19:42:16 +0000174_LIBCPP_BEGIN_NAMESPACE_STD
175
176template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000177class _LIBCPP_TEMPLATE_VIS basic_istream
Howard Hinnantc51e1022010-05-11 19:42:16 +0000178 : virtual public basic_ios<_CharT, _Traits>
179{
180 streamsize __gc_;
181public:
182 // types (inherited from basic_ios (27.5.4)):
183 typedef _CharT char_type;
184 typedef _Traits traits_type;
185 typedef typename traits_type::int_type int_type;
186 typedef typename traits_type::pos_type pos_type;
187 typedef typename traits_type::off_type off_type;
188
189 // 27.7.1.1.1 Constructor/destructor:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000190 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000191 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
192 { this->init(__sb); }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000193 virtual ~basic_istream();
194protected:
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);
Eric Fiselier815ed732016-09-16 00:00:48 +0000201
Louis Dionneb4d05d72018-10-16 19:26:23 +0000202 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000203 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 Clow242d9c12014-09-16 15:33:53 +0000208 basic_istream (const basic_istream& __rhs) = delete;
209 basic_istream& operator=(const basic_istream& __rhs) = delete;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000210public:
211
212 // 27.7.1.1.3 Prefix/suffix:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000213 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000214
215 // 27.7.1.2 Formatted input:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000216 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000217 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
218 { return __pf(*this); }
219
Louis Dionneb4d05d72018-10-16 19:26:23 +0000220 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000221 basic_istream& operator>>(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000222 (*__pf)(basic_ios<char_type, traits_type>&))
223 { __pf(*this); return *this; }
224
Louis Dionneb4d05d72018-10-16 19:26:23 +0000225 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000226 basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
227 { __pf(*this); return *this; }
228
Howard Hinnantc51e1022010-05-11 19:42:16 +0000229 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
230 basic_istream& operator>>(bool& __n);
231 basic_istream& operator>>(short& __n);
232 basic_istream& operator>>(unsigned short& __n);
233 basic_istream& operator>>(int& __n);
234 basic_istream& operator>>(unsigned int& __n);
235 basic_istream& operator>>(long& __n);
236 basic_istream& operator>>(unsigned long& __n);
237 basic_istream& operator>>(long long& __n);
238 basic_istream& operator>>(unsigned long long& __n);
239 basic_istream& operator>>(float& __f);
240 basic_istream& operator>>(double& __f);
241 basic_istream& operator>>(long double& __f);
242 basic_istream& operator>>(void*& __p);
243
244 // 27.7.1.3 Unformatted input:
Howard Hinnant64da2602010-09-22 15:29:08 +0000245 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000246 streamsize gcount() const {return __gc_;}
247 int_type get();
Eric Fiselier815ed732016-09-16 00:00:48 +0000248
Louis Dionneb4d05d72018-10-16 19:26:23 +0000249 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000250 basic_istream& get(char_type& __c) {
251 int_type __ch = get();
252 if (__ch != traits_type::eof())
253 __c = traits_type::to_char_type(__ch);
254 return *this;
255 }
256
Louis Dionneb4d05d72018-10-16 19:26:23 +0000257 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000258 basic_istream& get(char_type* __s, streamsize __n)
259 { return get(__s, __n, this->widen('\n')); }
260
Howard Hinnantc51e1022010-05-11 19:42:16 +0000261 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
Eric Fiselier815ed732016-09-16 00:00:48 +0000262
Louis Dionneb4d05d72018-10-16 19:26:23 +0000263 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000264 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
265 { return get(__sb, this->widen('\n')); }
266
Howard Hinnantc51e1022010-05-11 19:42:16 +0000267 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
268
Louis Dionneb4d05d72018-10-16 19:26:23 +0000269 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000270 basic_istream& getline(char_type* __s, streamsize __n)
271 { return getline(__s, __n, this->widen('\n')); }
272
Howard Hinnantc51e1022010-05-11 19:42:16 +0000273 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
274
275 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
276 int_type peek();
277 basic_istream& read (char_type* __s, streamsize __n);
278 streamsize readsome(char_type* __s, streamsize __n);
279
280 basic_istream& putback(char_type __c);
281 basic_istream& unget();
282 int sync();
283
284 pos_type tellg();
285 basic_istream& seekg(pos_type __pos);
286 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
287};
288
289template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000290class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000291{
292 bool __ok_;
293
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294public:
295 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
296// ~sentry() = default;
297
Howard Hinnant64da2602010-09-22 15:29:08 +0000298 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer6c9c9a72021-06-15 12:57:54 -0400299 explicit operator bool() const {return __ok_;}
Nikolas Klauser07088642021-12-08 10:57:12 +0100300
301 sentry(const sentry&) = delete;
302 sentry& operator=(const sentry&) = delete;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303};
304
305template <class _CharT, class _Traits>
306basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
307 bool __noskipws)
308 : __ok_(false)
309{
310 if (__is.good())
311 {
312 if (__is.tie())
313 __is.tie()->flush();
314 if (!__noskipws && (__is.flags() & ios_base::skipws))
315 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000316 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000317 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantc834c512011-11-29 18:15:50 +0000318 _Ip __i(__is);
319 _Ip __eof;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320 for (; __i != __eof; ++__i)
321 if (!__ct.is(__ct.space, *__i))
322 break;
323 if (__i == __eof)
324 __is.setstate(ios_base::failbit | ios_base::eofbit);
325 }
326 __ok_ = __is.good();
327 }
328 else
329 __is.setstate(ios_base::failbit);
330}
331
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000333basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
334 : __gc_(__rhs.__gc_)
335{
336 __rhs.__gc_ = 0;
337 this->move(__rhs);
338}
339
340template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341basic_istream<_CharT, _Traits>&
342basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
343{
344 swap(__rhs);
345 return *this;
346}
347
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348template <class _CharT, class _Traits>
349basic_istream<_CharT, _Traits>::~basic_istream()
350{
351}
352
Louis Dionne8ea66082018-07-25 19:40:01 +0000353template <class _Tp, class _CharT, class _Traits>
354_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355basic_istream<_CharT, _Traits>&
Louis Dionne8ea66082018-07-25 19:40:01 +0000356__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000357 ios_base::iostate __state = ios_base::goodbit;
358 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
359 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000360 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000361#ifndef _LIBCPP_NO_EXCEPTIONS
362 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000363 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400364#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000365 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
366 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000367 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000369 }
370 catch (...)
371 {
372 __state |= ios_base::badbit;
373 __is.__setstate_nothrow(__state);
374 if (__is.exceptions() & ios_base::badbit)
375 {
376 throw;
377 }
378 }
379#endif
380 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000381 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000382 return __is;
383}
384
385template <class _CharT, class _Traits>
386basic_istream<_CharT, _Traits>&
387basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
388{
389 return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390}
391
392template <class _CharT, class _Traits>
393basic_istream<_CharT, _Traits>&
394basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
395{
Louis Dionne8ea66082018-07-25 19:40:01 +0000396 return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000397}
398
399template <class _CharT, class _Traits>
400basic_istream<_CharT, _Traits>&
401basic_istream<_CharT, _Traits>::operator>>(long& __n)
402{
Louis Dionne8ea66082018-07-25 19:40:01 +0000403 return _VSTD::__input_arithmetic<long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404}
405
406template <class _CharT, class _Traits>
407basic_istream<_CharT, _Traits>&
408basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
409{
Louis Dionne8ea66082018-07-25 19:40:01 +0000410 return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411}
412
413template <class _CharT, class _Traits>
414basic_istream<_CharT, _Traits>&
415basic_istream<_CharT, _Traits>::operator>>(long long& __n)
416{
Louis Dionne8ea66082018-07-25 19:40:01 +0000417 return _VSTD::__input_arithmetic<long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000418}
419
420template <class _CharT, class _Traits>
421basic_istream<_CharT, _Traits>&
422basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
423{
Louis Dionne8ea66082018-07-25 19:40:01 +0000424 return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000425}
426
427template <class _CharT, class _Traits>
428basic_istream<_CharT, _Traits>&
429basic_istream<_CharT, _Traits>::operator>>(float& __n)
430{
Louis Dionne8ea66082018-07-25 19:40:01 +0000431 return _VSTD::__input_arithmetic<float>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432}
433
434template <class _CharT, class _Traits>
435basic_istream<_CharT, _Traits>&
436basic_istream<_CharT, _Traits>::operator>>(double& __n)
437{
Louis Dionne8ea66082018-07-25 19:40:01 +0000438 return _VSTD::__input_arithmetic<double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000439}
440
441template <class _CharT, class _Traits>
442basic_istream<_CharT, _Traits>&
443basic_istream<_CharT, _Traits>::operator>>(long double& __n)
444{
Louis Dionne8ea66082018-07-25 19:40:01 +0000445 return _VSTD::__input_arithmetic<long double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446}
447
448template <class _CharT, class _Traits>
449basic_istream<_CharT, _Traits>&
450basic_istream<_CharT, _Traits>::operator>>(bool& __n)
451{
Louis Dionne8ea66082018-07-25 19:40:01 +0000452 return _VSTD::__input_arithmetic<bool>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000453}
454
455template <class _CharT, class _Traits>
456basic_istream<_CharT, _Traits>&
457basic_istream<_CharT, _Traits>::operator>>(void*& __n)
458{
Louis Dionne8ea66082018-07-25 19:40:01 +0000459 return _VSTD::__input_arithmetic<void*>(*this, __n);
460}
461
462template <class _Tp, class _CharT, class _Traits>
463_LIBCPP_INLINE_VISIBILITY
464basic_istream<_CharT, _Traits>&
465__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000466 ios_base::iostate __state = ios_base::goodbit;
467 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
468 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000469 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000470#ifndef _LIBCPP_NO_EXCEPTIONS
471 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000472 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400473#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000474 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
475 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne8ea66082018-07-25 19:40:01 +0000476 long __temp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000477 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
Louis Dionne8ea66082018-07-25 19:40:01 +0000478 if (__temp < numeric_limits<_Tp>::min())
479 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000480 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000481 __n = numeric_limits<_Tp>::min();
482 }
483 else if (__temp > numeric_limits<_Tp>::max())
484 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000485 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000486 __n = numeric_limits<_Tp>::max();
487 }
488 else
Louis Dionne94ee3a02019-04-05 16:33:37 +0000489 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000490 __n = static_cast<_Tp>(__temp);
Louis Dionne94ee3a02019-04-05 16:33:37 +0000491 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000493 }
494 catch (...)
495 {
496 __state |= ios_base::badbit;
497 __is.__setstate_nothrow(__state);
498 if (__is.exceptions() & ios_base::badbit)
499 {
500 throw;
501 }
502 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400503#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000504 __is.setstate(__state);
505 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000506 return __is;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000507}
508
509template <class _CharT, class _Traits>
510basic_istream<_CharT, _Traits>&
511basic_istream<_CharT, _Traits>::operator>>(short& __n)
512{
Louis Dionne8ea66082018-07-25 19:40:01 +0000513 return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514}
515
516template <class _CharT, class _Traits>
517basic_istream<_CharT, _Traits>&
518basic_istream<_CharT, _Traits>::operator>>(int& __n)
519{
Louis Dionne8ea66082018-07-25 19:40:01 +0000520 return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521}
522
Howard Hinnantc51e1022010-05-11 19:42:16 +0000523template<class _CharT, class _Traits>
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000524_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000525basic_istream<_CharT, _Traits>&
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000526__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000528 ios_base::iostate __state = ios_base::goodbit;
529 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
530 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000531 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000532#ifndef _LIBCPP_NO_EXCEPTIONS
533 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000535#endif
Louis Dionne54f50752019-04-02 19:20:47 +0000536 _CharT* __s = __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000537 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000538 while (__s != __p + (__n-1))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000540 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
541 if (_Traits::eq_int_type(__i, _Traits::eof()))
542 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000543 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000544 break;
545 }
546 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547 if (__ct.is(__ct.space, __ch))
548 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000549 *__s++ = __ch;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000550 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551 }
552 *__s = _CharT();
553 __is.width(0);
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000554 if (__s == __p)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000555 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000556#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000557 }
558 catch (...)
559 {
560 __state |= ios_base::badbit;
561 __is.__setstate_nothrow(__state);
562 if (__is.exceptions() & ios_base::badbit)
563 {
564 throw;
565 }
566 }
567#endif
568 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000569 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570 return __is;
571}
572
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000573#if _LIBCPP_STD_VER > 17
574
575template<class _CharT, class _Traits, size_t _Np>
576inline _LIBCPP_INLINE_VISIBILITY
577basic_istream<_CharT, _Traits>&
578operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
579{
Louis Dionne54f50752019-04-02 19:20:47 +0000580 size_t __n = _Np;
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000581 if (__is.width() > 0)
582 __n = _VSTD::min(size_t(__is.width()), _Np);
583 return _VSTD::__input_c_string(__is, __buf, __n);
584}
585
586template<class _Traits, size_t _Np>
587inline _LIBCPP_INLINE_VISIBILITY
588basic_istream<char, _Traits>&
589operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
590{
591 return __is >> (char(&)[_Np])__buf;
592}
593
594template<class _Traits, size_t _Np>
595inline _LIBCPP_INLINE_VISIBILITY
596basic_istream<char, _Traits>&
597operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
598{
599 return __is >> (char(&)[_Np])__buf;
600}
601
602#else
603
604template<class _CharT, class _Traits>
605inline _LIBCPP_INLINE_VISIBILITY
606basic_istream<_CharT, _Traits>&
607operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
608{
609 streamsize __n = __is.width();
610 if (__n <= 0)
611 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
612 return _VSTD::__input_c_string(__is, __s, size_t(__n));
613}
614
Howard Hinnantc51e1022010-05-11 19:42:16 +0000615template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000616inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000617basic_istream<char, _Traits>&
618operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
619{
620 return __is >> (char*)__s;
621}
622
623template<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, signed char* __s)
627{
628 return __is >> (char*)__s;
629}
630
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400631#endif // _LIBCPP_STD_VER > 17
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000632
Howard Hinnantc51e1022010-05-11 19:42:16 +0000633template<class _CharT, class _Traits>
634basic_istream<_CharT, _Traits>&
635operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
636{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000637 ios_base::iostate __state = ios_base::goodbit;
638 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
639 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000640 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000641#ifndef _LIBCPP_NO_EXCEPTIONS
642 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000644#endif
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000645 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
646 if (_Traits::eq_int_type(__i, _Traits::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000647 __state |= ios_base::eofbit | ios_base::failbit;
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000648 else
649 __c = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000650#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000651 }
652 catch (...)
653 {
654 __state |= ios_base::badbit;
655 __is.__setstate_nothrow(__state);
656 if (__is.exceptions() & ios_base::badbit)
657 {
658 throw;
659 }
660 }
661#endif
662 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000663 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000664 return __is;
665}
666
667template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000668inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000669basic_istream<char, _Traits>&
670operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
671{
672 return __is >> (char&)__c;
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, signed char& __c)
679{
680 return __is >> (char&)__c;
681}
682
683template<class _CharT, class _Traits>
684basic_istream<_CharT, _Traits>&
685basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
686{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000687 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000688 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000689 sentry __s(*this, true);
690 if (__s)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000691 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000692 if (__sb)
Louis Dionne4d23a302019-04-02 21:43:07 +0000693 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000694#ifndef _LIBCPP_NO_EXCEPTIONS
695 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000696 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000697#endif // _LIBCPP_NO_EXCEPTIONS
698 while (true)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000699 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000700 typename traits_type::int_type __i = this->rdbuf()->sgetc();
701 if (traits_type::eq_int_type(__i, _Traits::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000702 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000703 __state |= ios_base::eofbit;
704 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000705 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000706 if (traits_type::eq_int_type(
707 __sb->sputc(traits_type::to_char_type(__i)),
708 traits_type::eof()))
709 break;
710 ++__gc_;
711 this->rdbuf()->sbumpc();
712 }
713 if (__gc_ == 0)
714 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000715#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000716 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000717 catch (...)
718 {
719 __state |= ios_base::badbit;
720 if (__gc_ == 0)
721 __state |= ios_base::failbit;
722
723 this->__setstate_nothrow(__state);
724 if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit)
725 {
726 throw;
727 }
728 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400729#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000730 }
731 else
732 {
733 __state |= ios_base::failbit;
734 }
735 this->setstate(__state);
736 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000737 return *this;
738}
739
740template<class _CharT, class _Traits>
741typename basic_istream<_CharT, _Traits>::int_type
742basic_istream<_CharT, _Traits>::get()
743{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000744 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000745 __gc_ = 0;
746 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000747 sentry __s(*this, true);
748 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000749 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000750#ifndef _LIBCPP_NO_EXCEPTIONS
751 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000752 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000753#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000754 __r = this->rdbuf()->sbumpc();
755 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000756 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000757 else
Howard Hinnante51e4e92011-09-01 21:02:45 +0000758 __gc_ = 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000759#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000760 }
761 catch (...)
762 {
763 this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
764 if (this->exceptions() & ios_base::badbit)
765 {
766 throw;
767 }
768 }
769#endif
770 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000771 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000772 return __r;
773}
774
775template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000776basic_istream<_CharT, _Traits>&
777basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
778{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000779 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000780 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000781 sentry __sen(*this, true);
782 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000783 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000784 if (__n > 0)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000785 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000786#ifndef _LIBCPP_NO_EXCEPTIONS
787 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000788 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000789#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000790 while (__gc_ < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000791 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000792 int_type __i = this->rdbuf()->sgetc();
793 if (traits_type::eq_int_type(__i, traits_type::eof()))
794 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000795 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000796 break;
797 }
798 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000799 if (traits_type::eq(__ch, __dlm))
800 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000801 *__s++ = __ch;
802 ++__gc_;
803 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000804 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000805 if (__gc_ == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000806 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000807#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000808 }
809 catch (...)
810 {
811 __state |= ios_base::badbit;
812 this->__setstate_nothrow(__state);
813 if (this->exceptions() & ios_base::badbit)
814 {
815 if (__n > 0)
816 *__s = char_type();
817 throw;
818 }
819 }
820#endif
821 }
822 else
823 {
824 __state |= ios_base::failbit;
825 }
826
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000827 if (__n > 0)
828 *__s = char_type();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000829 this->setstate(__state);
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000830 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000831 if (__n > 0)
832 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000833 return *this;
834}
835
836template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000837basic_istream<_CharT, _Traits>&
838basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
839 char_type __dlm)
840{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000841 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000842 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000843 sentry __sen(*this, true);
844 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000845 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000846#ifndef _LIBCPP_NO_EXCEPTIONS
847 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000848 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400849#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000850 while (true)
851 {
852 typename traits_type::int_type __i = this->rdbuf()->sgetc();
853 if (traits_type::eq_int_type(__i, traits_type::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000854 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000855 __state |= ios_base::eofbit;
856 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000857 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000858 char_type __ch = traits_type::to_char_type(__i);
859 if (traits_type::eq(__ch, __dlm))
860 break;
861 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
862 break;
863 ++__gc_;
864 this->rdbuf()->sbumpc();
865 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000866#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000867 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000868 catch (...)
869 {
870 __state |= ios_base::badbit;
871 // according to the spec, exceptions here are caught but not rethrown
872 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400873#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000874 if (__gc_ == 0)
875 __state |= ios_base::failbit;
876 this->setstate(__state);
877 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000878 return *this;
879}
880
881template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000882basic_istream<_CharT, _Traits>&
883basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
884{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000885 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000887 sentry __sen(*this, true);
888 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000889 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000890#ifndef _LIBCPP_NO_EXCEPTIONS
891 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000892 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400893#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000894 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000896 typename traits_type::int_type __i = this->rdbuf()->sgetc();
897 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000899 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000900 break;
901 }
902 char_type __ch = traits_type::to_char_type(__i);
903 if (traits_type::eq(__ch, __dlm))
904 {
905 this->rdbuf()->sbumpc();
906 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000907 break;
908 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000909 if (__gc_ >= __n-1)
910 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000911 __state |= ios_base::failbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000912 break;
913 }
914 *__s++ = __ch;
915 this->rdbuf()->sbumpc();
916 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000917 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000918#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000919 }
920 catch (...)
921 {
922 __state |= ios_base::badbit;
923 this->__setstate_nothrow(__state);
924 if (this->exceptions() & ios_base::badbit)
925 {
926 if (__n > 0)
927 *__s = char_type();
928 if (__gc_ == 0)
929 __state |= ios_base::failbit;
930 throw;
931 }
932 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400933#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000934 }
935 if (__n > 0)
936 *__s = char_type();
937 if (__gc_ == 0)
938 __state |= ios_base::failbit;
939 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000940 return *this;
941}
942
943template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000944basic_istream<_CharT, _Traits>&
945basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
946{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000947 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000948 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000949 sentry __sen(*this, true);
950 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000951 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000952#ifndef _LIBCPP_NO_EXCEPTIONS
953 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000954 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400955#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000956 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantc51e1022010-05-11 19:42:16 +0000957 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000958 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000960 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
961 if (traits_type::eq_int_type(__i, traits_type::eof()))
962 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000963 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000964 break;
965 }
966 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000967 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000968 break;
969 }
970 }
971 else
972 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000973 while (__gc_ < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000974 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000975 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
976 if (traits_type::eq_int_type(__i, traits_type::eof()))
977 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000978 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000979 break;
980 }
981 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000982 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000983 break;
984 }
985 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000986#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000987 }
988 catch (...)
989 {
990 __state |= ios_base::badbit;
991 this->__setstate_nothrow(__state);
992 if (this->exceptions() & ios_base::badbit)
993 {
994 throw;
995 }
996 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400997#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000998 this->setstate(__state);
999 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001000 return *this;
1001}
1002
1003template<class _CharT, class _Traits>
1004typename basic_istream<_CharT, _Traits>::int_type
1005basic_istream<_CharT, _Traits>::peek()
1006{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001007 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001008 __gc_ = 0;
1009 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +00001010 sentry __sen(*this, true);
1011 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001012 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001013#ifndef _LIBCPP_NO_EXCEPTIONS
1014 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001015 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001016#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001017 __r = this->rdbuf()->sgetc();
Howard Hinnanta4427372012-11-01 17:32:07 +00001018 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +00001019 __state |= ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001021 }
1022 catch (...)
1023 {
1024 __state |= ios_base::badbit;
1025 this->__setstate_nothrow(__state);
1026 if (this->exceptions() & ios_base::badbit)
1027 {
1028 throw;
1029 }
1030 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001031#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001032 this->setstate(__state);
1033 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001034 return __r;
1035}
1036
1037template<class _CharT, class _Traits>
1038basic_istream<_CharT, _Traits>&
1039basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1040{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001041 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001043 sentry __sen(*this, true);
1044 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001045 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001046#ifndef _LIBCPP_NO_EXCEPTIONS
1047 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001048 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001049#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant232466c2013-03-06 19:27:56 +00001050 __gc_ = this->rdbuf()->sgetn(__s, __n);
1051 if (__gc_ != __n)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001052 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001054 }
1055 catch (...)
1056 {
1057 __state |= ios_base::badbit;
1058 this->__setstate_nothrow(__state);
1059 if (this->exceptions() & ios_base::badbit)
1060 {
1061 throw;
1062 }
1063 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001064#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001065 }
1066 else
1067 {
1068 __state |= ios_base::failbit;
1069 }
1070 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001071 return *this;
1072}
1073
1074template<class _CharT, class _Traits>
1075streamsize
1076basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1077{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001078 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantaf8555c2012-12-20 15:40:28 +00001079 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001080 sentry __sen(*this, true);
1081 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001082 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001083#ifndef _LIBCPP_NO_EXCEPTIONS
1084 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001085 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001086#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clow1c6e3862016-07-13 16:58:48 +00001087 streamsize __c = this->rdbuf()->in_avail();
1088 switch (__c)
1089 {
1090 case -1:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001091 __state |= ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001092 break;
1093 case 0:
1094 break;
1095 default:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001096 __n = _VSTD::min(__c, __n);
1097 __gc_ = this->rdbuf()->sgetn(__s, __n);
1098 if (__gc_ != __n)
1099 __state |= ios_base::failbit | ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001100 break;
1101 }
Marshall Clow1c6e3862016-07-13 16:58:48 +00001102#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001103 }
1104 catch (...)
1105 {
1106 __state |= ios_base::badbit;
1107 this->__setstate_nothrow(__state);
1108 if (this->exceptions() & ios_base::badbit)
1109 {
1110 throw;
1111 }
1112 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001113#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001114 }
1115 else
1116 {
1117 __state |= ios_base::failbit;
1118 }
1119 this->setstate(__state);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001120 return __gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001121}
1122
1123template<class _CharT, class _Traits>
1124basic_istream<_CharT, _Traits>&
1125basic_istream<_CharT, _Traits>::putback(char_type __c)
1126{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001127 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001128 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001129 this->clear(__state);
1130 sentry __sen(*this, true);
1131 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001132 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001133#ifndef _LIBCPP_NO_EXCEPTIONS
1134 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001135 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001136#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001137 if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
Louis Dionne94ee3a02019-04-05 16:33:37 +00001138 __state |= ios_base::badbit;
1139#ifndef _LIBCPP_NO_EXCEPTIONS
1140 }
1141 catch (...)
1142 {
1143 __state |= ios_base::badbit;
1144 this->__setstate_nothrow(__state);
1145 if (this->exceptions() & ios_base::badbit)
1146 {
1147 throw;
1148 }
1149 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001150#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001151 }
1152 else
1153 {
1154 __state |= ios_base::failbit;
1155 }
1156 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001157 return *this;
1158}
1159
1160template<class _CharT, class _Traits>
1161basic_istream<_CharT, _Traits>&
1162basic_istream<_CharT, _Traits>::unget()
1163{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001164 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001166 this->clear(__state);
1167 sentry __sen(*this, true);
1168 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001169 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001170#ifndef _LIBCPP_NO_EXCEPTIONS
1171 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001172 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001173#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001174 if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
Louis Dionne94ee3a02019-04-05 16:33:37 +00001175 __state |= ios_base::badbit;
1176#ifndef _LIBCPP_NO_EXCEPTIONS
1177 }
1178 catch (...)
1179 {
1180 __state |= ios_base::badbit;
1181 this->__setstate_nothrow(__state);
1182 if (this->exceptions() & ios_base::badbit)
1183 {
1184 throw;
1185 }
1186 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001187#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001188 }
1189 else
1190 {
1191 __state |= ios_base::failbit;
1192 }
1193 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001194 return *this;
1195}
1196
1197template<class _CharT, class _Traits>
1198int
1199basic_istream<_CharT, _Traits>::sync()
1200{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001201 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001202 int __r = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001203 sentry __sen(*this, true);
1204 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001205 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001206#ifndef _LIBCPP_NO_EXCEPTIONS
1207 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001208 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001209#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001210 if (this->rdbuf() == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001211 return -1;
1212 if (this->rdbuf()->pubsync() == -1)
1213 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001214 __state |= ios_base::badbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001215 return -1;
1216 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001217#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001218 }
1219 catch (...)
1220 {
1221 __state |= ios_base::badbit;
1222 this->__setstate_nothrow(__state);
1223 if (this->exceptions() & ios_base::badbit)
1224 {
1225 throw;
1226 }
1227 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001228#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001229 this->setstate(__state);
1230 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001231 return __r;
1232}
1233
1234template<class _CharT, class _Traits>
1235typename basic_istream<_CharT, _Traits>::pos_type
1236basic_istream<_CharT, _Traits>::tellg()
1237{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001238 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001239 pos_type __r(-1);
Louis Dionne94ee3a02019-04-05 16:33:37 +00001240 sentry __sen(*this, true);
1241 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001242 {
Louis Dionne4d23a302019-04-02 21:43:07 +00001243#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001244 try
1245 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001246#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001247 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1248#ifndef _LIBCPP_NO_EXCEPTIONS
1249 }
1250 catch (...)
1251 {
1252 __state |= ios_base::badbit;
1253 this->__setstate_nothrow(__state);
1254 if (this->exceptions() & ios_base::badbit)
1255 {
1256 throw;
1257 }
1258 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001259#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001260 this->setstate(__state);
1261 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001262 return __r;
1263}
1264
1265template<class _CharT, class _Traits>
1266basic_istream<_CharT, _Traits>&
1267basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1268{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001269 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1270 this->clear(__state);
1271 sentry __sen(*this, true);
1272 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001273 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001274#ifndef _LIBCPP_NO_EXCEPTIONS
1275 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001276 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001277#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001278 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1279 __state |= ios_base::failbit;
1280#ifndef _LIBCPP_NO_EXCEPTIONS
1281 }
1282 catch (...)
1283 {
1284 __state |= ios_base::badbit;
1285 this->__setstate_nothrow(__state);
1286 if (this->exceptions() & ios_base::badbit)
1287 {
1288 throw;
1289 }
1290 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001291#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001292 this->setstate(__state);
1293 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001294 return *this;
1295}
1296
1297template<class _CharT, class _Traits>
1298basic_istream<_CharT, _Traits>&
1299basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1300{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001301 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1302 this->clear(__state);
1303 sentry __sen(*this, true);
1304 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001305 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001306#ifndef _LIBCPP_NO_EXCEPTIONS
1307 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001308 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001309#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001310 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1311 __state |= ios_base::failbit;
1312#ifndef _LIBCPP_NO_EXCEPTIONS
1313 }
1314 catch (...)
1315 {
1316 __state |= ios_base::badbit;
1317 this->__setstate_nothrow(__state);
1318 if (this->exceptions() & ios_base::badbit)
1319 {
1320 throw;
1321 }
1322 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001323#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001324 this->setstate(__state);
1325 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001326 return *this;
1327}
1328
1329template <class _CharT, class _Traits>
1330basic_istream<_CharT, _Traits>&
1331ws(basic_istream<_CharT, _Traits>& __is)
1332{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001333 ios_base::iostate __state = ios_base::goodbit;
1334 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1335 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001336 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001337#ifndef _LIBCPP_NO_EXCEPTIONS
1338 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001339 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001340#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001341 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001342 while (true)
1343 {
1344 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1345 if (_Traits::eq_int_type(__i, _Traits::eof()))
1346 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001347 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001348 break;
1349 }
1350 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001351 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001352 __is.rdbuf()->sbumpc();
1353 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001354#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001355 }
1356 catch (...)
1357 {
1358 __state |= ios_base::badbit;
1359 __is.__setstate_nothrow(__state);
1360 if (__is.exceptions() & ios_base::badbit)
1361 {
1362 throw;
1363 }
1364 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001365#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001366 __is.setstate(__state);
1367 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001368 return __is;
1369}
1370
Louis Dionned9f73b12020-09-23 08:49:00 -04001371template <class _Stream, class _Tp, class = void>
1372struct __is_istreamable : false_type { };
1373
1374template <class _Stream, class _Tp>
1375struct __is_istreamable<_Stream, _Tp, decltype(
Arthur O'Dwyer3285c342021-05-10 13:04:16 -04001376 declval<_Stream>() >> declval<_Tp>(), void()
Louis Dionned9f73b12020-09-23 08:49:00 -04001377)> : true_type { };
1378
1379template <class _Stream, class _Tp, class = typename enable_if<
1380 _And<is_base_of<ios_base, _Stream>,
Arthur O'Dwyer46d358c2021-06-15 12:57:05 -04001381 __is_istreamable<_Stream&, _Tp&&> >::value
Louis Dionned9f73b12020-09-23 08:49:00 -04001382>::type>
1383_LIBCPP_INLINE_VISIBILITY
1384_Stream&& operator>>(_Stream&& __is, _Tp&& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001385{
Eric Fiselier7955ef62016-07-24 04:07:22 +00001386 __is >> _VSTD::forward<_Tp>(__x);
Louis Dionned9f73b12020-09-23 08:49:00 -04001387 return _VSTD::move(__is);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001388}
1389
Howard Hinnantc51e1022010-05-11 19:42:16 +00001390template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001391class _LIBCPP_TEMPLATE_VIS basic_iostream
Howard Hinnantc51e1022010-05-11 19:42:16 +00001392 : public basic_istream<_CharT, _Traits>,
1393 public basic_ostream<_CharT, _Traits>
1394{
1395public:
1396 // types:
1397 typedef _CharT char_type;
1398 typedef _Traits traits_type;
1399 typedef typename traits_type::int_type int_type;
1400 typedef typename traits_type::pos_type pos_type;
1401 typedef typename traits_type::off_type off_type;
1402
1403 // constructor/destructor
Louis Dionneb4d05d72018-10-16 19:26:23 +00001404 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001405 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1406 : basic_istream<_CharT, _Traits>(__sb)
1407 {}
1408
Howard Hinnantc51e1022010-05-11 19:42:16 +00001409 virtual ~basic_iostream();
1410protected:
Eric Fiselier815ed732016-09-16 00:00:48 +00001411 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001412 basic_iostream(basic_iostream&& __rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001413
1414 // assign/swap
Eric Fiselier815ed732016-09-16 00:00:48 +00001415 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001416 basic_iostream& operator=(basic_iostream&& __rhs);
Arthur O'Dwyer8dcd2982021-06-15 12:47:05 -04001417
Louis Dionneb4d05d72018-10-16 19:26:23 +00001418 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001419 void swap(basic_iostream& __rhs)
1420 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001421};
1422
Howard Hinnantc51e1022010-05-11 19:42:16 +00001423template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001424basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001425 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001426{
1427}
1428
1429template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001430basic_iostream<_CharT, _Traits>&
1431basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1432{
1433 swap(__rhs);
1434 return *this;
1435}
1436
Howard Hinnantc51e1022010-05-11 19:42:16 +00001437template <class _CharT, class _Traits>
1438basic_iostream<_CharT, _Traits>::~basic_iostream()
1439{
1440}
1441
Howard Hinnantc51e1022010-05-11 19:42:16 +00001442template<class _CharT, class _Traits, class _Allocator>
1443basic_istream<_CharT, _Traits>&
1444operator>>(basic_istream<_CharT, _Traits>& __is,
1445 basic_string<_CharT, _Traits, _Allocator>& __str)
1446{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001447 ios_base::iostate __state = ios_base::goodbit;
1448 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1449 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001450 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001451#ifndef _LIBCPP_NO_EXCEPTIONS
1452 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001453 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001454#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001455 __str.clear();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001456 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001457 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001458 __n = __str.max_size();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001459 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001460 __n = numeric_limits<streamsize>::max();
1461 streamsize __c = 0;
1462 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001463 while (__c < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001464 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001465 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1466 if (_Traits::eq_int_type(__i, _Traits::eof()))
1467 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001468 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001469 break;
1470 }
1471 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001472 if (__ct.is(__ct.space, __ch))
1473 break;
1474 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001475 ++__c;
1476 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001477 }
1478 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001479 if (__c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001480 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001481#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001482 }
1483 catch (...)
1484 {
1485 __state |= ios_base::badbit;
1486 __is.__setstate_nothrow(__state);
1487 if (__is.exceptions() & ios_base::badbit)
1488 {
1489 throw;
1490 }
1491 }
1492#endif
1493 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001494 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001495 return __is;
1496}
1497
1498template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001499basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001500getline(basic_istream<_CharT, _Traits>& __is,
1501 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1502{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001503 ios_base::iostate __state = ios_base::goodbit;
1504 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1505 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001506 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001507#ifndef _LIBCPP_NO_EXCEPTIONS
1508 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001509 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001510#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001511 __str.clear();
Howard Hinnante992f762011-10-09 15:20:46 +00001512 streamsize __extr = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001513 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001514 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001515 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1516 if (_Traits::eq_int_type(__i, _Traits::eof()))
1517 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001518 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001519 break;
1520 }
Howard Hinnante992f762011-10-09 15:20:46 +00001521 ++__extr;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001522 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001523 if (_Traits::eq(__ch, __dlm))
1524 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001525 __str.push_back(__ch);
1526 if (__str.size() == __str.max_size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001527 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001528 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001529 break;
1530 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001531 }
Howard Hinnante992f762011-10-09 15:20:46 +00001532 if (__extr == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001533 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001535 }
1536 catch (...)
1537 {
1538 __state |= ios_base::badbit;
1539 __is.__setstate_nothrow(__state);
1540 if (__is.exceptions() & ios_base::badbit)
1541 {
1542 throw;
1543 }
1544 }
1545#endif
1546 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001548 return __is;
1549}
1550
1551template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001552inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001553basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554getline(basic_istream<_CharT, _Traits>& __is,
1555 basic_string<_CharT, _Traits, _Allocator>& __str)
1556{
1557 return getline(__is, __str, __is.widen('\n'));
1558}
1559
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001561inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001562basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001563getline(basic_istream<_CharT, _Traits>&& __is,
1564 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1565{
1566 return getline(__is, __str, __dlm);
1567}
1568
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)
1574{
1575 return getline(__is, __str, __is.widen('\n'));
1576}
1577
Howard Hinnantc51e1022010-05-11 19:42:16 +00001578template <class _CharT, class _Traits, size_t _Size>
1579basic_istream<_CharT, _Traits>&
1580operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1581{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001582 ios_base::iostate __state = ios_base::goodbit;
1583 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1584 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001585 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001586#ifndef _LIBCPP_NO_EXCEPTIONS
1587 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001588 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001589#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001590 basic_string<_CharT, _Traits> __str;
1591 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier37c22152016-12-24 00:24:44 +00001592 size_t __c = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001593 _CharT __zero = __ct.widen('0');
1594 _CharT __one = __ct.widen('1');
Howard Hinnante51e4e92011-09-01 21:02:45 +00001595 while (__c < _Size)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001596 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001597 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1598 if (_Traits::eq_int_type(__i, _Traits::eof()))
1599 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001600 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001601 break;
1602 }
1603 _CharT __ch = _Traits::to_char_type(__i);
1604 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001605 break;
1606 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001607 ++__c;
1608 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001609 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001610 __x = bitset<_Size>(__str);
Louis Dionne82079002019-08-20 18:21:06 +00001611 if (_Size > 0 && __c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001612 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001613#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001614 }
1615 catch (...)
1616 {
1617 __state |= ios_base::badbit;
1618 __is.__setstate_nothrow(__state);
1619 if (__is.exceptions() & ios_base::badbit)
1620 {
1621 throw;
1622 }
1623 }
1624#endif
1625 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001626 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001627 return __is;
1628}
1629
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001630_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
Louis Dionne89258142021-08-23 15:32:36 -04001631#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001632_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
Louis Dionne89258142021-08-23 15:32:36 -04001633#endif
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001634_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001635
1636_LIBCPP_END_NAMESPACE_STD
1637
Eric Fiselierf4433a32017-05-31 22:07:49 +00001638_LIBCPP_POP_MACROS
1639
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001640#endif // _LIBCPP_ISTREAM