blob: 14a5fe12979d43d8b0e82908c3ccc90b9d486814 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- istream ----------------------------------===//
3//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_ISTREAM
11#define _LIBCPP_ISTREAM
12
13/*
14 istream synopsis
15
16template <class charT, class traits = char_traits<charT> >
17class basic_istream
18 : virtual public basic_ios<charT,traits>
19{
20public:
21 // types (inherited from basic_ios (27.5.4)):
22 typedef charT char_type;
23 typedef traits traits_type;
24 typedef typename traits_type::int_type int_type;
25 typedef typename traits_type::pos_type pos_type;
26 typedef typename traits_type::off_type off_type;
27
28 // 27.7.1.1.1 Constructor/destructor:
29 explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
30 basic_istream(basic_istream&& rhs);
31 virtual ~basic_istream();
32
33 // 27.7.1.1.2 Assign/swap:
34 basic_istream& operator=(basic_istream&& rhs);
35 void swap(basic_istream& rhs);
36
37 // 27.7.1.1.3 Prefix/suffix:
38 class sentry;
39
40 // 27.7.1.2 Formatted input:
41 basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
42 basic_istream& operator>>(basic_ios<char_type, traits_type>&
43 (*pf)(basic_ios<char_type, traits_type>&));
44 basic_istream& operator>>(ios_base& (*pf)(ios_base&));
45 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
46 basic_istream& operator>>(bool& n);
47 basic_istream& operator>>(short& n);
48 basic_istream& operator>>(unsigned short& n);
49 basic_istream& operator>>(int& n);
50 basic_istream& operator>>(unsigned int& n);
51 basic_istream& operator>>(long& n);
52 basic_istream& operator>>(unsigned long& n);
53 basic_istream& operator>>(long long& n);
54 basic_istream& operator>>(unsigned long long& n);
55 basic_istream& operator>>(float& f);
56 basic_istream& operator>>(double& f);
57 basic_istream& operator>>(long double& f);
58 basic_istream& operator>>(void*& p);
59
60 // 27.7.1.3 Unformatted input:
61 streamsize gcount() const;
62 int_type get();
63 basic_istream& get(char_type& c);
64 basic_istream& get(char_type* s, streamsize n);
65 basic_istream& get(char_type* s, streamsize n, char_type delim);
66 basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
67 basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
68
69 basic_istream& getline(char_type* s, streamsize n);
70 basic_istream& getline(char_type* s, streamsize n, char_type delim);
71
72 basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
73 int_type peek();
74 basic_istream& read (char_type* s, streamsize n);
75 streamsize readsome(char_type* s, streamsize n);
76
77 basic_istream& putback(char_type c);
78 basic_istream& unget();
79 int sync();
80
81 pos_type tellg();
82 basic_istream& seekg(pos_type);
83 basic_istream& seekg(off_type, ios_base::seekdir);
Marshall Clow27d29872014-09-16 15:27:01 +000084protected:
85 basic_istream(const basic_istream& rhs) = delete;
86 basic_istream(basic_istream&& rhs);
87 // 27.7.2.1.2 Assign/swap:
88 basic_istream& operator=(const basic_istream& rhs) = delete;
89 basic_istream& operator=(basic_istream&& rhs);
90 void swap(basic_istream& rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +000091};
92
93// 27.7.1.2.3 character extraction templates:
94template<class charT, class traits>
95 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
96
97template<class traits>
98 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
99
100template<class traits>
101 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
102
103template<class charT, class traits>
104 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
105
106template<class traits>
107 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
108
109template<class traits>
110 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
111
112template <class charT, class traits>
113 void
114 swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
115
116typedef basic_istream<char> istream;
117typedef basic_istream<wchar_t> wistream;
118
119template <class charT, class traits = char_traits<charT> >
120class basic_iostream :
121 public basic_istream<charT,traits>,
122 public basic_ostream<charT,traits>
123{
124public:
125 // types:
126 typedef charT char_type;
127 typedef traits traits_type;
128 typedef typename traits_type::int_type int_type;
129 typedef typename traits_type::pos_type pos_type;
130 typedef typename traits_type::off_type off_type;
131
132 // constructor/destructor
133 explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
134 basic_iostream(basic_iostream&& rhs);
135 virtual ~basic_iostream();
136
137 // assign/swap
138 basic_iostream& operator=(basic_iostream&& rhs);
139 void swap(basic_iostream& rhs);
140};
141
142template <class charT, class traits>
143 void
144 swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
145
146typedef basic_iostream<char> iostream;
147typedef basic_iostream<wchar_t> wiostream;
148
149template <class charT, class traits>
150 basic_istream<charT,traits>&
151 ws(basic_istream<charT,traits>& is);
152
153template <class charT, class traits, class T>
154 basic_istream<charT, traits>&
155 operator>>(basic_istream<charT, traits>&& is, T& x);
156
157} // std
158
159*/
160
161#include <__config>
Marshall Clow8732fed2018-12-11 04:35:44 +0000162#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000163#include <ostream>
164
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000165#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000167#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000168
Eric Fiselierf4433a32017-05-31 22:07:49 +0000169_LIBCPP_PUSH_MACROS
170#include <__undef_macros>
171
172
Howard Hinnantc51e1022010-05-11 19:42:16 +0000173_LIBCPP_BEGIN_NAMESPACE_STD
174
175template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000176class _LIBCPP_TEMPLATE_VIS basic_istream
Howard Hinnantc51e1022010-05-11 19:42:16 +0000177 : virtual public basic_ios<_CharT, _Traits>
178{
179 streamsize __gc_;
180public:
181 // types (inherited from basic_ios (27.5.4)):
182 typedef _CharT char_type;
183 typedef _Traits traits_type;
184 typedef typename traits_type::int_type int_type;
185 typedef typename traits_type::pos_type pos_type;
186 typedef typename traits_type::off_type off_type;
187
188 // 27.7.1.1.1 Constructor/destructor:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000189 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000190 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
191 { this->init(__sb); }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000192 virtual ~basic_istream();
193protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +0000194#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +0000195 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000196 basic_istream(basic_istream&& __rhs);
Eric Fiselier78ccf772017-04-18 23:38:41 +0000197
Howard Hinnantc51e1022010-05-11 19:42:16 +0000198 // 27.7.1.1.2 Assign/swap:
Eric Fiselier815ed732016-09-16 00:00:48 +0000199 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000200 basic_istream& operator=(basic_istream&& __rhs);
201#endif
Eric Fiselier815ed732016-09-16 00:00:48 +0000202
Louis Dionneb4d05d72018-10-16 19:26:23 +0000203 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000204 void swap(basic_istream& __rhs) {
205 _VSTD::swap(__gc_, __rhs.__gc_);
206 basic_ios<char_type, traits_type>::swap(__rhs);
207 }
Marshall Clow27d29872014-09-16 15:27:01 +0000208
Eric Fiselier2d8515f2017-01-06 20:58:25 +0000209#ifndef _LIBCPP_CXX03_LANG
Marshall Clow242d9c12014-09-16 15:33:53 +0000210 basic_istream (const basic_istream& __rhs) = delete;
211 basic_istream& operator=(const basic_istream& __rhs) = delete;
Marshall Clow27d29872014-09-16 15:27:01 +0000212#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000213public:
214
215 // 27.7.1.1.3 Prefix/suffix:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000216 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000217
218 // 27.7.1.2 Formatted input:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000219 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000220 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
221 { return __pf(*this); }
222
Louis Dionneb4d05d72018-10-16 19:26:23 +0000223 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224 basic_istream& operator>>(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000225 (*__pf)(basic_ios<char_type, traits_type>&))
226 { __pf(*this); return *this; }
227
Louis Dionneb4d05d72018-10-16 19:26:23 +0000228 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000229 basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
230 { __pf(*this); return *this; }
231
Howard Hinnantc51e1022010-05-11 19:42:16 +0000232 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
233 basic_istream& operator>>(bool& __n);
234 basic_istream& operator>>(short& __n);
235 basic_istream& operator>>(unsigned short& __n);
236 basic_istream& operator>>(int& __n);
237 basic_istream& operator>>(unsigned int& __n);
238 basic_istream& operator>>(long& __n);
239 basic_istream& operator>>(unsigned long& __n);
240 basic_istream& operator>>(long long& __n);
241 basic_istream& operator>>(unsigned long long& __n);
242 basic_istream& operator>>(float& __f);
243 basic_istream& operator>>(double& __f);
244 basic_istream& operator>>(long double& __f);
245 basic_istream& operator>>(void*& __p);
246
247 // 27.7.1.3 Unformatted input:
Howard Hinnant64da2602010-09-22 15:29:08 +0000248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000249 streamsize gcount() const {return __gc_;}
250 int_type get();
Eric Fiselier815ed732016-09-16 00:00:48 +0000251
Louis Dionneb4d05d72018-10-16 19:26:23 +0000252 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000253 basic_istream& get(char_type& __c) {
254 int_type __ch = get();
255 if (__ch != traits_type::eof())
256 __c = traits_type::to_char_type(__ch);
257 return *this;
258 }
259
Louis Dionneb4d05d72018-10-16 19:26:23 +0000260 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000261 basic_istream& get(char_type* __s, streamsize __n)
262 { return get(__s, __n, this->widen('\n')); }
263
Howard Hinnantc51e1022010-05-11 19:42:16 +0000264 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
Eric Fiselier815ed732016-09-16 00:00:48 +0000265
Louis Dionneb4d05d72018-10-16 19:26:23 +0000266 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000267 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
268 { return get(__sb, this->widen('\n')); }
269
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
271
Louis Dionneb4d05d72018-10-16 19:26:23 +0000272 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000273 basic_istream& getline(char_type* __s, streamsize __n)
274 { return getline(__s, __n, this->widen('\n')); }
275
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276 basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
277
278 basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
279 int_type peek();
280 basic_istream& read (char_type* __s, streamsize __n);
281 streamsize readsome(char_type* __s, streamsize __n);
282
283 basic_istream& putback(char_type __c);
284 basic_istream& unget();
285 int sync();
286
287 pos_type tellg();
288 basic_istream& seekg(pos_type __pos);
289 basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
290};
291
292template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000293class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294{
295 bool __ok_;
296
297 sentry(const sentry&); // = delete;
298 sentry& operator=(const sentry&); // = delete;
299
300public:
301 explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
302// ~sentry() = default;
303
Howard Hinnant64da2602010-09-22 15:29:08 +0000304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant86a291f2012-02-21 21:46:43 +0000305 _LIBCPP_EXPLICIT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306 operator bool() const {return __ok_;}
307};
308
309template <class _CharT, class _Traits>
310basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
311 bool __noskipws)
312 : __ok_(false)
313{
314 if (__is.good())
315 {
316 if (__is.tie())
317 __is.tie()->flush();
318 if (!__noskipws && (__is.flags() & ios_base::skipws))
319 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000320 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnantc834c512011-11-29 18:15:50 +0000322 _Ip __i(__is);
323 _Ip __eof;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 for (; __i != __eof; ++__i)
325 if (!__ct.is(__ct.space, *__i))
326 break;
327 if (__i == __eof)
328 __is.setstate(ios_base::failbit | ios_base::eofbit);
329 }
330 __ok_ = __is.good();
331 }
332 else
333 __is.setstate(ios_base::failbit);
334}
335
Eric Fiselier78ccf772017-04-18 23:38:41 +0000336#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337
338template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
340 : __gc_(__rhs.__gc_)
341{
342 __rhs.__gc_ = 0;
343 this->move(__rhs);
344}
345
346template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000347basic_istream<_CharT, _Traits>&
348basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
349{
350 swap(__rhs);
351 return *this;
352}
353
Eric Fiselier78ccf772017-04-18 23:38:41 +0000354#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355
356template <class _CharT, class _Traits>
357basic_istream<_CharT, _Traits>::~basic_istream()
358{
359}
360
Louis Dionne8ea66082018-07-25 19:40:01 +0000361template <class _Tp, class _CharT, class _Traits>
362_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363basic_istream<_CharT, _Traits>&
Louis Dionne8ea66082018-07-25 19:40:01 +0000364__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000365#ifndef _LIBCPP_NO_EXCEPTIONS
366 try
367 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000368#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000369 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370 if (__s)
371 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000372 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
373 typedef num_get<_CharT, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374 ios_base::iostate __err = ios_base::goodbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000375 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __n);
376 __is.setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377 }
378#ifndef _LIBCPP_NO_EXCEPTIONS
379 }
380 catch (...)
381 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000382 __is.__set_badbit_and_consider_rethrow();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000384#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000385 return __is;
386}
387
388template <class _CharT, class _Traits>
389basic_istream<_CharT, _Traits>&
390basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
391{
392 return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393}
394
395template <class _CharT, class _Traits>
396basic_istream<_CharT, _Traits>&
397basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
398{
Louis Dionne8ea66082018-07-25 19:40:01 +0000399 return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000400}
401
402template <class _CharT, class _Traits>
403basic_istream<_CharT, _Traits>&
404basic_istream<_CharT, _Traits>::operator>>(long& __n)
405{
Louis Dionne8ea66082018-07-25 19:40:01 +0000406 return _VSTD::__input_arithmetic<long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407}
408
409template <class _CharT, class _Traits>
410basic_istream<_CharT, _Traits>&
411basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
412{
Louis Dionne8ea66082018-07-25 19:40:01 +0000413 return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000414}
415
416template <class _CharT, class _Traits>
417basic_istream<_CharT, _Traits>&
418basic_istream<_CharT, _Traits>::operator>>(long long& __n)
419{
Louis Dionne8ea66082018-07-25 19:40:01 +0000420 return _VSTD::__input_arithmetic<long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000421}
422
423template <class _CharT, class _Traits>
424basic_istream<_CharT, _Traits>&
425basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
426{
Louis Dionne8ea66082018-07-25 19:40:01 +0000427 return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428}
429
430template <class _CharT, class _Traits>
431basic_istream<_CharT, _Traits>&
432basic_istream<_CharT, _Traits>::operator>>(float& __n)
433{
Louis Dionne8ea66082018-07-25 19:40:01 +0000434 return _VSTD::__input_arithmetic<float>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000435}
436
437template <class _CharT, class _Traits>
438basic_istream<_CharT, _Traits>&
439basic_istream<_CharT, _Traits>::operator>>(double& __n)
440{
Louis Dionne8ea66082018-07-25 19:40:01 +0000441 return _VSTD::__input_arithmetic<double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442}
443
444template <class _CharT, class _Traits>
445basic_istream<_CharT, _Traits>&
446basic_istream<_CharT, _Traits>::operator>>(long double& __n)
447{
Louis Dionne8ea66082018-07-25 19:40:01 +0000448 return _VSTD::__input_arithmetic<long double>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449}
450
451template <class _CharT, class _Traits>
452basic_istream<_CharT, _Traits>&
453basic_istream<_CharT, _Traits>::operator>>(bool& __n)
454{
Louis Dionne8ea66082018-07-25 19:40:01 +0000455 return _VSTD::__input_arithmetic<bool>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456}
457
458template <class _CharT, class _Traits>
459basic_istream<_CharT, _Traits>&
460basic_istream<_CharT, _Traits>::operator>>(void*& __n)
461{
Louis Dionne8ea66082018-07-25 19:40:01 +0000462 return _VSTD::__input_arithmetic<void*>(*this, __n);
463}
464
465template <class _Tp, class _CharT, class _Traits>
466_LIBCPP_INLINE_VISIBILITY
467basic_istream<_CharT, _Traits>&
468__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000469#ifndef _LIBCPP_NO_EXCEPTIONS
470 try
471 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000472#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000473 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000474 if (__s)
475 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000476 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
477 typedef num_get<_CharT, _Ip> _Fp;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000478 ios_base::iostate __err = ios_base::goodbit;
Louis Dionne8ea66082018-07-25 19:40:01 +0000479 long __temp;
480 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __temp);
481 if (__temp < numeric_limits<_Tp>::min())
482 {
483 __err |= ios_base::failbit;
484 __n = numeric_limits<_Tp>::min();
485 }
486 else if (__temp > numeric_limits<_Tp>::max())
487 {
488 __err |= ios_base::failbit;
489 __n = numeric_limits<_Tp>::max();
490 }
491 else
492 __n = static_cast<_Tp>(__temp);
493 __is.setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494 }
495#ifndef _LIBCPP_NO_EXCEPTIONS
496 }
497 catch (...)
498 {
Louis Dionne8ea66082018-07-25 19:40:01 +0000499 __is.__set_badbit_and_consider_rethrow();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000501#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionne8ea66082018-07-25 19:40:01 +0000502 return __is;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000503}
504
505template <class _CharT, class _Traits>
506basic_istream<_CharT, _Traits>&
507basic_istream<_CharT, _Traits>::operator>>(short& __n)
508{
Louis Dionne8ea66082018-07-25 19:40:01 +0000509 return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510}
511
512template <class _CharT, class _Traits>
513basic_istream<_CharT, _Traits>&
514basic_istream<_CharT, _Traits>::operator>>(int& __n)
515{
Louis Dionne8ea66082018-07-25 19:40:01 +0000516 return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000517}
518
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519template<class _CharT, class _Traits>
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000520_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521basic_istream<_CharT, _Traits>&
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000522__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000523{
524#ifndef _LIBCPP_NO_EXCEPTIONS
525 try
526 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000527#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
529 if (__sen)
530 {
Louis Dionne54f50752019-04-02 19:20:47 +0000531 _CharT* __s = __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +0000533 ios_base::iostate __err = ios_base::goodbit;
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000534 while (__s != __p + (__n-1))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000536 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
537 if (_Traits::eq_int_type(__i, _Traits::eof()))
538 {
539 __err |= ios_base::eofbit;
540 break;
541 }
542 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000543 if (__ct.is(__ct.space, __ch))
544 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000545 *__s++ = __ch;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000546 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547 }
548 *__s = _CharT();
549 __is.width(0);
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000550 if (__s == __p)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551 __err |= ios_base::failbit;
552 __is.setstate(__err);
553 }
554#ifndef _LIBCPP_NO_EXCEPTIONS
555 }
556 catch (...)
557 {
558 __is.__set_badbit_and_consider_rethrow();
559 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000560#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000561 return __is;
562}
563
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000564#if _LIBCPP_STD_VER > 17
565
566template<class _CharT, class _Traits, size_t _Np>
567inline _LIBCPP_INLINE_VISIBILITY
568basic_istream<_CharT, _Traits>&
569operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
570{
Louis Dionne54f50752019-04-02 19:20:47 +0000571 size_t __n = _Np;
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000572 if (__is.width() > 0)
573 __n = _VSTD::min(size_t(__is.width()), _Np);
574 return _VSTD::__input_c_string(__is, __buf, __n);
575}
576
577template<class _Traits, size_t _Np>
578inline _LIBCPP_INLINE_VISIBILITY
579basic_istream<char, _Traits>&
580operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
581{
582 return __is >> (char(&)[_Np])__buf;
583}
584
585template<class _Traits, size_t _Np>
586inline _LIBCPP_INLINE_VISIBILITY
587basic_istream<char, _Traits>&
588operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
589{
590 return __is >> (char(&)[_Np])__buf;
591}
592
593#else
594
595template<class _CharT, class _Traits>
596inline _LIBCPP_INLINE_VISIBILITY
597basic_istream<_CharT, _Traits>&
598operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
599{
600 streamsize __n = __is.width();
601 if (__n <= 0)
602 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
603 return _VSTD::__input_c_string(__is, __s, size_t(__n));
604}
605
Howard Hinnantc51e1022010-05-11 19:42:16 +0000606template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000607inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608basic_istream<char, _Traits>&
609operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
610{
611 return __is >> (char*)__s;
612}
613
614template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000615inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616basic_istream<char, _Traits>&
617operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
618{
619 return __is >> (char*)__s;
620}
621
Zhihao Yuan404bcaa2018-11-21 03:30:10 +0000622#endif // _LIBCPP_STD_VER > 17
623
Howard Hinnantc51e1022010-05-11 19:42:16 +0000624template<class _CharT, class _Traits>
625basic_istream<_CharT, _Traits>&
626operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
627{
628#ifndef _LIBCPP_NO_EXCEPTIONS
629 try
630 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000631#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
633 if (__sen)
634 {
Howard Hinnantb2e8a422011-02-27 18:02:02 +0000635 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
636 if (_Traits::eq_int_type(__i, _Traits::eof()))
637 __is.setstate(ios_base::eofbit | ios_base::failbit);
638 else
639 __c = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000640 }
641#ifndef _LIBCPP_NO_EXCEPTIONS
642 }
643 catch (...)
644 {
645 __is.__set_badbit_and_consider_rethrow();
646 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000647#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000648 return __is;
649}
650
651template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000652inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653basic_istream<char, _Traits>&
654operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
655{
656 return __is >> (char&)__c;
657}
658
659template<class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +0000660inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000661basic_istream<char, _Traits>&
662operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
663{
664 return __is >> (char&)__c;
665}
666
667template<class _CharT, class _Traits>
668basic_istream<_CharT, _Traits>&
669basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
670{
671 __gc_ = 0;
672#ifndef _LIBCPP_NO_EXCEPTIONS
673 try
674 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000675#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000676 sentry __s(*this, true);
677 if (__s)
678 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000679 if (__sb)
680 {
681#ifndef _LIBCPP_NO_EXCEPTIONS
682 try
683 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000684#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000685 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000686 while (true)
687 {
688 typename traits_type::int_type __i = this->rdbuf()->sgetc();
689 if (traits_type::eq_int_type(__i, _Traits::eof()))
690 {
691 __err |= ios_base::eofbit;
692 break;
693 }
694 if (traits_type::eq_int_type(
695 __sb->sputc(traits_type::to_char_type(__i)),
696 traits_type::eof()))
697 break;
698 ++__gc_;
699 this->rdbuf()->sbumpc();
700 }
701 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000702 __err |= ios_base::failbit;
703 this->setstate(__err);
704#ifndef _LIBCPP_NO_EXCEPTIONS
705 }
706 catch (...)
707 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000708 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000709 this->__set_failbit_and_consider_rethrow();
710 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000711#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000712 }
713 else
714 this->setstate(ios_base::failbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000715 }
716#ifndef _LIBCPP_NO_EXCEPTIONS
717 }
718 catch (...)
719 {
720 this->__set_badbit_and_consider_rethrow();
721 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000722#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000723 return *this;
724}
725
726template<class _CharT, class _Traits>
727typename basic_istream<_CharT, _Traits>::int_type
728basic_istream<_CharT, _Traits>::get()
729{
730 __gc_ = 0;
731 int_type __r = traits_type::eof();
732#ifndef _LIBCPP_NO_EXCEPTIONS
733 try
734 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000735#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000736 sentry __s(*this, true);
737 if (__s)
738 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000739 __r = this->rdbuf()->sbumpc();
740 if (traits_type::eq_int_type(__r, traits_type::eof()))
741 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000742 else
Howard Hinnante51e4e92011-09-01 21:02:45 +0000743 __gc_ = 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000744 }
745#ifndef _LIBCPP_NO_EXCEPTIONS
746 }
747 catch (...)
748 {
749 this->__set_badbit_and_consider_rethrow();
750 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000751#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000752 return __r;
753}
754
755template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000756basic_istream<_CharT, _Traits>&
757basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
758{
759 __gc_ = 0;
760#ifndef _LIBCPP_NO_EXCEPTIONS
761 try
762 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000763#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000764 sentry __sen(*this, true);
765 if (__sen)
766 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767 if (__n > 0)
768 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000769 ios_base::iostate __err = ios_base::goodbit;
770 while (__gc_ < __n-1)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000771 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000772 int_type __i = this->rdbuf()->sgetc();
773 if (traits_type::eq_int_type(__i, traits_type::eof()))
774 {
775 __err |= ios_base::eofbit;
776 break;
777 }
778 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000779 if (traits_type::eq(__ch, __dlm))
780 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000781 *__s++ = __ch;
782 ++__gc_;
783 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000784 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000785 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000786 __err |= ios_base::failbit;
787 this->setstate(__err);
788 }
789 else
790 this->setstate(ios_base::failbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000791 }
Volodymyr Sapsai99be85e2018-01-11 23:23:49 +0000792 if (__n > 0)
793 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000794#ifndef _LIBCPP_NO_EXCEPTIONS
795 }
796 catch (...)
797 {
Volodymyr Sapsai99be85e2018-01-11 23:23:49 +0000798 if (__n > 0)
799 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800 this->__set_badbit_and_consider_rethrow();
801 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000802#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000803 return *this;
804}
805
806template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807basic_istream<_CharT, _Traits>&
808basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
809 char_type __dlm)
810{
811 __gc_ = 0;
812#ifndef _LIBCPP_NO_EXCEPTIONS
813 try
814 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000815#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816 sentry __sen(*this, true);
817 if (__sen)
818 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000819 ios_base::iostate __err = ios_base::goodbit;
820#ifndef _LIBCPP_NO_EXCEPTIONS
821 try
822 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000823#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000824 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000825 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000826 typename traits_type::int_type __i = this->rdbuf()->sgetc();
827 if (traits_type::eq_int_type(__i, traits_type::eof()))
828 {
829 __err |= ios_base::eofbit;
830 break;
831 }
832 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000833 if (traits_type::eq(__ch, __dlm))
834 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000835 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000836 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +0000837 ++__gc_;
838 this->rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000839 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000840#ifndef _LIBCPP_NO_EXCEPTIONS
841 }
842 catch (...)
843 {
844 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000845#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +0000846 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000847 __err |= ios_base::failbit;
848 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000849 }
850#ifndef _LIBCPP_NO_EXCEPTIONS
851 }
852 catch (...)
853 {
854 this->__set_badbit_and_consider_rethrow();
855 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000856#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000857 return *this;
858}
859
860template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861basic_istream<_CharT, _Traits>&
862basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
863{
864 __gc_ = 0;
865#ifndef _LIBCPP_NO_EXCEPTIONS
866 try
867 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000868#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000869 sentry __sen(*this, true);
870 if (__sen)
871 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000872 ios_base::iostate __err = ios_base::goodbit;
873 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000874 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000875 typename traits_type::int_type __i = this->rdbuf()->sgetc();
876 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000878 __err |= ios_base::eofbit;
879 break;
880 }
881 char_type __ch = traits_type::to_char_type(__i);
882 if (traits_type::eq(__ch, __dlm))
883 {
884 this->rdbuf()->sbumpc();
885 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 break;
887 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000888 if (__gc_ >= __n-1)
889 {
890 __err |= ios_base::failbit;
891 break;
892 }
893 *__s++ = __ch;
894 this->rdbuf()->sbumpc();
895 ++__gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000896 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000897 if (__gc_ == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898 __err |= ios_base::failbit;
899 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000900 }
Volodymyr Sapsaib801d702017-11-22 18:52:36 +0000901 if (__n > 0)
902 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000903#ifndef _LIBCPP_NO_EXCEPTIONS
904 }
905 catch (...)
906 {
Volodymyr Sapsaib801d702017-11-22 18:52:36 +0000907 if (__n > 0)
908 *__s = char_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909 this->__set_badbit_and_consider_rethrow();
910 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000911#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912 return *this;
913}
914
915template<class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000916basic_istream<_CharT, _Traits>&
917basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
918{
919 __gc_ = 0;
920#ifndef _LIBCPP_NO_EXCEPTIONS
921 try
922 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000923#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924 sentry __sen(*this, true);
925 if (__sen)
926 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000927 ios_base::iostate __err = ios_base::goodbit;
928 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantc51e1022010-05-11 19:42:16 +0000929 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000930 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000931 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000932 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
933 if (traits_type::eq_int_type(__i, traits_type::eof()))
934 {
935 __err |= ios_base::eofbit;
936 break;
937 }
938 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000939 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000940 break;
941 }
942 }
943 else
944 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000945 while (__gc_ < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000946 {
Howard Hinnante51e4e92011-09-01 21:02:45 +0000947 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
948 if (traits_type::eq_int_type(__i, traits_type::eof()))
949 {
950 __err |= ios_base::eofbit;
951 break;
952 }
953 ++__gc_;
Howard Hinnant4df1e3f2013-07-01 00:37:50 +0000954 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000955 break;
956 }
957 }
Howard Hinnante51e4e92011-09-01 21:02:45 +0000958 this->setstate(__err);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959 }
960#ifndef _LIBCPP_NO_EXCEPTIONS
961 }
962 catch (...)
963 {
964 this->__set_badbit_and_consider_rethrow();
965 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000966#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000967 return *this;
968}
969
970template<class _CharT, class _Traits>
971typename basic_istream<_CharT, _Traits>::int_type
972basic_istream<_CharT, _Traits>::peek()
973{
974 __gc_ = 0;
975 int_type __r = traits_type::eof();
976#ifndef _LIBCPP_NO_EXCEPTIONS
977 try
978 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000979#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000980 sentry __sen(*this, true);
981 if (__sen)
Howard Hinnanta4427372012-11-01 17:32:07 +0000982 {
Howard Hinnantc51e1022010-05-11 19:42:16 +0000983 __r = this->rdbuf()->sgetc();
Howard Hinnanta4427372012-11-01 17:32:07 +0000984 if (traits_type::eq_int_type(__r, traits_type::eof()))
985 this->setstate(ios_base::eofbit);
986 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000987#ifndef _LIBCPP_NO_EXCEPTIONS
988 }
989 catch (...)
990 {
991 this->__set_badbit_and_consider_rethrow();
992 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000993#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000994 return __r;
995}
996
997template<class _CharT, class _Traits>
998basic_istream<_CharT, _Traits>&
999basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1000{
1001 __gc_ = 0;
1002#ifndef _LIBCPP_NO_EXCEPTIONS
1003 try
1004 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001005#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001006 sentry __sen(*this, true);
1007 if (__sen)
1008 {
Howard Hinnant232466c2013-03-06 19:27:56 +00001009 __gc_ = this->rdbuf()->sgetn(__s, __n);
1010 if (__gc_ != __n)
1011 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001012 }
1013 else
1014 this->setstate(ios_base::failbit);
1015#ifndef _LIBCPP_NO_EXCEPTIONS
1016 }
1017 catch (...)
1018 {
1019 this->__set_badbit_and_consider_rethrow();
1020 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001021#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001022 return *this;
1023}
1024
1025template<class _CharT, class _Traits>
1026streamsize
1027basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1028{
Howard Hinnantaf8555c2012-12-20 15:40:28 +00001029 __gc_ = 0;
Marshall Clow1c6e3862016-07-13 16:58:48 +00001030#ifndef _LIBCPP_NO_EXCEPTIONS
1031 try
Howard Hinnantc51e1022010-05-11 19:42:16 +00001032 {
Marshall Clow1c6e3862016-07-13 16:58:48 +00001033#endif // _LIBCPP_NO_EXCEPTIONS
1034 sentry __sen(*this, true);
1035 if (__sen)
1036 {
1037 streamsize __c = this->rdbuf()->in_avail();
1038 switch (__c)
1039 {
1040 case -1:
1041 this->setstate(ios_base::eofbit);
1042 break;
1043 case 0:
1044 break;
1045 default:
1046 read(__s, _VSTD::min(__c, __n));
1047 break;
1048 }
1049 }
1050 else
1051 this->setstate(ios_base::failbit);
1052#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053 }
Marshall Clow1c6e3862016-07-13 16:58:48 +00001054 catch (...)
1055 {
1056 this->__set_badbit_and_consider_rethrow();
1057 }
1058#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante51e4e92011-09-01 21:02:45 +00001059 return __gc_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060}
1061
1062template<class _CharT, class _Traits>
1063basic_istream<_CharT, _Traits>&
1064basic_istream<_CharT, _Traits>::putback(char_type __c)
1065{
1066 __gc_ = 0;
1067#ifndef _LIBCPP_NO_EXCEPTIONS
1068 try
1069 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001070#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001071 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001072 sentry __sen(*this, true);
1073 if (__sen)
1074 {
1075 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1076 this->setstate(ios_base::badbit);
1077 }
1078 else
1079 this->setstate(ios_base::failbit);
1080#ifndef _LIBCPP_NO_EXCEPTIONS
1081 }
1082 catch (...)
1083 {
1084 this->__set_badbit_and_consider_rethrow();
1085 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001086#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001087 return *this;
1088}
1089
1090template<class _CharT, class _Traits>
1091basic_istream<_CharT, _Traits>&
1092basic_istream<_CharT, _Traits>::unget()
1093{
1094 __gc_ = 0;
1095#ifndef _LIBCPP_NO_EXCEPTIONS
1096 try
1097 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001098#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001099 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001100 sentry __sen(*this, true);
1101 if (__sen)
1102 {
1103 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1104 this->setstate(ios_base::badbit);
1105 }
1106 else
1107 this->setstate(ios_base::failbit);
1108#ifndef _LIBCPP_NO_EXCEPTIONS
1109 }
1110 catch (...)
1111 {
1112 this->__set_badbit_and_consider_rethrow();
1113 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001114#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001115 return *this;
1116}
1117
1118template<class _CharT, class _Traits>
1119int
1120basic_istream<_CharT, _Traits>::sync()
1121{
1122 int __r = 0;
1123#ifndef _LIBCPP_NO_EXCEPTIONS
1124 try
1125 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001126#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001127 sentry __sen(*this, true);
1128 if (__sen)
1129 {
1130 if (this->rdbuf() == 0)
1131 return -1;
1132 if (this->rdbuf()->pubsync() == -1)
1133 {
1134 this->setstate(ios_base::badbit);
1135 return -1;
1136 }
1137 }
1138#ifndef _LIBCPP_NO_EXCEPTIONS
1139 }
1140 catch (...)
1141 {
1142 this->__set_badbit_and_consider_rethrow();
1143 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001144#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001145 return __r;
1146}
1147
1148template<class _CharT, class _Traits>
1149typename basic_istream<_CharT, _Traits>::pos_type
1150basic_istream<_CharT, _Traits>::tellg()
1151{
1152 pos_type __r(-1);
1153#ifndef _LIBCPP_NO_EXCEPTIONS
1154 try
1155 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001156#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001157 sentry __sen(*this, true);
1158 if (__sen)
1159 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1160#ifndef _LIBCPP_NO_EXCEPTIONS
1161 }
1162 catch (...)
1163 {
1164 this->__set_badbit_and_consider_rethrow();
1165 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001166#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001167 return __r;
1168}
1169
1170template<class _CharT, class _Traits>
1171basic_istream<_CharT, _Traits>&
1172basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1173{
1174#ifndef _LIBCPP_NO_EXCEPTIONS
1175 try
1176 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001177#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0c8d6a42012-08-24 22:03:03 +00001178 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001179 sentry __sen(*this, true);
1180 if (__sen)
Marshall Clow29c4daa2013-10-31 22:20:45 +00001181 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001182 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1183 this->setstate(ios_base::failbit);
Marshall Clow29c4daa2013-10-31 22:20:45 +00001184 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001185#ifndef _LIBCPP_NO_EXCEPTIONS
1186 }
1187 catch (...)
1188 {
1189 this->__set_badbit_and_consider_rethrow();
1190 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001191#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001192 return *this;
1193}
1194
1195template<class _CharT, class _Traits>
1196basic_istream<_CharT, _Traits>&
1197basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1198{
1199#ifndef _LIBCPP_NO_EXCEPTIONS
1200 try
1201 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001202#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clow41d9e3a2015-10-25 18:31:51 +00001203 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001204 sentry __sen(*this, true);
1205 if (__sen)
Marshall Clow29c4daa2013-10-31 22:20:45 +00001206 {
1207 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1208 this->setstate(ios_base::failbit);
1209 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001210#ifndef _LIBCPP_NO_EXCEPTIONS
1211 }
1212 catch (...)
1213 {
1214 this->__set_badbit_and_consider_rethrow();
1215 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001216#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001217 return *this;
1218}
1219
1220template <class _CharT, class _Traits>
1221basic_istream<_CharT, _Traits>&
1222ws(basic_istream<_CharT, _Traits>& __is)
1223{
1224#ifndef _LIBCPP_NO_EXCEPTIONS
1225 try
1226 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001227#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001228 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1229 if (__sen)
1230 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001231 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001232 while (true)
1233 {
1234 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1235 if (_Traits::eq_int_type(__i, _Traits::eof()))
1236 {
1237 __is.setstate(ios_base::eofbit);
1238 break;
1239 }
1240 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001241 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001242 __is.rdbuf()->sbumpc();
1243 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001244 }
1245#ifndef _LIBCPP_NO_EXCEPTIONS
1246 }
1247 catch (...)
1248 {
1249 __is.__set_badbit_and_consider_rethrow();
1250 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001251#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001252 return __is;
1253}
1254
Eric Fiselier78ccf772017-04-18 23:38:41 +00001255#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001256
1257template <class _CharT, class _Traits, class _Tp>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001258inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001259basic_istream<_CharT, _Traits>&
Eric Fiselier7955ef62016-07-24 04:07:22 +00001260operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001261{
Eric Fiselier7955ef62016-07-24 04:07:22 +00001262 __is >> _VSTD::forward<_Tp>(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001263 return __is;
1264}
1265
Eric Fiselier78ccf772017-04-18 23:38:41 +00001266#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001267
1268template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001269class _LIBCPP_TEMPLATE_VIS basic_iostream
Howard Hinnantc51e1022010-05-11 19:42:16 +00001270 : public basic_istream<_CharT, _Traits>,
1271 public basic_ostream<_CharT, _Traits>
1272{
1273public:
1274 // types:
1275 typedef _CharT char_type;
1276 typedef _Traits traits_type;
1277 typedef typename traits_type::int_type int_type;
1278 typedef typename traits_type::pos_type pos_type;
1279 typedef typename traits_type::off_type off_type;
1280
1281 // constructor/destructor
Louis Dionneb4d05d72018-10-16 19:26:23 +00001282 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001283 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1284 : basic_istream<_CharT, _Traits>(__sb)
1285 {}
1286
Howard Hinnantc51e1022010-05-11 19:42:16 +00001287 virtual ~basic_iostream();
1288protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +00001289#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier815ed732016-09-16 00:00:48 +00001290 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001291 basic_iostream(basic_iostream&& __rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001292
1293 // assign/swap
Eric Fiselier815ed732016-09-16 00:00:48 +00001294 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001295 basic_iostream& operator=(basic_iostream&& __rhs);
1296#endif
Louis Dionneb4d05d72018-10-16 19:26:23 +00001297 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +00001298 void swap(basic_iostream& __rhs)
1299 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001300};
1301
Eric Fiselier78ccf772017-04-18 23:38:41 +00001302#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001303
1304template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001305basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001306 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001307{
1308}
1309
1310template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001311basic_iostream<_CharT, _Traits>&
1312basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1313{
1314 swap(__rhs);
1315 return *this;
1316}
1317
Eric Fiselier78ccf772017-04-18 23:38:41 +00001318#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001319
1320template <class _CharT, class _Traits>
1321basic_iostream<_CharT, _Traits>::~basic_iostream()
1322{
1323}
1324
Howard Hinnantc51e1022010-05-11 19:42:16 +00001325template<class _CharT, class _Traits, class _Allocator>
1326basic_istream<_CharT, _Traits>&
1327operator>>(basic_istream<_CharT, _Traits>& __is,
1328 basic_string<_CharT, _Traits, _Allocator>& __str)
1329{
1330#ifndef _LIBCPP_NO_EXCEPTIONS
1331 try
1332 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001333#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1335 if (__sen)
1336 {
1337 __str.clear();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001338 streamsize __n = __is.width();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001339 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001340 __n = __str.max_size();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001341 if (__n <= 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001342 __n = numeric_limits<streamsize>::max();
1343 streamsize __c = 0;
1344 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnante51e4e92011-09-01 21:02:45 +00001345 ios_base::iostate __err = ios_base::goodbit;
1346 while (__c < __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001347 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001348 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1349 if (_Traits::eq_int_type(__i, _Traits::eof()))
1350 {
1351 __err |= ios_base::eofbit;
1352 break;
1353 }
1354 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001355 if (__ct.is(__ct.space, __ch))
1356 break;
1357 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001358 ++__c;
1359 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001360 }
1361 __is.width(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001362 if (__c == 0)
1363 __err |= ios_base::failbit;
1364 __is.setstate(__err);
1365 }
1366 else
1367 __is.setstate(ios_base::failbit);
1368#ifndef _LIBCPP_NO_EXCEPTIONS
1369 }
1370 catch (...)
1371 {
1372 __is.__set_badbit_and_consider_rethrow();
1373 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001374#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001375 return __is;
1376}
1377
1378template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001379basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001380getline(basic_istream<_CharT, _Traits>& __is,
1381 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1382{
1383#ifndef _LIBCPP_NO_EXCEPTIONS
1384 try
1385 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001386#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001387 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1388 if (__sen)
1389 {
1390 __str.clear();
Howard Hinnante51e4e92011-09-01 21:02:45 +00001391 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnante992f762011-10-09 15:20:46 +00001392 streamsize __extr = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001393 while (true)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001394 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001395 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1396 if (_Traits::eq_int_type(__i, _Traits::eof()))
1397 {
1398 __err |= ios_base::eofbit;
1399 break;
1400 }
Howard Hinnante992f762011-10-09 15:20:46 +00001401 ++__extr;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001402 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001403 if (_Traits::eq(__ch, __dlm))
1404 break;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001405 __str.push_back(__ch);
1406 if (__str.size() == __str.max_size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001407 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001408 __err |= ios_base::failbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001409 break;
1410 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001411 }
Howard Hinnante992f762011-10-09 15:20:46 +00001412 if (__extr == 0)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001413 __err |= ios_base::failbit;
1414 __is.setstate(__err);
1415 }
1416#ifndef _LIBCPP_NO_EXCEPTIONS
1417 }
1418 catch (...)
1419 {
1420 __is.__set_badbit_and_consider_rethrow();
1421 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001422#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001423 return __is;
1424}
1425
1426template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001427inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001428basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001429getline(basic_istream<_CharT, _Traits>& __is,
1430 basic_string<_CharT, _Traits, _Allocator>& __str)
1431{
1432 return getline(__is, __str, __is.widen('\n'));
1433}
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, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001438inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001439basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440getline(basic_istream<_CharT, _Traits>&& __is,
1441 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1442{
1443 return getline(__is, __str, __dlm);
1444}
1445
1446template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001447inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001448basic_istream<_CharT, _Traits>&
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449getline(basic_istream<_CharT, _Traits>&& __is,
1450 basic_string<_CharT, _Traits, _Allocator>& __str)
1451{
1452 return getline(__is, __str, __is.widen('\n'));
1453}
1454
Eric Fiselier78ccf772017-04-18 23:38:41 +00001455#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001456
1457template <class _CharT, class _Traits, size_t _Size>
1458basic_istream<_CharT, _Traits>&
1459operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1460{
1461#ifndef _LIBCPP_NO_EXCEPTIONS
1462 try
1463 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001464#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001465 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1466 if (__sen)
1467 {
1468 basic_string<_CharT, _Traits> __str;
1469 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier37c22152016-12-24 00:24:44 +00001470 size_t __c = 0;
Howard Hinnante51e4e92011-09-01 21:02:45 +00001471 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001472 _CharT __zero = __ct.widen('0');
1473 _CharT __one = __ct.widen('1');
Howard Hinnante51e4e92011-09-01 21:02:45 +00001474 while (__c < _Size)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001475 {
Howard Hinnante51e4e92011-09-01 21:02:45 +00001476 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1477 if (_Traits::eq_int_type(__i, _Traits::eof()))
1478 {
1479 __err |= ios_base::eofbit;
1480 break;
1481 }
1482 _CharT __ch = _Traits::to_char_type(__i);
1483 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001484 break;
1485 __str.push_back(__ch);
Howard Hinnante51e4e92011-09-01 21:02:45 +00001486 ++__c;
1487 __is.rdbuf()->sbumpc();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001489 __x = bitset<_Size>(__str);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001490 if (__c == 0)
1491 __err |= ios_base::failbit;
1492 __is.setstate(__err);
1493 }
1494 else
1495 __is.setstate(ios_base::failbit);
1496#ifndef _LIBCPP_NO_EXCEPTIONS
1497 }
1498 catch (...)
1499 {
1500 __is.__set_badbit_and_consider_rethrow();
1501 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001502#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001503 return __is;
1504}
1505
Louis Dionne207a9102018-12-06 00:24:58 +00001506#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001507_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1508_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1509_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Mehdi Amini228053d2017-05-04 17:08:54 +00001510#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001511
1512_LIBCPP_END_NAMESPACE_STD
1513
Eric Fiselierf4433a32017-05-31 22:07:49 +00001514_LIBCPP_POP_MACROS
1515
Howard Hinnantc51e1022010-05-11 19:42:16 +00001516#endif // _LIBCPP_ISTREAM