blob: 531280719b30e6b3044ba2ce0fbf37caf9b7ff08 [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>
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)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000167#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 Fiselier78ccf772017-04-18 23:38:41 +0000195#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +0000196 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197 basic_istream(basic_istream&& __rhs);
Eric Fiselier78ccf772017-04-18 23:38:41 +0000198
Howard Hinnantc51e1022010-05-11 19:42:16 +0000199 // 27.7.1.1.2 Assign/swap:
Eric Fiselier815ed732016-09-16 00:00:48 +0000200 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000201 basic_istream& operator=(basic_istream&& __rhs);
202#endif
Eric Fiselier815ed732016-09-16 00:00:48 +0000203
Louis Dionneb4d05d72018-10-16 19:26:23 +0000204 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000205 void swap(basic_istream& __rhs) {
206 _VSTD::swap(__gc_, __rhs.__gc_);
207 basic_ios<char_type, traits_type>::swap(__rhs);
208 }
Marshall Clow27d29872014-09-16 15:27:01 +0000209
Eric Fiselier2d8515f2017-01-06 20:58:25 +0000210#ifndef _LIBCPP_CXX03_LANG
Marshall Clow242d9c12014-09-16 15:33:53 +0000211 basic_istream (const basic_istream& __rhs) = delete;
212 basic_istream& operator=(const basic_istream& __rhs) = delete;
Marshall Clow27d29872014-09-16 15:27:01 +0000213#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000214public:
215
216 // 27.7.1.1.3 Prefix/suffix:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000217 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000218
219 // 27.7.1.2 Formatted input:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000220 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000221 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
222 { return __pf(*this); }
223
Louis Dionneb4d05d72018-10-16 19:26:23 +0000224 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000225 basic_istream& operator>>(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000226 (*__pf)(basic_ios<char_type, traits_type>&))
227 { __pf(*this); return *this; }
228
Louis Dionneb4d05d72018-10-16 19:26:23 +0000229 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000230 basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
231 { __pf(*this); return *this; }
232
Howard Hinnantc51e1022010-05-11 19:42:16 +0000233 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
234 basic_istream& operator>>(bool& __n);
235 basic_istream& operator>>(short& __n);
236 basic_istream& operator>>(unsigned short& __n);
237 basic_istream& operator>>(int& __n);
238 basic_istream& operator>>(unsigned int& __n);
239 basic_istream& operator>>(long& __n);
240 basic_istream& operator>>(unsigned long& __n);
241 basic_istream& operator>>(long long& __n);
242 basic_istream& operator>>(unsigned long long& __n);
243 basic_istream& operator>>(float& __f);
244 basic_istream& operator>>(double& __f);
245 basic_istream& operator>>(long double& __f);
246 basic_istream& operator>>(void*& __p);
247
248 // 27.7.1.3 Unformatted input:
Howard Hinnant64da2602010-09-22 15:29:08 +0000249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000250 streamsize gcount() const {return __gc_;}
251 int_type get();
Eric Fiselier815ed732016-09-16 00:00:48 +0000252
Louis Dionneb4d05d72018-10-16 19:26:23 +0000253 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000254 basic_istream& get(char_type& __c) {
255 int_type __ch = get();
256 if (__ch != traits_type::eof())
257 __c = traits_type::to_char_type(__ch);
258 return *this;
259 }
260
Louis Dionneb4d05d72018-10-16 19:26:23 +0000261 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000262 basic_istream& get(char_type* __s, streamsize __n)
263 { return get(__s, __n, this->widen('\n')); }
264
Howard Hinnantc51e1022010-05-11 19:42:16 +0000265 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
Eric Fiselier815ed732016-09-16 00:00:48 +0000266
Louis Dionneb4d05d72018-10-16 19:26:23 +0000267 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000268 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
269 { return get(__sb, this->widen('\n')); }
270
Howard Hinnantc51e1022010-05-11 19:42:16 +0000271 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
272
Louis Dionneb4d05d72018-10-16 19:26:23 +0000273 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000274 basic_istream& getline(char_type* __s, streamsize __n)
275 { return getline(__s, __n, this->widen('\n')); }
276
Howard Hinnantc51e1022010-05-11 19:42:16 +0000277 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
278
279 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
280 int_type peek();
281 basic_istream& read (char_type* __s, streamsize __n);
282 streamsize readsome(char_type* __s, streamsize __n);
283
284 basic_istream& putback(char_type __c);
285 basic_istream& unget();
286 int sync();
287
288 pos_type tellg();
289 basic_istream& seekg(pos_type __pos);
290 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
291};
292
293template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000294class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000295{
296 bool __ok_;
297
298 sentry(const sentry&); // = delete;
299 sentry& operator=(const sentry&); // = delete;
300
301public:
302 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
303// ~sentry() = default;
304
Howard Hinnant64da2602010-09-22 15:29:08 +0000305 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer6c9c9a72021-06-15 12:57:54 -0400306 explicit operator bool() const {return __ok_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000307};
308
309template <class _CharT, class _Traits>
310basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
311 bool __noskipws)
312 : __ok_(false)
313{
314 if (__is.good())
315 {
316 if (__is.tie())
317 __is.tie()->flush();
318 if (!__noskipws && (__is.flags() & ios_base::skipws))
319 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000320 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantc834c512011-11-29 18:15:50 +0000322 _Ip __i(__is);
323 _Ip __eof;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 for (; __i != __eof; ++__i)
325 if (!__ct.is(__ct.space, *__i))
326 break;
327 if (__i == __eof)
328 __is.setstate(ios_base::failbit | ios_base::eofbit);
329 }
330 __ok_ = __is.good();
331 }
332 else
333 __is.setstate(ios_base::failbit);
334}
335
Eric Fiselier78ccf772017-04-18 23:38:41 +0000336#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337
338template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
340 : __gc_(__rhs.__gc_)
341{
342 __rhs.__gc_ = 0;
343 this->move(__rhs);
344}
345
346template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000347basic_istream<_CharT, _Traits>&
348basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
349{
350 swap(__rhs);
351 return *this;
352}
353
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400354#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355
356template <class _CharT, class _Traits>
357basic_istream<_CharT, _Traits>::~basic_istream()
358{
359}
360
Louis Dionne8ea66082018-07-25 19:40:01 +0000361template <class _Tp, class _CharT, class _Traits>
362_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363basic_istream<_CharT, _Traits>&
Louis Dionne8ea66082018-07-25 19:40:01 +0000364__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000365 ios_base::iostate __state = ios_base::goodbit;
366 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
367 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000368 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000369#ifndef _LIBCPP_NO_EXCEPTIONS
370 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000371 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400372#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000373 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
374 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000375 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000377 }
378 catch (...)
379 {
380 __state |= ios_base::badbit;
381 __is.__setstate_nothrow(__state);
382 if (__is.exceptions() & ios_base::badbit)
383 {
384 throw;
385 }
386 }
387#endif
388 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000390 return __is;
391}
392
393template <class _CharT, class _Traits>
394basic_istream<_CharT, _Traits>&
395basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
396{
397 return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398}
399
400template <class _CharT, class _Traits>
401basic_istream<_CharT, _Traits>&
402basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
403{
Louis Dionne8ea66082018-07-25 19:40:01 +0000404 return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405}
406
407template <class _CharT, class _Traits>
408basic_istream<_CharT, _Traits>&
409basic_istream<_CharT, _Traits>::operator>>(long& __n)
410{
Louis Dionne8ea66082018-07-25 19:40:01 +0000411 return _VSTD::__input_arithmetic<long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412}
413
414template <class _CharT, class _Traits>
415basic_istream<_CharT, _Traits>&
416basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
417{
Louis Dionne8ea66082018-07-25 19:40:01 +0000418 return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419}
420
421template <class _CharT, class _Traits>
422basic_istream<_CharT, _Traits>&
423basic_istream<_CharT, _Traits>::operator>>(long long& __n)
424{
Louis Dionne8ea66082018-07-25 19:40:01 +0000425 return _VSTD::__input_arithmetic<long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426}
427
428template <class _CharT, class _Traits>
429basic_istream<_CharT, _Traits>&
430basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
431{
Louis Dionne8ea66082018-07-25 19:40:01 +0000432 return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433}
434
435template <class _CharT, class _Traits>
436basic_istream<_CharT, _Traits>&
437basic_istream<_CharT, _Traits>::operator>>(float& __n)
438{
Louis Dionne8ea66082018-07-25 19:40:01 +0000439 return _VSTD::__input_arithmetic<float>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440}
441
442template <class _CharT, class _Traits>
443basic_istream<_CharT, _Traits>&
444basic_istream<_CharT, _Traits>::operator>>(double& __n)
445{
Louis Dionne8ea66082018-07-25 19:40:01 +0000446 return _VSTD::__input_arithmetic<double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000447}
448
449template <class _CharT, class _Traits>
450basic_istream<_CharT, _Traits>&
451basic_istream<_CharT, _Traits>::operator>>(long double& __n)
452{
Louis Dionne8ea66082018-07-25 19:40:01 +0000453 return _VSTD::__input_arithmetic<long double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454}
455
456template <class _CharT, class _Traits>
457basic_istream<_CharT, _Traits>&
458basic_istream<_CharT, _Traits>::operator>>(bool& __n)
459{
Louis Dionne8ea66082018-07-25 19:40:01 +0000460 return _VSTD::__input_arithmetic<bool>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461}
462
463template <class _CharT, class _Traits>
464basic_istream<_CharT, _Traits>&
465basic_istream<_CharT, _Traits>::operator>>(void*& __n)
466{
Louis Dionne8ea66082018-07-25 19:40:01 +0000467 return _VSTD::__input_arithmetic<void*>(*this, __n);
468}
469
470template <class _Tp, class _CharT, class _Traits>
471_LIBCPP_INLINE_VISIBILITY
472basic_istream<_CharT, _Traits>&
473__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000474 ios_base::iostate __state = ios_base::goodbit;
475 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
476 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000477 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000478#ifndef _LIBCPP_NO_EXCEPTIONS
479 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000480 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400481#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000482 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
483 typedef num_get<_CharT, _Ip> _Fp;
Louis Dionne8ea66082018-07-25 19:40:01 +0000484 long __temp;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000485 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp);
Louis Dionne8ea66082018-07-25 19:40:01 +0000486 if (__temp < numeric_limits<_Tp>::min())
487 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000488 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000489 __n = numeric_limits<_Tp>::min();
490 }
491 else if (__temp > numeric_limits<_Tp>::max())
492 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000493 __state |= ios_base::failbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000494 __n = numeric_limits<_Tp>::max();
495 }
496 else
Louis Dionne94ee3a02019-04-05 16:33:37 +0000497 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000498 __n = static_cast<_Tp>(__temp);
Louis Dionne94ee3a02019-04-05 16:33:37 +0000499 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000501 }
502 catch (...)
503 {
504 __state |= ios_base::badbit;
505 __is.__setstate_nothrow(__state);
506 if (__is.exceptions() & ios_base::badbit)
507 {
508 throw;
509 }
510 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400511#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000512 __is.setstate(__state);
513 }
Louis Dionne8ea66082018-07-25 19:40:01 +0000514 return __is;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515}
516
517template <class _CharT, class _Traits>
518basic_istream<_CharT, _Traits>&
519basic_istream<_CharT, _Traits>::operator>>(short& __n)
520{
Louis Dionne8ea66082018-07-25 19:40:01 +0000521 return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522}
523
524template <class _CharT, class _Traits>
525basic_istream<_CharT, _Traits>&
526basic_istream<_CharT, _Traits>::operator>>(int& __n)
527{
Louis Dionne8ea66082018-07-25 19:40:01 +0000528 return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529}
530
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531template<class _CharT, class _Traits>
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000532_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533basic_istream<_CharT, _Traits>&
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000534__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000536 ios_base::iostate __state = ios_base::goodbit;
537 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
538 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000539 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000540#ifndef _LIBCPP_NO_EXCEPTIONS
541 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000543#endif
Louis Dionne54f50752019-04-02 19:20:47 +0000544 _CharT* __s = __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000546 while (__s != __p + (__n-1))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000548 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
549 if (_Traits::eq_int_type(__i, _Traits::eof()))
550 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000551 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000552 break;
553 }
554 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555 if (__ct.is(__ct.space, __ch))
556 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000557 *__s++ = __ch;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000558 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000559 }
560 *__s = _CharT();
561 __is.width(0);
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000562 if (__s == __p)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000563 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000564#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000565 }
566 catch (...)
567 {
568 __state |= ios_base::badbit;
569 __is.__setstate_nothrow(__state);
570 if (__is.exceptions() & ios_base::badbit)
571 {
572 throw;
573 }
574 }
575#endif
576 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578 return __is;
579}
580
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000581#if _LIBCPP_STD_VER > 17
582
583template<class _CharT, class _Traits, size_t _Np>
584inline _LIBCPP_INLINE_VISIBILITY
585basic_istream<_CharT, _Traits>&
586operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
587{
Louis Dionne54f50752019-04-02 19:20:47 +0000588 size_t __n = _Np;
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000589 if (__is.width() > 0)
590 __n = _VSTD::min(size_t(__is.width()), _Np);
591 return _VSTD::__input_c_string(__is, __buf, __n);
592}
593
594template<class _Traits, size_t _Np>
595inline _LIBCPP_INLINE_VISIBILITY
596basic_istream<char, _Traits>&
597operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
598{
599 return __is >> (char(&)[_Np])__buf;
600}
601
602template<class _Traits, size_t _Np>
603inline _LIBCPP_INLINE_VISIBILITY
604basic_istream<char, _Traits>&
605operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
606{
607 return __is >> (char(&)[_Np])__buf;
608}
609
610#else
611
612template<class _CharT, class _Traits>
613inline _LIBCPP_INLINE_VISIBILITY
614basic_istream<_CharT, _Traits>&
615operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
616{
617 streamsize __n = __is.width();
618 if (__n <= 0)
619 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
620 return _VSTD::__input_c_string(__is, __s, size_t(__n));
621}
622
Howard Hinnantc51e1022010-05-11 19:42:16 +0000623template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000624inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000625basic_istream<char, _Traits>&
626operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
627{
628 return __is >> (char*)__s;
629}
630
631template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000632inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000633basic_istream<char, _Traits>&
634operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
635{
636 return __is >> (char*)__s;
637}
638
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400639#endif // _LIBCPP_STD_VER > 17
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000640
Howard Hinnantc51e1022010-05-11 19:42:16 +0000641template<class _CharT, class _Traits>
642basic_istream<_CharT, _Traits>&
643operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
644{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000645 ios_base::iostate __state = ios_base::goodbit;
646 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
647 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000648 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000649#ifndef _LIBCPP_NO_EXCEPTIONS
650 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000651 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000652#endif
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000653 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
654 if (_Traits::eq_int_type(__i, _Traits::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000655 __state |= ios_base::eofbit | ios_base::failbit;
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000656 else
657 __c = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000658#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000659 }
660 catch (...)
661 {
662 __state |= ios_base::badbit;
663 __is.__setstate_nothrow(__state);
664 if (__is.exceptions() & ios_base::badbit)
665 {
666 throw;
667 }
668 }
669#endif
670 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000671 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000672 return __is;
673}
674
675template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000676inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000677basic_istream<char, _Traits>&
678operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
679{
680 return __is >> (char&)__c;
681}
682
683template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000684inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000685basic_istream<char, _Traits>&
686operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
687{
688 return __is >> (char&)__c;
689}
690
691template<class _CharT, class _Traits>
692basic_istream<_CharT, _Traits>&
693basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
694{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000695 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000696 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000697 sentry __s(*this, true);
698 if (__s)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000699 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000700 if (__sb)
Louis Dionne4d23a302019-04-02 21:43:07 +0000701 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000702#ifndef _LIBCPP_NO_EXCEPTIONS
703 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000704 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000705#endif // _LIBCPP_NO_EXCEPTIONS
706 while (true)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000707 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000708 typename traits_type::int_type __i = this->rdbuf()->sgetc();
709 if (traits_type::eq_int_type(__i, _Traits::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000710 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000711 __state |= ios_base::eofbit;
712 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000713 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000714 if (traits_type::eq_int_type(
715 __sb->sputc(traits_type::to_char_type(__i)),
716 traits_type::eof()))
717 break;
718 ++__gc_;
719 this->rdbuf()->sbumpc();
720 }
721 if (__gc_ == 0)
722 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000723#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000724 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000725 catch (...)
726 {
727 __state |= ios_base::badbit;
728 if (__gc_ == 0)
729 __state |= ios_base::failbit;
730
731 this->__setstate_nothrow(__state);
732 if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit)
733 {
734 throw;
735 }
736 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400737#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000738 }
739 else
740 {
741 __state |= ios_base::failbit;
742 }
743 this->setstate(__state);
744 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000745 return *this;
746}
747
748template<class _CharT, class _Traits>
749typename basic_istream<_CharT, _Traits>::int_type
750basic_istream<_CharT, _Traits>::get()
751{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000752 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000753 __gc_ = 0;
754 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000755 sentry __s(*this, true);
756 if (__s)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000757 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000758#ifndef _LIBCPP_NO_EXCEPTIONS
759 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000761#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000762 __r = this->rdbuf()->sbumpc();
763 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +0000764 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000765 else
Howard Hinnante51e4e92011-09-01 21:02:45 +0000766 __gc_ = 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000768 }
769 catch (...)
770 {
771 this->__setstate_nothrow(this->rdstate() | ios_base::badbit);
772 if (this->exceptions() & ios_base::badbit)
773 {
774 throw;
775 }
776 }
777#endif
778 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000779 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000780 return __r;
781}
782
783template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000784basic_istream<_CharT, _Traits>&
785basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
786{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000787 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000788 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000789 sentry __sen(*this, true);
790 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000791 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000792 if (__n > 0)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000793 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000794#ifndef _LIBCPP_NO_EXCEPTIONS
795 try
Howard Hinnantc51e1022010-05-11 19:42:16 +0000796 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000797#endif
Howard Hinnante51e4e92011-09-01 21:02:45 +0000798 while (__gc_ < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000799 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000800 int_type __i = this->rdbuf()->sgetc();
801 if (traits_type::eq_int_type(__i, traits_type::eof()))
802 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000803 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000804 break;
805 }
806 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807 if (traits_type::eq(__ch, __dlm))
808 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000809 *__s++ = __ch;
810 ++__gc_;
811 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000812 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000813 if (__gc_ == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +0000814 __state |= ios_base::failbit;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000815#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000816 }
817 catch (...)
818 {
819 __state |= ios_base::badbit;
820 this->__setstate_nothrow(__state);
821 if (this->exceptions() & ios_base::badbit)
822 {
823 if (__n > 0)
824 *__s = char_type();
825 throw;
826 }
827 }
828#endif
829 }
830 else
831 {
832 __state |= ios_base::failbit;
833 }
834
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000835 if (__n > 0)
836 *__s = char_type();
Louis Dionne94ee3a02019-04-05 16:33:37 +0000837 this->setstate(__state);
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000838 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000839 if (__n > 0)
840 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000841 return *this;
842}
843
844template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000845basic_istream<_CharT, _Traits>&
846basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
847 char_type __dlm)
848{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000849 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000850 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000851 sentry __sen(*this, true);
852 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000853 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000854#ifndef _LIBCPP_NO_EXCEPTIONS
855 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000856 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400857#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000858 while (true)
859 {
860 typename traits_type::int_type __i = this->rdbuf()->sgetc();
861 if (traits_type::eq_int_type(__i, traits_type::eof()))
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000862 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000863 __state |= ios_base::eofbit;
864 break;
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000865 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000866 char_type __ch = traits_type::to_char_type(__i);
867 if (traits_type::eq(__ch, __dlm))
868 break;
869 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
870 break;
871 ++__gc_;
872 this->rdbuf()->sbumpc();
873 }
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000874#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000875 }
Louis Dionne94ee3a02019-04-05 16:33:37 +0000876 catch (...)
877 {
878 __state |= ios_base::badbit;
879 // according to the spec, exceptions here are caught but not rethrown
880 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400881#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000882 if (__gc_ == 0)
883 __state |= ios_base::failbit;
884 this->setstate(__state);
885 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 return *this;
887}
888
889template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000890basic_istream<_CharT, _Traits>&
891basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
892{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000893 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000895 sentry __sen(*this, true);
896 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000897 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000898#ifndef _LIBCPP_NO_EXCEPTIONS
899 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000900 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400901#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000902 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000903 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000904 typename traits_type::int_type __i = this->rdbuf()->sgetc();
905 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000906 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000907 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000908 break;
909 }
910 char_type __ch = traits_type::to_char_type(__i);
911 if (traits_type::eq(__ch, __dlm))
912 {
913 this->rdbuf()->sbumpc();
914 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915 break;
916 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000917 if (__gc_ >= __n-1)
918 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000919 __state |= ios_base::failbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000920 break;
921 }
922 *__s++ = __ch;
923 this->rdbuf()->sbumpc();
924 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000925 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000926#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000927 }
928 catch (...)
929 {
930 __state |= ios_base::badbit;
931 this->__setstate_nothrow(__state);
932 if (this->exceptions() & ios_base::badbit)
933 {
934 if (__n > 0)
935 *__s = char_type();
936 if (__gc_ == 0)
937 __state |= ios_base::failbit;
938 throw;
939 }
940 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400941#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000942 }
943 if (__n > 0)
944 *__s = char_type();
945 if (__gc_ == 0)
946 __state |= ios_base::failbit;
947 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000948 return *this;
949}
950
951template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000952basic_istream<_CharT, _Traits>&
953basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
954{
Louis Dionne94ee3a02019-04-05 16:33:37 +0000955 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000956 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +0000957 sentry __sen(*this, true);
958 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000959 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000960#ifndef _LIBCPP_NO_EXCEPTIONS
961 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +0000962 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400963#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000964 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantc51e1022010-05-11 19:42:16 +0000965 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000966 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000967 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000968 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
969 if (traits_type::eq_int_type(__i, traits_type::eof()))
970 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000971 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000972 break;
973 }
974 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000975 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000976 break;
977 }
978 }
979 else
980 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000981 while (__gc_ < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000982 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000983 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
984 if (traits_type::eq_int_type(__i, traits_type::eof()))
985 {
Louis Dionne94ee3a02019-04-05 16:33:37 +0000986 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000987 break;
988 }
989 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000990 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000991 break;
992 }
993 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000994#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +0000995 }
996 catch (...)
997 {
998 __state |= ios_base::badbit;
999 this->__setstate_nothrow(__state);
1000 if (this->exceptions() & ios_base::badbit)
1001 {
1002 throw;
1003 }
1004 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001005#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001006 this->setstate(__state);
1007 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001008 return *this;
1009}
1010
1011template<class _CharT, class _Traits>
1012typename basic_istream<_CharT, _Traits>::int_type
1013basic_istream<_CharT, _Traits>::peek()
1014{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001015 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001016 __gc_ = 0;
1017 int_type __r = traits_type::eof();
Louis Dionne94ee3a02019-04-05 16:33:37 +00001018 sentry __sen(*this, true);
1019 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001020 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001021#ifndef _LIBCPP_NO_EXCEPTIONS
1022 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001023 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001024#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001025 __r = this->rdbuf()->sgetc();
Howard Hinnanta4427372012-11-01 17:32:07 +00001026 if (traits_type::eq_int_type(__r, traits_type::eof()))
Louis Dionne94ee3a02019-04-05 16:33:37 +00001027 __state |= ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001028#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001029 }
1030 catch (...)
1031 {
1032 __state |= ios_base::badbit;
1033 this->__setstate_nothrow(__state);
1034 if (this->exceptions() & ios_base::badbit)
1035 {
1036 throw;
1037 }
1038 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001039#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001040 this->setstate(__state);
1041 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042 return __r;
1043}
1044
1045template<class _CharT, class _Traits>
1046basic_istream<_CharT, _Traits>&
1047basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1048{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001049 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001051 sentry __sen(*this, true);
1052 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001053 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001054#ifndef _LIBCPP_NO_EXCEPTIONS
1055 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001056 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001057#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant232466c2013-03-06 19:27:56 +00001058 __gc_ = this->rdbuf()->sgetn(__s, __n);
1059 if (__gc_ != __n)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001060 __state |= ios_base::failbit | ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001061#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001062 }
1063 catch (...)
1064 {
1065 __state |= ios_base::badbit;
1066 this->__setstate_nothrow(__state);
1067 if (this->exceptions() & ios_base::badbit)
1068 {
1069 throw;
1070 }
1071 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001072#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001073 }
1074 else
1075 {
1076 __state |= ios_base::failbit;
1077 }
1078 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079 return *this;
1080}
1081
1082template<class _CharT, class _Traits>
1083streamsize
1084basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1085{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001086 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantaf8555c2012-12-20 15:40:28 +00001087 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001088 sentry __sen(*this, true);
1089 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001090 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001091#ifndef _LIBCPP_NO_EXCEPTIONS
1092 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001093 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001094#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clow1c6e3862016-07-13 16:58:48 +00001095 streamsize __c = this->rdbuf()->in_avail();
1096 switch (__c)
1097 {
1098 case -1:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001099 __state |= ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001100 break;
1101 case 0:
1102 break;
1103 default:
Louis Dionne94ee3a02019-04-05 16:33:37 +00001104 __n = _VSTD::min(__c, __n);
1105 __gc_ = this->rdbuf()->sgetn(__s, __n);
1106 if (__gc_ != __n)
1107 __state |= ios_base::failbit | ios_base::eofbit;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001108 break;
1109 }
Marshall Clow1c6e3862016-07-13 16:58:48 +00001110#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001111 }
1112 catch (...)
1113 {
1114 __state |= ios_base::badbit;
1115 this->__setstate_nothrow(__state);
1116 if (this->exceptions() & ios_base::badbit)
1117 {
1118 throw;
1119 }
1120 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001121#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001122 }
1123 else
1124 {
1125 __state |= ios_base::failbit;
1126 }
1127 this->setstate(__state);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001128 return __gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001129}
1130
1131template<class _CharT, class _Traits>
1132basic_istream<_CharT, _Traits>&
1133basic_istream<_CharT, _Traits>::putback(char_type __c)
1134{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001135 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001136 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001137 this->clear(__state);
1138 sentry __sen(*this, true);
1139 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001140 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001141#ifndef _LIBCPP_NO_EXCEPTIONS
1142 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001143 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001144#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001145 if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof())
Louis Dionne94ee3a02019-04-05 16:33:37 +00001146 __state |= ios_base::badbit;
1147#ifndef _LIBCPP_NO_EXCEPTIONS
1148 }
1149 catch (...)
1150 {
1151 __state |= ios_base::badbit;
1152 this->__setstate_nothrow(__state);
1153 if (this->exceptions() & ios_base::badbit)
1154 {
1155 throw;
1156 }
1157 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001158#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001159 }
1160 else
1161 {
1162 __state |= ios_base::failbit;
1163 }
1164 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 return *this;
1166}
1167
1168template<class _CharT, class _Traits>
1169basic_istream<_CharT, _Traits>&
1170basic_istream<_CharT, _Traits>::unget()
1171{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001172 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001173 __gc_ = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001174 this->clear(__state);
1175 sentry __sen(*this, true);
1176 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001177 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001178#ifndef _LIBCPP_NO_EXCEPTIONS
1179 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001180 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001181#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001182 if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof())
Louis Dionne94ee3a02019-04-05 16:33:37 +00001183 __state |= ios_base::badbit;
1184#ifndef _LIBCPP_NO_EXCEPTIONS
1185 }
1186 catch (...)
1187 {
1188 __state |= ios_base::badbit;
1189 this->__setstate_nothrow(__state);
1190 if (this->exceptions() & ios_base::badbit)
1191 {
1192 throw;
1193 }
1194 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001195#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001196 }
1197 else
1198 {
1199 __state |= ios_base::failbit;
1200 }
1201 this->setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001202 return *this;
1203}
1204
1205template<class _CharT, class _Traits>
1206int
1207basic_istream<_CharT, _Traits>::sync()
1208{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001209 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001210 int __r = 0;
Louis Dionne94ee3a02019-04-05 16:33:37 +00001211 sentry __sen(*this, true);
1212 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001213 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001214#ifndef _LIBCPP_NO_EXCEPTIONS
1215 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001216 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001217#endif // _LIBCPP_NO_EXCEPTIONS
Bruce Mitchener170d8972020-11-24 12:53:53 -05001218 if (this->rdbuf() == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001219 return -1;
1220 if (this->rdbuf()->pubsync() == -1)
1221 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001222 __state |= ios_base::badbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223 return -1;
1224 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001225#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001226 }
1227 catch (...)
1228 {
1229 __state |= ios_base::badbit;
1230 this->__setstate_nothrow(__state);
1231 if (this->exceptions() & ios_base::badbit)
1232 {
1233 throw;
1234 }
1235 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001236#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001237 this->setstate(__state);
1238 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001239 return __r;
1240}
1241
1242template<class _CharT, class _Traits>
1243typename basic_istream<_CharT, _Traits>::pos_type
1244basic_istream<_CharT, _Traits>::tellg()
1245{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001246 ios_base::iostate __state = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001247 pos_type __r(-1);
Louis Dionne94ee3a02019-04-05 16:33:37 +00001248 sentry __sen(*this, true);
1249 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001250 {
Louis Dionne4d23a302019-04-02 21:43:07 +00001251#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001252 try
1253 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001254#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001255 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1256#ifndef _LIBCPP_NO_EXCEPTIONS
1257 }
1258 catch (...)
1259 {
1260 __state |= ios_base::badbit;
1261 this->__setstate_nothrow(__state);
1262 if (this->exceptions() & ios_base::badbit)
1263 {
1264 throw;
1265 }
1266 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001267#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001268 this->setstate(__state);
1269 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001270 return __r;
1271}
1272
1273template<class _CharT, class _Traits>
1274basic_istream<_CharT, _Traits>&
1275basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1276{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001277 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1278 this->clear(__state);
1279 sentry __sen(*this, true);
1280 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001281 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001282#ifndef _LIBCPP_NO_EXCEPTIONS
1283 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001284 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001285#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001286 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1287 __state |= ios_base::failbit;
1288#ifndef _LIBCPP_NO_EXCEPTIONS
1289 }
1290 catch (...)
1291 {
1292 __state |= ios_base::badbit;
1293 this->__setstate_nothrow(__state);
1294 if (this->exceptions() & ios_base::badbit)
1295 {
1296 throw;
1297 }
1298 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001299#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001300 this->setstate(__state);
1301 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001302 return *this;
1303}
1304
1305template<class _CharT, class _Traits>
1306basic_istream<_CharT, _Traits>&
1307basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1308{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001309 ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit;
1310 this->clear(__state);
1311 sentry __sen(*this, true);
1312 if (__sen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001313 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001314#ifndef _LIBCPP_NO_EXCEPTIONS
1315 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001316 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001317#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001318 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1319 __state |= ios_base::failbit;
1320#ifndef _LIBCPP_NO_EXCEPTIONS
1321 }
1322 catch (...)
1323 {
1324 __state |= ios_base::badbit;
1325 this->__setstate_nothrow(__state);
1326 if (this->exceptions() & ios_base::badbit)
1327 {
1328 throw;
1329 }
1330 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001331#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001332 this->setstate(__state);
1333 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334 return *this;
1335}
1336
1337template <class _CharT, class _Traits>
1338basic_istream<_CharT, _Traits>&
1339ws(basic_istream<_CharT, _Traits>& __is)
1340{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001341 ios_base::iostate __state = ios_base::goodbit;
1342 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1343 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001344 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001345#ifndef _LIBCPP_NO_EXCEPTIONS
1346 try
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001347 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001348#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001349 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001350 while (true)
1351 {
1352 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1353 if (_Traits::eq_int_type(__i, _Traits::eof()))
1354 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001355 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001356 break;
1357 }
1358 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001359 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001360 __is.rdbuf()->sbumpc();
1361 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001362#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001363 }
1364 catch (...)
1365 {
1366 __state |= ios_base::badbit;
1367 __is.__setstate_nothrow(__state);
1368 if (__is.exceptions() & ios_base::badbit)
1369 {
1370 throw;
1371 }
1372 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001373#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001374 __is.setstate(__state);
1375 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001376 return __is;
1377}
1378
Louis Dionned9f73b12020-09-23 08:49:00 -04001379template <class _Stream, class _Tp, class = void>
1380struct __is_istreamable : false_type { };
1381
1382template <class _Stream, class _Tp>
1383struct __is_istreamable<_Stream, _Tp, decltype(
Arthur O'Dwyer3285c342021-05-10 13:04:16 -04001384 declval<_Stream>() >> declval<_Tp>(), void()
Louis Dionned9f73b12020-09-23 08:49:00 -04001385)> : true_type { };
1386
1387template <class _Stream, class _Tp, class = typename enable_if<
1388 _And<is_base_of<ios_base, _Stream>,
Arthur O'Dwyer46d358c2021-06-15 12:57:05 -04001389 __is_istreamable<_Stream&, _Tp&&> >::value
Louis Dionned9f73b12020-09-23 08:49:00 -04001390>::type>
1391_LIBCPP_INLINE_VISIBILITY
1392_Stream&& operator>>(_Stream&& __is, _Tp&& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001393{
Eric Fiselier7955ef62016-07-24 04:07:22 +00001394 __is >> _VSTD::forward<_Tp>(__x);
Louis Dionned9f73b12020-09-23 08:49:00 -04001395 return _VSTD::move(__is);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001396}
1397
Howard Hinnantc51e1022010-05-11 19:42:16 +00001398template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001399class _LIBCPP_TEMPLATE_VIS basic_iostream
Howard Hinnantc51e1022010-05-11 19:42:16 +00001400 : public basic_istream<_CharT, _Traits>,
1401 public basic_ostream<_CharT, _Traits>
1402{
1403public:
1404 // types:
1405 typedef _CharT char_type;
1406 typedef _Traits traits_type;
1407 typedef typename traits_type::int_type int_type;
1408 typedef typename traits_type::pos_type pos_type;
1409 typedef typename traits_type::off_type off_type;
1410
1411 // constructor/destructor
Louis Dionneb4d05d72018-10-16 19:26:23 +00001412 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001413 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1414 : basic_istream<_CharT, _Traits>(__sb)
1415 {}
1416
Howard Hinnantc51e1022010-05-11 19:42:16 +00001417 virtual ~basic_iostream();
1418protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +00001419#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +00001420 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001421 basic_iostream(basic_iostream&& __rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001422
1423 // assign/swap
Eric Fiselier815ed732016-09-16 00:00:48 +00001424 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001425 basic_iostream& operator=(basic_iostream&& __rhs);
1426#endif
Louis Dionneb4d05d72018-10-16 19:26:23 +00001427 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001428 void swap(basic_iostream& __rhs)
1429 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001430};
1431
Eric Fiselier78ccf772017-04-18 23:38:41 +00001432#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001433
1434template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001435basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001436 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001437{
1438}
1439
1440template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001441basic_iostream<_CharT, _Traits>&
1442basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1443{
1444 swap(__rhs);
1445 return *this;
1446}
1447
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001448#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449
1450template <class _CharT, class _Traits>
1451basic_iostream<_CharT, _Traits>::~basic_iostream()
1452{
1453}
1454
Howard Hinnantc51e1022010-05-11 19:42:16 +00001455template<class _CharT, class _Traits, class _Allocator>
1456basic_istream<_CharT, _Traits>&
1457operator>>(basic_istream<_CharT, _Traits>& __is,
1458 basic_string<_CharT, _Traits, _Allocator>& __str)
1459{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001460 ios_base::iostate __state = ios_base::goodbit;
1461 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1462 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001463 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001464#ifndef _LIBCPP_NO_EXCEPTIONS
1465 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001466 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001467#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001468 __str.clear();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001469 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001470 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001471 __n = __str.max_size();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001472 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001473 __n = numeric_limits<streamsize>::max();
1474 streamsize __c = 0;
1475 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001476 while (__c < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001477 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001478 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1479 if (_Traits::eq_int_type(__i, _Traits::eof()))
1480 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001481 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001482 break;
1483 }
1484 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001485 if (__ct.is(__ct.space, __ch))
1486 break;
1487 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001488 ++__c;
1489 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001490 }
1491 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001492 if (__c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001493 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001494#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001495 }
1496 catch (...)
1497 {
1498 __state |= ios_base::badbit;
1499 __is.__setstate_nothrow(__state);
1500 if (__is.exceptions() & ios_base::badbit)
1501 {
1502 throw;
1503 }
1504 }
1505#endif
1506 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001507 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001508 return __is;
1509}
1510
1511template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001512basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001513getline(basic_istream<_CharT, _Traits>& __is,
1514 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1515{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001516 ios_base::iostate __state = ios_base::goodbit;
1517 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1518 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001519 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001520#ifndef _LIBCPP_NO_EXCEPTIONS
1521 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001522 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001523#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001524 __str.clear();
Howard Hinnante992f762011-10-09 15:20:46 +00001525 streamsize __extr = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001526 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001527 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001528 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1529 if (_Traits::eq_int_type(__i, _Traits::eof()))
1530 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001531 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001532 break;
1533 }
Howard Hinnante992f762011-10-09 15:20:46 +00001534 ++__extr;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001535 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001536 if (_Traits::eq(__ch, __dlm))
1537 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001538 __str.push_back(__ch);
1539 if (__str.size() == __str.max_size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001541 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001542 break;
1543 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001544 }
Howard Hinnante992f762011-10-09 15:20:46 +00001545 if (__extr == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001546 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001548 }
1549 catch (...)
1550 {
1551 __state |= ios_base::badbit;
1552 __is.__setstate_nothrow(__state);
1553 if (__is.exceptions() & ios_base::badbit)
1554 {
1555 throw;
1556 }
1557 }
1558#endif
1559 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561 return __is;
1562}
1563
1564template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001565inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001566basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001567getline(basic_istream<_CharT, _Traits>& __is,
1568 basic_string<_CharT, _Traits, _Allocator>& __str)
1569{
1570 return getline(__is, __str, __is.widen('\n'));
1571}
1572
Eric Fiselier78ccf772017-04-18 23:38:41 +00001573#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001574
1575template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001576inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001577basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001578getline(basic_istream<_CharT, _Traits>&& __is,
1579 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1580{
1581 return getline(__is, __str, __dlm);
1582}
1583
1584template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001585inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001586basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001587getline(basic_istream<_CharT, _Traits>&& __is,
1588 basic_string<_CharT, _Traits, _Allocator>& __str)
1589{
1590 return getline(__is, __str, __is.widen('\n'));
1591}
1592
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001593#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001594
1595template <class _CharT, class _Traits, size_t _Size>
1596basic_istream<_CharT, _Traits>&
1597operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1598{
Louis Dionne94ee3a02019-04-05 16:33:37 +00001599 ios_base::iostate __state = ios_base::goodbit;
1600 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1601 if (__sen)
Louis Dionne5ddf8a22019-04-02 22:21:27 +00001602 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001603#ifndef _LIBCPP_NO_EXCEPTIONS
1604 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001605 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001606#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001607 basic_string<_CharT, _Traits> __str;
1608 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier37c22152016-12-24 00:24:44 +00001609 size_t __c = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001610 _CharT __zero = __ct.widen('0');
1611 _CharT __one = __ct.widen('1');
Howard Hinnante51e4e92011-09-01 21:02:45 +00001612 while (__c < _Size)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001613 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001614 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1615 if (_Traits::eq_int_type(__i, _Traits::eof()))
1616 {
Louis Dionne94ee3a02019-04-05 16:33:37 +00001617 __state |= ios_base::eofbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001618 break;
1619 }
1620 _CharT __ch = _Traits::to_char_type(__i);
1621 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001622 break;
1623 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001624 ++__c;
1625 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001626 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001627 __x = bitset<_Size>(__str);
Louis Dionne82079002019-08-20 18:21:06 +00001628 if (_Size > 0 && __c == 0)
Louis Dionne94ee3a02019-04-05 16:33:37 +00001629 __state |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001630#ifndef _LIBCPP_NO_EXCEPTIONS
Louis Dionne94ee3a02019-04-05 16:33:37 +00001631 }
1632 catch (...)
1633 {
1634 __state |= ios_base::badbit;
1635 __is.__setstate_nothrow(__state);
1636 if (__is.exceptions() & ios_base::badbit)
1637 {
1638 throw;
1639 }
1640 }
1641#endif
1642 __is.setstate(__state);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001643 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001644 return __is;
1645}
1646
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001647_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1648_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1649_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001650
1651_LIBCPP_END_NAMESPACE_STD
1652
Eric Fiselierf4433a32017-05-31 22:07:49 +00001653_LIBCPP_POP_MACROS
1654
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001655#endif // _LIBCPP_ISTREAM