blob: 7f827bbe07fb13d6db109919236a54a63e4886af [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
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>
162#include <ostream>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400163#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000164
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
Arthur O'Dwyer6c9c9a72021-06-15 12:57:54 -0400305 explicit operator bool() const {return __ok_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306};
307
308template <class _CharT, class _Traits>
309basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
310 bool __noskipws)
311 : __ok_(false)
312{
313 if (__is.good())
314 {
315 if (__is.tie())
316 __is.tie()->flush();
317 if (!__noskipws && (__is.flags() & ios_base::skipws))
318 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000319 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantc834c512011-11-29 18:15:50 +0000321 _Ip __i(__is);
322 _Ip __eof;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000323 for (; __i != __eof; ++__i)
324 if (!__ct.is(__ct.space, *__i))
325 break;
326 if (__i == __eof)
327 __is.setstate(ios_base::failbit | ios_base::eofbit);
328 }
329 __ok_ = __is.good();
330 }
331 else
332 __is.setstate(ios_base::failbit);
333}
334
Eric Fiselier78ccf772017-04-18 23:38:41 +0000335#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000336
337template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
339 : __gc_(__rhs.__gc_)
340{
341 __rhs.__gc_ = 0;
342 this->move(__rhs);
343}
344
345template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346basic_istream<_CharT, _Traits>&
347basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
348{
349 swap(__rhs);
350 return *this;
351}
352
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400353#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354
355template <class _CharT, class _Traits>
356basic_istream<_CharT, _Traits>::~basic_istream()
357{
358}
359
Louis Dionne8ea66082018-07-25 19:40:01 +0000360template <class _Tp, class _CharT, class _Traits>
361_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362basic_istream<_CharT, _Traits>&
Louis Dionne8ea66082018-07-25 19:40:01 +0000363__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000364 ios_base::iostate __state = ios_base::goodbit;
365 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
366 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000367 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000368#ifndef _LIBCPP_NO_EXCEPTIONS
369 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000370 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400371#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000372 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
373 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000374 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000376 }
377 catch (...)
378 {
379 __state |= ios_base::badbit;
380 __is.__setstate_nothrow(__state);
381 if (__is.exceptions() & ios_base::badbit)
382 {
383 throw;
384 }
385 }
386#endif
387 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000389 return __is;
390}
391
392template <class _CharT, class _Traits>
393basic_istream<_CharT, _Traits>&
394basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
395{
396 return _VSTD::__input_arithmetic<unsigned short>(*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>>(unsigned int& __n)
402{
Louis Dionne8ea66082018-07-25 19:40:01 +0000403 return _VSTD::__input_arithmetic<unsigned int>(*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>>(long& __n)
409{
Louis Dionne8ea66082018-07-25 19:40:01 +0000410 return _VSTD::__input_arithmetic<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>>(unsigned long& __n)
416{
Louis Dionne8ea66082018-07-25 19:40:01 +0000417 return _VSTD::__input_arithmetic<unsigned 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>>(long long& __n)
423{
Louis Dionne8ea66082018-07-25 19:40:01 +0000424 return _VSTD::__input_arithmetic<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>>(unsigned long long& __n)
430{
Louis Dionne8ea66082018-07-25 19:40:01 +0000431 return _VSTD::__input_arithmetic<unsigned long long>(*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>>(float& __n)
437{
Louis Dionne8ea66082018-07-25 19:40:01 +0000438 return _VSTD::__input_arithmetic<float>(*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>>(double& __n)
444{
Louis Dionne8ea66082018-07-25 19:40:01 +0000445 return _VSTD::__input_arithmetic<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>>(long double& __n)
451{
Louis Dionne8ea66082018-07-25 19:40:01 +0000452 return _VSTD::__input_arithmetic<long double>(*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>>(bool& __n)
458{
Louis Dionne8ea66082018-07-25 19:40:01 +0000459 return _VSTD::__input_arithmetic<bool>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460}
461
462template <class _CharT, class _Traits>
463basic_istream<_CharT, _Traits>&
464basic_istream<_CharT, _Traits>::operator>>(void*& __n)
465{
Louis Dionne8ea66082018-07-25 19:40:01 +0000466 return _VSTD::__input_arithmetic<void*>(*this, __n);
467}
468
469template <class _Tp, class _CharT, class _Traits>
470_LIBCPP_INLINE_VISIBILITY
471basic_istream<_CharT, _Traits>&
472__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000473 ios_base::iostate __state = ios_base::goodbit;
474 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
475 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000476 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000477#ifndef _LIBCPP_NO_EXCEPTIONS
478 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000479 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400480#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000481 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
482 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne8ea66082018-07-25 19:40:01 +0000483 long __temp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000484 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
Louis Dionne8ea66082018-07-25 19:40:01 +0000485 if (__temp < numeric_limits<_Tp>::min())
486 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000487 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000488 __n = numeric_limits<_Tp>::min();
489 }
490 else if (__temp > numeric_limits<_Tp>::max())
491 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000492 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000493 __n = numeric_limits<_Tp>::max();
494 }
495 else
Louis Dionne94ee3a02019-04-05 16:33:37 +0000496 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000497 __n = static_cast<_Tp>(__temp);
Louis Dionne94ee3a02019-04-05 16:33:37 +0000498 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000499#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000500 }
501 catch (...)
502 {
503 __state |= ios_base::badbit;
504 __is.__setstate_nothrow(__state);
505 if (__is.exceptions() & ios_base::badbit)
506 {
507 throw;
508 }
509 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400510#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000511 __is.setstate(__state);
512 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000513 return __is;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514}
515
516template <class _CharT, class _Traits>
517basic_istream<_CharT, _Traits>&
518basic_istream<_CharT, _Traits>::operator>>(short& __n)
519{
Louis Dionne8ea66082018-07-25 19:40:01 +0000520 return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521}
522
523template <class _CharT, class _Traits>
524basic_istream<_CharT, _Traits>&
525basic_istream<_CharT, _Traits>::operator>>(int& __n)
526{
Louis Dionne8ea66082018-07-25 19:40:01 +0000527 return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528}
529
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530template<class _CharT, class _Traits>
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000531_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532basic_istream<_CharT, _Traits>&
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000533__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000535 ios_base::iostate __state = ios_base::goodbit;
536 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
537 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000538 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000539#ifndef _LIBCPP_NO_EXCEPTIONS
540 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000542#endif
Louis Dionne54f50752019-04-02 19:20:47 +0000543 _CharT* __s = __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000545 while (__s != __p + (__n-1))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000547 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
548 if (_Traits::eq_int_type(__i, _Traits::eof()))
549 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000550 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000551 break;
552 }
553 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554 if (__ct.is(__ct.space, __ch))
555 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000556 *__s++ = __ch;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000557 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000558 }
559 *__s = _CharT();
560 __is.width(0);
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000561 if (__s == __p)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000562 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000563#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000564 }
565 catch (...)
566 {
567 __state |= ios_base::badbit;
568 __is.__setstate_nothrow(__state);
569 if (__is.exceptions() & ios_base::badbit)
570 {
571 throw;
572 }
573 }
574#endif
575 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577 return __is;
578}
579
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000580#if _LIBCPP_STD_VER > 17
581
582template<class _CharT, class _Traits, size_t _Np>
583inline _LIBCPP_INLINE_VISIBILITY
584basic_istream<_CharT, _Traits>&
585operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
586{
Louis Dionne54f50752019-04-02 19:20:47 +0000587 size_t __n = _Np;
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000588 if (__is.width() > 0)
589 __n = _VSTD::min(size_t(__is.width()), _Np);
590 return _VSTD::__input_c_string(__is, __buf, __n);
591}
592
593template<class _Traits, size_t _Np>
594inline _LIBCPP_INLINE_VISIBILITY
595basic_istream<char, _Traits>&
596operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
597{
598 return __is >> (char(&)[_Np])__buf;
599}
600
601template<class _Traits, size_t _Np>
602inline _LIBCPP_INLINE_VISIBILITY
603basic_istream<char, _Traits>&
604operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
605{
606 return __is >> (char(&)[_Np])__buf;
607}
608
609#else
610
611template<class _CharT, class _Traits>
612inline _LIBCPP_INLINE_VISIBILITY
613basic_istream<_CharT, _Traits>&
614operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
615{
616 streamsize __n = __is.width();
617 if (__n <= 0)
618 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
619 return _VSTD::__input_c_string(__is, __s, size_t(__n));
620}
621
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000623inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000624basic_istream<char, _Traits>&
625operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
626{
627 return __is >> (char*)__s;
628}
629
630template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000631inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632basic_istream<char, _Traits>&
633operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
634{
635 return __is >> (char*)__s;
636}
637
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400638#endif // _LIBCPP_STD_VER > 17
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000639
Howard Hinnantc51e1022010-05-11 19:42:16 +0000640template<class _CharT, class _Traits>
641basic_istream<_CharT, _Traits>&
642operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
643{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000644 ios_base::iostate __state = ios_base::goodbit;
645 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
646 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000647 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000648#ifndef _LIBCPP_NO_EXCEPTIONS
649 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000650 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000651#endif
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000652 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
653 if (_Traits::eq_int_type(__i, _Traits::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000654 __state |= ios_base::eofbit | ios_base::failbit;
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000655 else
656 __c = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000657#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000658 }
659 catch (...)
660 {
661 __state |= ios_base::badbit;
662 __is.__setstate_nothrow(__state);
663 if (__is.exceptions() & ios_base::badbit)
664 {
665 throw;
666 }
667 }
668#endif
669 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000670 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000671 return __is;
672}
673
674template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000675inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000676basic_istream<char, _Traits>&
677operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
678{
679 return __is >> (char&)__c;
680}
681
682template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000683inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000684basic_istream<char, _Traits>&
685operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
686{
687 return __is >> (char&)__c;
688}
689
690template<class _CharT, class _Traits>
691basic_istream<_CharT, _Traits>&
692basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
693{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000694 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000695 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000696 sentry __s(*this, true);
697 if (__s)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000699 if (__sb)
Louis Dionne4d23a302019-04-02 21:43:07 +0000700 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000701#ifndef _LIBCPP_NO_EXCEPTIONS
702 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000703 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000704#endif // _LIBCPP_NO_EXCEPTIONS
705 while (true)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000706 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000707 typename traits_type::int_type __i = this->rdbuf()->sgetc();
708 if (traits_type::eq_int_type(__i, _Traits::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000709 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000710 __state |= ios_base::eofbit;
711 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000712 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000713 if (traits_type::eq_int_type(
714 __sb->sputc(traits_type::to_char_type(__i)),
715 traits_type::eof()))
716 break;
717 ++__gc_;
718 this->rdbuf()->sbumpc();
719 }
720 if (__gc_ == 0)
721 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000722#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000723 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000724 catch (...)
725 {
726 __state |= ios_base::badbit;
727 if (__gc_ == 0)
728 __state |= ios_base::failbit;
729
730 this->__setstate_nothrow(__state);
731 if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit)
732 {
733 throw;
734 }
735 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400736#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000737 }
738 else
739 {
740 __state |= ios_base::failbit;
741 }
742 this->setstate(__state);
743 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000744 return *this;
745}
746
747template<class _CharT, class _Traits>
748typename basic_istream<_CharT, _Traits>::int_type
749basic_istream<_CharT, _Traits>::get()
750{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000751 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000752 __gc_ = 0;
753 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000754 sentry __s(*this, true);
755 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000756 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000757#ifndef _LIBCPP_NO_EXCEPTIONS
758 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000759 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000760#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000761 __r = this->rdbuf()->sbumpc();
762 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000763 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000764 else
Howard Hinnante51e4e92011-09-01 21:02:45 +0000765 __gc_ = 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000766#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000767 }
768 catch (...)
769 {
770 this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
771 if (this->exceptions() & ios_base::badbit)
772 {
773 throw;
774 }
775 }
776#endif
777 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000778 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000779 return __r;
780}
781
782template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000783basic_istream<_CharT, _Traits>&
784basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
785{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000786 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000788 sentry __sen(*this, true);
789 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000790 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000791 if (__n > 0)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000792 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000793#ifndef _LIBCPP_NO_EXCEPTIONS
794 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000795 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000796#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000797 while (__gc_ < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000798 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000799 int_type __i = this->rdbuf()->sgetc();
800 if (traits_type::eq_int_type(__i, traits_type::eof()))
801 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000802 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000803 break;
804 }
805 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000806 if (traits_type::eq(__ch, __dlm))
807 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000808 *__s++ = __ch;
809 ++__gc_;
810 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000811 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000812 if (__gc_ == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000813 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000814#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000815 }
816 catch (...)
817 {
818 __state |= ios_base::badbit;
819 this->__setstate_nothrow(__state);
820 if (this->exceptions() & ios_base::badbit)
821 {
822 if (__n > 0)
823 *__s = char_type();
824 throw;
825 }
826 }
827#endif
828 }
829 else
830 {
831 __state |= ios_base::failbit;
832 }
833
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000834 if (__n > 0)
835 *__s = char_type();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000836 this->setstate(__state);
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000837 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000838 if (__n > 0)
839 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000840 return *this;
841}
842
843template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000844basic_istream<_CharT, _Traits>&
845basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
846 char_type __dlm)
847{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000848 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000849 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000850 sentry __sen(*this, true);
851 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000852 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000853#ifndef _LIBCPP_NO_EXCEPTIONS
854 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000855 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400856#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000857 while (true)
858 {
859 typename traits_type::int_type __i = this->rdbuf()->sgetc();
860 if (traits_type::eq_int_type(__i, traits_type::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000861 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000862 __state |= ios_base::eofbit;
863 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000864 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000865 char_type __ch = traits_type::to_char_type(__i);
866 if (traits_type::eq(__ch, __dlm))
867 break;
868 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
869 break;
870 ++__gc_;
871 this->rdbuf()->sbumpc();
872 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000873#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000874 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000875 catch (...)
876 {
877 __state |= ios_base::badbit;
878 // according to the spec, exceptions here are caught but not rethrown
879 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400880#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000881 if (__gc_ == 0)
882 __state |= ios_base::failbit;
883 this->setstate(__state);
884 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000885 return *this;
886}
887
888template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000889basic_istream<_CharT, _Traits>&
890basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
891{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000892 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000893 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000894 sentry __sen(*this, true);
895 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000896 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000897#ifndef _LIBCPP_NO_EXCEPTIONS
898 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000899 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400900#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000901 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000902 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000903 typename traits_type::int_type __i = this->rdbuf()->sgetc();
904 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000906 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000907 break;
908 }
909 char_type __ch = traits_type::to_char_type(__i);
910 if (traits_type::eq(__ch, __dlm))
911 {
912 this->rdbuf()->sbumpc();
913 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000914 break;
915 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000916 if (__gc_ >= __n-1)
917 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000918 __state |= ios_base::failbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000919 break;
920 }
921 *__s++ = __ch;
922 this->rdbuf()->sbumpc();
923 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000925#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000926 }
927 catch (...)
928 {
929 __state |= ios_base::badbit;
930 this->__setstate_nothrow(__state);
931 if (this->exceptions() & ios_base::badbit)
932 {
933 if (__n > 0)
934 *__s = char_type();
935 if (__gc_ == 0)
936 __state |= ios_base::failbit;
937 throw;
938 }
939 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400940#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000941 }
942 if (__n > 0)
943 *__s = char_type();
944 if (__gc_ == 0)
945 __state |= ios_base::failbit;
946 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947 return *this;
948}
949
950template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000951basic_istream<_CharT, _Traits>&
952basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
953{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000954 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000955 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000956 sentry __sen(*this, true);
957 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000958 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000959#ifndef _LIBCPP_NO_EXCEPTIONS
960 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000961 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400962#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000963 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantc51e1022010-05-11 19:42:16 +0000964 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000965 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000966 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000967 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
968 if (traits_type::eq_int_type(__i, traits_type::eof()))
969 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000970 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000971 break;
972 }
973 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000974 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000975 break;
976 }
977 }
978 else
979 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000980 while (__gc_ < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000981 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000982 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
983 if (traits_type::eq_int_type(__i, traits_type::eof()))
984 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000985 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000986 break;
987 }
988 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000989 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000990 break;
991 }
992 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000993#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000994 }
995 catch (...)
996 {
997 __state |= ios_base::badbit;
998 this->__setstate_nothrow(__state);
999 if (this->exceptions() & ios_base::badbit)
1000 {
1001 throw;
1002 }
1003 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001004#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001005 this->setstate(__state);
1006 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001007 return *this;
1008}
1009
1010template<class _CharT, class _Traits>
1011typename basic_istream<_CharT, _Traits>::int_type
1012basic_istream<_CharT, _Traits>::peek()
1013{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001014 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001015 __gc_ = 0;
1016 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +00001017 sentry __sen(*this, true);
1018 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001019 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001020#ifndef _LIBCPP_NO_EXCEPTIONS
1021 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001022 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001023#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001024 __r = this->rdbuf()->sgetc();
Howard Hinnanta4427372012-11-01 17:32:07 +00001025 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +00001026 __state |= ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001027#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001028 }
1029 catch (...)
1030 {
1031 __state |= ios_base::badbit;
1032 this->__setstate_nothrow(__state);
1033 if (this->exceptions() & ios_base::badbit)
1034 {
1035 throw;
1036 }
1037 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001038#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001039 this->setstate(__state);
1040 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001041 return __r;
1042}
1043
1044template<class _CharT, class _Traits>
1045basic_istream<_CharT, _Traits>&
1046basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1047{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001048 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001049 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001050 sentry __sen(*this, true);
1051 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001052 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001053#ifndef _LIBCPP_NO_EXCEPTIONS
1054 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001055 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001056#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant232466c2013-03-06 19:27:56 +00001057 __gc_ = this->rdbuf()->sgetn(__s, __n);
1058 if (__gc_ != __n)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001059 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001061 }
1062 catch (...)
1063 {
1064 __state |= ios_base::badbit;
1065 this->__setstate_nothrow(__state);
1066 if (this->exceptions() & ios_base::badbit)
1067 {
1068 throw;
1069 }
1070 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001071#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001072 }
1073 else
1074 {
1075 __state |= ios_base::failbit;
1076 }
1077 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001078 return *this;
1079}
1080
1081template<class _CharT, class _Traits>
1082streamsize
1083basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1084{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001085 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantaf8555c2012-12-20 15:40:28 +00001086 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001087 sentry __sen(*this, true);
1088 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001089 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001090#ifndef _LIBCPP_NO_EXCEPTIONS
1091 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001092 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001093#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clow1c6e3862016-07-13 16:58:48 +00001094 streamsize __c = this->rdbuf()->in_avail();
1095 switch (__c)
1096 {
1097 case -1:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001098 __state |= ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001099 break;
1100 case 0:
1101 break;
1102 default:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001103 __n = _VSTD::min(__c, __n);
1104 __gc_ = this->rdbuf()->sgetn(__s, __n);
1105 if (__gc_ != __n)
1106 __state |= ios_base::failbit | ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001107 break;
1108 }
Marshall Clow1c6e3862016-07-13 16:58:48 +00001109#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001110 }
1111 catch (...)
1112 {
1113 __state |= ios_base::badbit;
1114 this->__setstate_nothrow(__state);
1115 if (this->exceptions() & ios_base::badbit)
1116 {
1117 throw;
1118 }
1119 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001120#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001121 }
1122 else
1123 {
1124 __state |= ios_base::failbit;
1125 }
1126 this->setstate(__state);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001127 return __gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001128}
1129
1130template<class _CharT, class _Traits>
1131basic_istream<_CharT, _Traits>&
1132basic_istream<_CharT, _Traits>::putback(char_type __c)
1133{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001134 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001135 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001136 this->clear(__state);
1137 sentry __sen(*this, true);
1138 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001139 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001140#ifndef _LIBCPP_NO_EXCEPTIONS
1141 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001142 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001143#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001144 if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
Louis Dionne94ee3a02019-04-05 16:33:37 +00001145 __state |= ios_base::badbit;
1146#ifndef _LIBCPP_NO_EXCEPTIONS
1147 }
1148 catch (...)
1149 {
1150 __state |= ios_base::badbit;
1151 this->__setstate_nothrow(__state);
1152 if (this->exceptions() & ios_base::badbit)
1153 {
1154 throw;
1155 }
1156 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001157#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001158 }
1159 else
1160 {
1161 __state |= ios_base::failbit;
1162 }
1163 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001164 return *this;
1165}
1166
1167template<class _CharT, class _Traits>
1168basic_istream<_CharT, _Traits>&
1169basic_istream<_CharT, _Traits>::unget()
1170{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001171 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001172 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001173 this->clear(__state);
1174 sentry __sen(*this, true);
1175 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001176 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001177#ifndef _LIBCPP_NO_EXCEPTIONS
1178 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001179 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001180#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001181 if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
Louis Dionne94ee3a02019-04-05 16:33:37 +00001182 __state |= ios_base::badbit;
1183#ifndef _LIBCPP_NO_EXCEPTIONS
1184 }
1185 catch (...)
1186 {
1187 __state |= ios_base::badbit;
1188 this->__setstate_nothrow(__state);
1189 if (this->exceptions() & ios_base::badbit)
1190 {
1191 throw;
1192 }
1193 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001194#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001195 }
1196 else
1197 {
1198 __state |= ios_base::failbit;
1199 }
1200 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001201 return *this;
1202}
1203
1204template<class _CharT, class _Traits>
1205int
1206basic_istream<_CharT, _Traits>::sync()
1207{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001208 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001209 int __r = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001210 sentry __sen(*this, true);
1211 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001212 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001213#ifndef _LIBCPP_NO_EXCEPTIONS
1214 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001215 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001216#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001217 if (this->rdbuf() == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001218 return -1;
1219 if (this->rdbuf()->pubsync() == -1)
1220 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001221 __state |= ios_base::badbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001222 return -1;
1223 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001224#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001225 }
1226 catch (...)
1227 {
1228 __state |= ios_base::badbit;
1229 this->__setstate_nothrow(__state);
1230 if (this->exceptions() & ios_base::badbit)
1231 {
1232 throw;
1233 }
1234 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001235#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001236 this->setstate(__state);
1237 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001238 return __r;
1239}
1240
1241template<class _CharT, class _Traits>
1242typename basic_istream<_CharT, _Traits>::pos_type
1243basic_istream<_CharT, _Traits>::tellg()
1244{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001245 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001246 pos_type __r(-1);
Louis Dionne94ee3a02019-04-05 16:33:37 +00001247 sentry __sen(*this, true);
1248 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001249 {
Louis Dionne4d23a302019-04-02 21:43:07 +00001250#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001251 try
1252 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001253#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001254 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1255#ifndef _LIBCPP_NO_EXCEPTIONS
1256 }
1257 catch (...)
1258 {
1259 __state |= ios_base::badbit;
1260 this->__setstate_nothrow(__state);
1261 if (this->exceptions() & ios_base::badbit)
1262 {
1263 throw;
1264 }
1265 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001266#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001267 this->setstate(__state);
1268 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001269 return __r;
1270}
1271
1272template<class _CharT, class _Traits>
1273basic_istream<_CharT, _Traits>&
1274basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1275{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001276 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1277 this->clear(__state);
1278 sentry __sen(*this, true);
1279 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001280 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001281#ifndef _LIBCPP_NO_EXCEPTIONS
1282 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001283 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001284#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001285 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1286 __state |= ios_base::failbit;
1287#ifndef _LIBCPP_NO_EXCEPTIONS
1288 }
1289 catch (...)
1290 {
1291 __state |= ios_base::badbit;
1292 this->__setstate_nothrow(__state);
1293 if (this->exceptions() & ios_base::badbit)
1294 {
1295 throw;
1296 }
1297 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001298#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001299 this->setstate(__state);
1300 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001301 return *this;
1302}
1303
1304template<class _CharT, class _Traits>
1305basic_istream<_CharT, _Traits>&
1306basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1307{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001308 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1309 this->clear(__state);
1310 sentry __sen(*this, true);
1311 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001312 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001313#ifndef _LIBCPP_NO_EXCEPTIONS
1314 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001315 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001316#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001317 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1318 __state |= ios_base::failbit;
1319#ifndef _LIBCPP_NO_EXCEPTIONS
1320 }
1321 catch (...)
1322 {
1323 __state |= ios_base::badbit;
1324 this->__setstate_nothrow(__state);
1325 if (this->exceptions() & ios_base::badbit)
1326 {
1327 throw;
1328 }
1329 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001330#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001331 this->setstate(__state);
1332 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001333 return *this;
1334}
1335
1336template <class _CharT, class _Traits>
1337basic_istream<_CharT, _Traits>&
1338ws(basic_istream<_CharT, _Traits>& __is)
1339{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001340 ios_base::iostate __state = ios_base::goodbit;
1341 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1342 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001343 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001344#ifndef _LIBCPP_NO_EXCEPTIONS
1345 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001346 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001347#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001348 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001349 while (true)
1350 {
1351 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1352 if (_Traits::eq_int_type(__i, _Traits::eof()))
1353 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001354 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001355 break;
1356 }
1357 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001358 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001359 __is.rdbuf()->sbumpc();
1360 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001361#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001362 }
1363 catch (...)
1364 {
1365 __state |= ios_base::badbit;
1366 __is.__setstate_nothrow(__state);
1367 if (__is.exceptions() & ios_base::badbit)
1368 {
1369 throw;
1370 }
1371 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001372#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001373 __is.setstate(__state);
1374 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001375 return __is;
1376}
1377
Eric Fiselier78ccf772017-04-18 23:38:41 +00001378#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001379
Louis Dionned9f73b12020-09-23 08:49:00 -04001380template <class _Stream, class _Tp, class = void>
1381struct __is_istreamable : false_type { };
1382
1383template <class _Stream, class _Tp>
1384struct __is_istreamable<_Stream, _Tp, decltype(
Arthur O'Dwyer3285c342021-05-10 13:04:16 -04001385 declval<_Stream>() >> declval<_Tp>(), void()
Louis Dionned9f73b12020-09-23 08:49:00 -04001386)> : true_type { };
1387
1388template <class _Stream, class _Tp, class = typename enable_if<
1389 _And<is_base_of<ios_base, _Stream>,
1390 __is_istreamable<_Stream&, _Tp&&>>::value
1391>::type>
1392_LIBCPP_INLINE_VISIBILITY
1393_Stream&& operator>>(_Stream&& __is, _Tp&& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001394{
Eric Fiselier7955ef62016-07-24 04:07:22 +00001395 __is >> _VSTD::forward<_Tp>(__x);
Louis Dionned9f73b12020-09-23 08:49:00 -04001396 return _VSTD::move(__is);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001397}
1398
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001399#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001400
1401template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001402class _LIBCPP_TEMPLATE_VIS basic_iostream
Howard Hinnantc51e1022010-05-11 19:42:16 +00001403 : public basic_istream<_CharT, _Traits>,
1404 public basic_ostream<_CharT, _Traits>
1405{
1406public:
1407 // types:
1408 typedef _CharT char_type;
1409 typedef _Traits traits_type;
1410 typedef typename traits_type::int_type int_type;
1411 typedef typename traits_type::pos_type pos_type;
1412 typedef typename traits_type::off_type off_type;
1413
1414 // constructor/destructor
Louis Dionneb4d05d72018-10-16 19:26:23 +00001415 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001416 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1417 : basic_istream<_CharT, _Traits>(__sb)
1418 {}
1419
Howard Hinnantc51e1022010-05-11 19:42:16 +00001420 virtual ~basic_iostream();
1421protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +00001422#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +00001423 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001424 basic_iostream(basic_iostream&& __rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001425
1426 // assign/swap
Eric Fiselier815ed732016-09-16 00:00:48 +00001427 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001428 basic_iostream& operator=(basic_iostream&& __rhs);
1429#endif
Louis Dionneb4d05d72018-10-16 19:26:23 +00001430 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001431 void swap(basic_iostream& __rhs)
1432 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001433};
1434
Eric Fiselier78ccf772017-04-18 23:38:41 +00001435#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001436
1437template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001438basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001439 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440{
1441}
1442
1443template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001444basic_iostream<_CharT, _Traits>&
1445basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1446{
1447 swap(__rhs);
1448 return *this;
1449}
1450
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001451#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001452
1453template <class _CharT, class _Traits>
1454basic_iostream<_CharT, _Traits>::~basic_iostream()
1455{
1456}
1457
Howard Hinnantc51e1022010-05-11 19:42:16 +00001458template<class _CharT, class _Traits, class _Allocator>
1459basic_istream<_CharT, _Traits>&
1460operator>>(basic_istream<_CharT, _Traits>& __is,
1461 basic_string<_CharT, _Traits, _Allocator>& __str)
1462{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001463 ios_base::iostate __state = ios_base::goodbit;
1464 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1465 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001466 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001467#ifndef _LIBCPP_NO_EXCEPTIONS
1468 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001469 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001470#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001471 __str.clear();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001472 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001473 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001474 __n = __str.max_size();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001475 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001476 __n = numeric_limits<streamsize>::max();
1477 streamsize __c = 0;
1478 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001479 while (__c < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001480 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001481 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1482 if (_Traits::eq_int_type(__i, _Traits::eof()))
1483 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001484 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001485 break;
1486 }
1487 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488 if (__ct.is(__ct.space, __ch))
1489 break;
1490 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001491 ++__c;
1492 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001493 }
1494 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001495 if (__c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001496 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001497#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001498 }
1499 catch (...)
1500 {
1501 __state |= ios_base::badbit;
1502 __is.__setstate_nothrow(__state);
1503 if (__is.exceptions() & ios_base::badbit)
1504 {
1505 throw;
1506 }
1507 }
1508#endif
1509 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001510 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001511 return __is;
1512}
1513
1514template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001515basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001516getline(basic_istream<_CharT, _Traits>& __is,
1517 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1518{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001519 ios_base::iostate __state = ios_base::goodbit;
1520 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1521 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001522 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001523#ifndef _LIBCPP_NO_EXCEPTIONS
1524 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001525 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001526#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001527 __str.clear();
Howard Hinnante992f762011-10-09 15:20:46 +00001528 streamsize __extr = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001529 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001530 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001531 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1532 if (_Traits::eq_int_type(__i, _Traits::eof()))
1533 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001534 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001535 break;
1536 }
Howard Hinnante992f762011-10-09 15:20:46 +00001537 ++__extr;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001538 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001539 if (_Traits::eq(__ch, __dlm))
1540 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001541 __str.push_back(__ch);
1542 if (__str.size() == __str.max_size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001543 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001544 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545 break;
1546 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547 }
Howard Hinnante992f762011-10-09 15:20:46 +00001548 if (__extr == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001549 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001550#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001551 }
1552 catch (...)
1553 {
1554 __state |= ios_base::badbit;
1555 __is.__setstate_nothrow(__state);
1556 if (__is.exceptions() & ios_base::badbit)
1557 {
1558 throw;
1559 }
1560 }
1561#endif
1562 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001563 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001564 return __is;
1565}
1566
1567template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001568inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001569basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001570getline(basic_istream<_CharT, _Traits>& __is,
1571 basic_string<_CharT, _Traits, _Allocator>& __str)
1572{
1573 return getline(__is, __str, __is.widen('\n'));
1574}
1575
Eric Fiselier78ccf772017-04-18 23:38:41 +00001576#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001577
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, _CharT __dlm)
1583{
1584 return getline(__is, __str, __dlm);
1585}
1586
1587template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001588inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001589basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001590getline(basic_istream<_CharT, _Traits>&& __is,
1591 basic_string<_CharT, _Traits, _Allocator>& __str)
1592{
1593 return getline(__is, __str, __is.widen('\n'));
1594}
1595
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001596#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001597
1598template <class _CharT, class _Traits, size_t _Size>
1599basic_istream<_CharT, _Traits>&
1600operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1601{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001602 ios_base::iostate __state = ios_base::goodbit;
1603 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1604 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001605 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001606#ifndef _LIBCPP_NO_EXCEPTIONS
1607 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001608 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001609#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001610 basic_string<_CharT, _Traits> __str;
1611 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier37c22152016-12-24 00:24:44 +00001612 size_t __c = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001613 _CharT __zero = __ct.widen('0');
1614 _CharT __one = __ct.widen('1');
Howard Hinnante51e4e92011-09-01 21:02:45 +00001615 while (__c < _Size)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001616 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001617 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1618 if (_Traits::eq_int_type(__i, _Traits::eof()))
1619 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001620 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001621 break;
1622 }
1623 _CharT __ch = _Traits::to_char_type(__i);
1624 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001625 break;
1626 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001627 ++__c;
1628 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001629 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001630 __x = bitset<_Size>(__str);
Louis Dionne82079002019-08-20 18:21:06 +00001631 if (_Size > 0 && __c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001632 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001633#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001634 }
1635 catch (...)
1636 {
1637 __state |= ios_base::badbit;
1638 __is.__setstate_nothrow(__state);
1639 if (__is.exceptions() & ios_base::badbit)
1640 {
1641 throw;
1642 }
1643 }
1644#endif
1645 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001647 return __is;
1648}
1649
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001650_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1651_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1652_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001653
1654_LIBCPP_END_NAMESPACE_STD
1655
Eric Fiselierf4433a32017-05-31 22:07:49 +00001656_LIBCPP_POP_MACROS
1657
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001658#endif // _LIBCPP_ISTREAM