blob: 30ee4f4b8710b92a22beb67deb3d68148924a1f4 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- istream ----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_ISTREAM
12#define _LIBCPP_ISTREAM
13
14/*
15 istream synopsis
16
17template <class charT, class traits = char_traits<charT> >
18class basic_istream
19 : virtual public basic_ios<charT,traits>
20{
21public:
22 // types (inherited from basic_ios (27.5.4)):
23 typedef charT char_type;
24 typedef traits traits_type;
25 typedef typename traits_type::int_type int_type;
26 typedef typename traits_type::pos_type pos_type;
27 typedef typename traits_type::off_type off_type;
28
29 // 27.7.1.1.1 Constructor/destructor:
30 explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
31 basic_istream(basic_istream&& rhs);
32 virtual ~basic_istream();
33
34 // 27.7.1.1.2 Assign/swap:
35 basic_istream& operator=(basic_istream&& rhs);
36 void swap(basic_istream& rhs);
37
38 // 27.7.1.1.3 Prefix/suffix:
39 class sentry;
40
41 // 27.7.1.2 Formatted input:
42 basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
43 basic_istream& operator>>(basic_ios<char_type, traits_type>&
44 (*pf)(basic_ios<char_type, traits_type>&));
45 basic_istream& operator>>(ios_base& (*pf)(ios_base&));
46 basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
47 basic_istream& operator>>(bool& n);
48 basic_istream& operator>>(short& n);
49 basic_istream& operator>>(unsigned short& n);
50 basic_istream& operator>>(int& n);
51 basic_istream& operator>>(unsigned int& n);
52 basic_istream& operator>>(long& n);
53 basic_istream& operator>>(unsigned long& n);
54 basic_istream& operator>>(long long& n);
55 basic_istream& operator>>(unsigned long long& n);
56 basic_istream& operator>>(float& f);
57 basic_istream& operator>>(double& f);
58 basic_istream& operator>>(long double& f);
59 basic_istream& operator>>(void*& p);
60
61 // 27.7.1.3 Unformatted input:
62 streamsize gcount() const;
63 int_type get();
64 basic_istream& get(char_type& c);
65 basic_istream& get(char_type* s, streamsize n);
66 basic_istream& get(char_type* s, streamsize n, char_type delim);
67 basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
68 basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
69
70 basic_istream& getline(char_type* s, streamsize n);
71 basic_istream& getline(char_type* s, streamsize n, char_type delim);
72
73 basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
74 int_type peek();
75 basic_istream& read (char_type* s, streamsize n);
76 streamsize readsome(char_type* s, streamsize n);
77
78 basic_istream& putback(char_type c);
79 basic_istream& unget();
80 int sync();
81
82 pos_type tellg();
83 basic_istream& seekg(pos_type);
84 basic_istream& seekg(off_type, ios_base::seekdir);
Marshall Clow546eca82014-09-16 15:27:01 +000085protected:
86 basic_istream(const basic_istream& rhs) = delete;
87 basic_istream(basic_istream&& rhs);
88 // 27.7.2.1.2 Assign/swap:
89 basic_istream& operator=(const basic_istream& rhs) = delete;
90 basic_istream& operator=(basic_istream&& rhs);
91 void swap(basic_istream& rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000092};
93
94// 27.7.1.2.3 character extraction templates:
95template<class charT, class traits>
96 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
97
98template<class traits>
99 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
100
101template<class traits>
102 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
103
104template<class charT, class traits>
105 basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
106
107template<class traits>
108 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
109
110template<class traits>
111 basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
112
113template <class charT, class traits>
114 void
115 swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
116
117typedef basic_istream<char> istream;
118typedef basic_istream<wchar_t> wistream;
119
120template <class charT, class traits = char_traits<charT> >
121class basic_iostream :
122 public basic_istream<charT,traits>,
123 public basic_ostream<charT,traits>
124{
125public:
126 // types:
127 typedef charT char_type;
128 typedef traits traits_type;
129 typedef typename traits_type::int_type int_type;
130 typedef typename traits_type::pos_type pos_type;
131 typedef typename traits_type::off_type off_type;
132
133 // constructor/destructor
134 explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
135 basic_iostream(basic_iostream&& rhs);
136 virtual ~basic_iostream();
137
138 // assign/swap
139 basic_iostream& operator=(basic_iostream&& rhs);
140 void swap(basic_iostream& rhs);
141};
142
143template <class charT, class traits>
144 void
145 swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
146
147typedef basic_iostream<char> iostream;
148typedef basic_iostream<wchar_t> wiostream;
149
150template <class charT, class traits>
151 basic_istream<charT,traits>&
152 ws(basic_istream<charT,traits>& is);
153
154template <class charT, class traits, class T>
155 basic_istream<charT, traits>&
156 operator>>(basic_istream<charT, traits>&& is, T& x);
157
158} // std
159
160*/
161
162#include <__config>
Marshall Clow96484472018-12-11 04:35:44 +0000163#include <version>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000164#include <ostream>
165
Howard Hinnant08e17472011-10-17 20:05:10 +0000166#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000167#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000168#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000169
Eric Fiselier018a3d52017-05-31 22:07:49 +0000170_LIBCPP_PUSH_MACROS
171#include <__undef_macros>
172
173
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000174_LIBCPP_BEGIN_NAMESPACE_STD
175
176template <class _CharT, class _Traits>
Eric Fiselierc3589a82017-01-04 23:56:00 +0000177class _LIBCPP_TEMPLATE_VIS basic_istream
Howard Hinnantbc8d3f92010-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 Dionne3845a652018-10-16 19:26:23 +0000190 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-09-16 00:00:48 +0000191 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
192 { this->init(__sb); }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000193 virtual ~basic_istream();
194protected:
Eric Fiseliere915b5c2017-04-18 23:38:41 +0000195#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier6dbed462016-09-16 00:00:48 +0000196 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000197 basic_istream(basic_istream&& __rhs);
Eric Fiseliere915b5c2017-04-18 23:38:41 +0000198
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000199 // 27.7.1.1.2 Assign/swap:
Eric Fiselier6dbed462016-09-16 00:00:48 +0000200 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000201 basic_istream& operator=(basic_istream&& __rhs);
202#endif
Eric Fiselier6dbed462016-09-16 00:00:48 +0000203
Louis Dionne3845a652018-10-16 19:26:23 +0000204 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-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 Clow546eca82014-09-16 15:27:01 +0000209
Eric Fiselier8eb066a2017-01-06 20:58:25 +0000210#ifndef _LIBCPP_CXX03_LANG
Marshall Clowd1fae172014-09-16 15:33:53 +0000211 basic_istream (const basic_istream& __rhs) = delete;
212 basic_istream& operator=(const basic_istream& __rhs) = delete;
Marshall Clow546eca82014-09-16 15:27:01 +0000213#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000214public:
215
216 // 27.7.1.1.3 Prefix/suffix:
Eric Fiselierc3589a82017-01-04 23:56:00 +0000217 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000218
219 // 27.7.1.2 Formatted input:
Louis Dionne3845a652018-10-16 19:26:23 +0000220 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-09-16 00:00:48 +0000221 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
222 { return __pf(*this); }
223
Louis Dionne3845a652018-10-16 19:26:23 +0000224 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000225 basic_istream& operator>>(basic_ios<char_type, traits_type>&
Eric Fiselier6dbed462016-09-16 00:00:48 +0000226 (*__pf)(basic_ios<char_type, traits_type>&))
227 { __pf(*this); return *this; }
228
Louis Dionne3845a652018-10-16 19:26:23 +0000229 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-09-16 00:00:48 +0000230 basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
231 { __pf(*this); return *this; }
232
Howard Hinnantbc8d3f92010-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 Hinnant68a8e902010-09-22 15:29:08 +0000249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000250 streamsize gcount() const {return __gc_;}
251 int_type get();
Eric Fiselier6dbed462016-09-16 00:00:48 +0000252
Louis Dionne3845a652018-10-16 19:26:23 +0000253 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-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 Dionne3845a652018-10-16 19:26:23 +0000261 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-09-16 00:00:48 +0000262 basic_istream& get(char_type* __s, streamsize __n)
263 { return get(__s, __n, this->widen('\n')); }
264
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000265 basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
Eric Fiselier6dbed462016-09-16 00:00:48 +0000266
Louis Dionne3845a652018-10-16 19:26:23 +0000267 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-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 Hinnantbc8d3f92010-05-11 19:42:16 +0000271 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
272
Louis Dionne3845a652018-10-16 19:26:23 +0000273 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-09-16 00:00:48 +0000274 basic_istream& getline(char_type* __s, streamsize __n)
275 { return getline(__s, __n, this->widen('\n')); }
276
Howard Hinnantbc8d3f92010-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 Fiselierc3589a82017-01-04 23:56:00 +0000294class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
Howard Hinnantbc8d3f92010-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 Hinnant68a8e902010-09-22 15:29:08 +0000305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant77861882012-02-21 21:46:43 +0000306 _LIBCPP_EXPLICIT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000307 operator bool() const {return __ok_;}
308};
309
310template <class _CharT, class _Traits>
311basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
312 bool __noskipws)
313 : __ok_(false)
314{
315 if (__is.good())
316 {
317 if (__is.tie())
318 __is.tie()->flush();
319 if (!__noskipws && (__is.flags() & ios_base::skipws))
320 {
Howard Hinnant99968442011-11-29 18:15:50 +0000321 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000322 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant99968442011-11-29 18:15:50 +0000323 _Ip __i(__is);
324 _Ip __eof;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000325 for (; __i != __eof; ++__i)
326 if (!__ct.is(__ct.space, *__i))
327 break;
328 if (__i == __eof)
329 __is.setstate(ios_base::failbit | ios_base::eofbit);
330 }
331 __ok_ = __is.good();
332 }
333 else
334 __is.setstate(ios_base::failbit);
335}
336
Eric Fiseliere915b5c2017-04-18 23:38:41 +0000337#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000338
339template <class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000340basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
341 : __gc_(__rhs.__gc_)
342{
343 __rhs.__gc_ = 0;
344 this->move(__rhs);
345}
346
347template <class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000348basic_istream<_CharT, _Traits>&
349basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
350{
351 swap(__rhs);
352 return *this;
353}
354
Eric Fiseliere915b5c2017-04-18 23:38:41 +0000355#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000356
357template <class _CharT, class _Traits>
358basic_istream<_CharT, _Traits>::~basic_istream()
359{
360}
361
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000362template <class _Tp, class _CharT, class _Traits>
363_LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000364basic_istream<_CharT, _Traits>&
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000365__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000366#ifndef _LIBCPP_NO_EXCEPTIONS
367 try
368 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000369#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000370 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000371 if (__s)
372 {
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000373 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
374 typedef num_get<_CharT, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000375 ios_base::iostate __err = ios_base::goodbit;
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000376 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __n);
377 __is.setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000378 }
379#ifndef _LIBCPP_NO_EXCEPTIONS
380 }
381 catch (...)
382 {
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000383 __is.__set_badbit_and_consider_rethrow();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000384 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000385#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000386 return __is;
387}
388
389template <class _CharT, class _Traits>
390basic_istream<_CharT, _Traits>&
391basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
392{
393 return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000394}
395
396template <class _CharT, class _Traits>
397basic_istream<_CharT, _Traits>&
398basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
399{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000400 return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000401}
402
403template <class _CharT, class _Traits>
404basic_istream<_CharT, _Traits>&
405basic_istream<_CharT, _Traits>::operator>>(long& __n)
406{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000407 return _VSTD::__input_arithmetic<long>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000408}
409
410template <class _CharT, class _Traits>
411basic_istream<_CharT, _Traits>&
412basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
413{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000414 return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000415}
416
417template <class _CharT, class _Traits>
418basic_istream<_CharT, _Traits>&
419basic_istream<_CharT, _Traits>::operator>>(long long& __n)
420{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000421 return _VSTD::__input_arithmetic<long long>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000422}
423
424template <class _CharT, class _Traits>
425basic_istream<_CharT, _Traits>&
426basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
427{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000428 return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000429}
430
431template <class _CharT, class _Traits>
432basic_istream<_CharT, _Traits>&
433basic_istream<_CharT, _Traits>::operator>>(float& __n)
434{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000435 return _VSTD::__input_arithmetic<float>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000436}
437
438template <class _CharT, class _Traits>
439basic_istream<_CharT, _Traits>&
440basic_istream<_CharT, _Traits>::operator>>(double& __n)
441{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000442 return _VSTD::__input_arithmetic<double>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000443}
444
445template <class _CharT, class _Traits>
446basic_istream<_CharT, _Traits>&
447basic_istream<_CharT, _Traits>::operator>>(long double& __n)
448{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000449 return _VSTD::__input_arithmetic<long double>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000450}
451
452template <class _CharT, class _Traits>
453basic_istream<_CharT, _Traits>&
454basic_istream<_CharT, _Traits>::operator>>(bool& __n)
455{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000456 return _VSTD::__input_arithmetic<bool>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000457}
458
459template <class _CharT, class _Traits>
460basic_istream<_CharT, _Traits>&
461basic_istream<_CharT, _Traits>::operator>>(void*& __n)
462{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000463 return _VSTD::__input_arithmetic<void*>(*this, __n);
464}
465
466template <class _Tp, class _CharT, class _Traits>
467_LIBCPP_INLINE_VISIBILITY
468basic_istream<_CharT, _Traits>&
469__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000470#ifndef _LIBCPP_NO_EXCEPTIONS
471 try
472 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000473#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000474 typename basic_istream<_CharT, _Traits>::sentry __s(__is);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000475 if (__s)
476 {
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000477 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
478 typedef num_get<_CharT, _Ip> _Fp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000479 ios_base::iostate __err = ios_base::goodbit;
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000480 long __temp;
481 use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __temp);
482 if (__temp < numeric_limits<_Tp>::min())
483 {
484 __err |= ios_base::failbit;
485 __n = numeric_limits<_Tp>::min();
486 }
487 else if (__temp > numeric_limits<_Tp>::max())
488 {
489 __err |= ios_base::failbit;
490 __n = numeric_limits<_Tp>::max();
491 }
492 else
493 __n = static_cast<_Tp>(__temp);
494 __is.setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000495 }
496#ifndef _LIBCPP_NO_EXCEPTIONS
497 }
498 catch (...)
499 {
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000500 __is.__set_badbit_and_consider_rethrow();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000501 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000502#endif // _LIBCPP_NO_EXCEPTIONS
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000503 return __is;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000504}
505
506template <class _CharT, class _Traits>
507basic_istream<_CharT, _Traits>&
508basic_istream<_CharT, _Traits>::operator>>(short& __n)
509{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000510 return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000511}
512
513template <class _CharT, class _Traits>
514basic_istream<_CharT, _Traits>&
515basic_istream<_CharT, _Traits>::operator>>(int& __n)
516{
Louis Dionnea1ae56c2018-07-25 19:40:01 +0000517 return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000518}
519
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520template<class _CharT, class _Traits>
Zhihao Yuan580cde02018-11-21 03:30:10 +0000521_LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000522basic_istream<_CharT, _Traits>&
Zhihao Yuan580cde02018-11-21 03:30:10 +0000523__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000524{
525#ifndef _LIBCPP_NO_EXCEPTIONS
526 try
527 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000528#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000529 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
530 if (__sen)
531 {
Zhihao Yuan580cde02018-11-21 03:30:10 +0000532 auto __s = __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000533 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +0000534 ios_base::iostate __err = ios_base::goodbit;
Zhihao Yuan580cde02018-11-21 03:30:10 +0000535 while (__s != __p + (__n-1))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000536 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000537 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
538 if (_Traits::eq_int_type(__i, _Traits::eof()))
539 {
540 __err |= ios_base::eofbit;
541 break;
542 }
543 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000544 if (__ct.is(__ct.space, __ch))
545 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000546 *__s++ = __ch;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000547 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000548 }
549 *__s = _CharT();
550 __is.width(0);
Zhihao Yuan580cde02018-11-21 03:30:10 +0000551 if (__s == __p)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000552 __err |= ios_base::failbit;
553 __is.setstate(__err);
554 }
555#ifndef _LIBCPP_NO_EXCEPTIONS
556 }
557 catch (...)
558 {
559 __is.__set_badbit_and_consider_rethrow();
560 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000561#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000562 return __is;
563}
564
Zhihao Yuan580cde02018-11-21 03:30:10 +0000565#if _LIBCPP_STD_VER > 17
566
567template<class _CharT, class _Traits, size_t _Np>
568inline _LIBCPP_INLINE_VISIBILITY
569basic_istream<_CharT, _Traits>&
570operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
571{
572 auto __n = _Np;
573 if (__is.width() > 0)
574 __n = _VSTD::min(size_t(__is.width()), _Np);
575 return _VSTD::__input_c_string(__is, __buf, __n);
576}
577
578template<class _Traits, size_t _Np>
579inline _LIBCPP_INLINE_VISIBILITY
580basic_istream<char, _Traits>&
581operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
582{
583 return __is >> (char(&)[_Np])__buf;
584}
585
586template<class _Traits, size_t _Np>
587inline _LIBCPP_INLINE_VISIBILITY
588basic_istream<char, _Traits>&
589operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
590{
591 return __is >> (char(&)[_Np])__buf;
592}
593
594#else
595
596template<class _CharT, class _Traits>
597inline _LIBCPP_INLINE_VISIBILITY
598basic_istream<_CharT, _Traits>&
599operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
600{
601 streamsize __n = __is.width();
602 if (__n <= 0)
603 __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
604 return _VSTD::__input_c_string(__is, __s, size_t(__n));
605}
606
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000607template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000608inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000609basic_istream<char, _Traits>&
610operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
611{
612 return __is >> (char*)__s;
613}
614
615template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000616inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000617basic_istream<char, _Traits>&
618operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
619{
620 return __is >> (char*)__s;
621}
622
Zhihao Yuan580cde02018-11-21 03:30:10 +0000623#endif // _LIBCPP_STD_VER > 17
624
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000625template<class _CharT, class _Traits>
626basic_istream<_CharT, _Traits>&
627operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
628{
629#ifndef _LIBCPP_NO_EXCEPTIONS
630 try
631 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000632#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000633 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
634 if (__sen)
635 {
Howard Hinnantdf85e572011-02-27 18:02:02 +0000636 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
637 if (_Traits::eq_int_type(__i, _Traits::eof()))
638 __is.setstate(ios_base::eofbit | ios_base::failbit);
639 else
640 __c = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000641 }
642#ifndef _LIBCPP_NO_EXCEPTIONS
643 }
644 catch (...)
645 {
646 __is.__set_badbit_and_consider_rethrow();
647 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000648#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000649 return __is;
650}
651
652template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000653inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000654basic_istream<char, _Traits>&
655operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
656{
657 return __is >> (char&)__c;
658}
659
660template<class _Traits>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +0000661inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000662basic_istream<char, _Traits>&
663operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
664{
665 return __is >> (char&)__c;
666}
667
668template<class _CharT, class _Traits>
669basic_istream<_CharT, _Traits>&
670basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
671{
672 __gc_ = 0;
673#ifndef _LIBCPP_NO_EXCEPTIONS
674 try
675 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000676#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000677 sentry __s(*this, true);
678 if (__s)
679 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000680 if (__sb)
681 {
682#ifndef _LIBCPP_NO_EXCEPTIONS
683 try
684 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000685#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000686 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000687 while (true)
688 {
689 typename traits_type::int_type __i = this->rdbuf()->sgetc();
690 if (traits_type::eq_int_type(__i, _Traits::eof()))
691 {
692 __err |= ios_base::eofbit;
693 break;
694 }
695 if (traits_type::eq_int_type(
696 __sb->sputc(traits_type::to_char_type(__i)),
697 traits_type::eof()))
698 break;
699 ++__gc_;
700 this->rdbuf()->sbumpc();
701 }
702 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000703 __err |= ios_base::failbit;
704 this->setstate(__err);
705#ifndef _LIBCPP_NO_EXCEPTIONS
706 }
707 catch (...)
708 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000709 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000710 this->__set_failbit_and_consider_rethrow();
711 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000712#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000713 }
714 else
715 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000716 }
717#ifndef _LIBCPP_NO_EXCEPTIONS
718 }
719 catch (...)
720 {
721 this->__set_badbit_and_consider_rethrow();
722 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000723#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000724 return *this;
725}
726
727template<class _CharT, class _Traits>
728typename basic_istream<_CharT, _Traits>::int_type
729basic_istream<_CharT, _Traits>::get()
730{
731 __gc_ = 0;
732 int_type __r = traits_type::eof();
733#ifndef _LIBCPP_NO_EXCEPTIONS
734 try
735 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000736#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000737 sentry __s(*this, true);
738 if (__s)
739 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000740 __r = this->rdbuf()->sbumpc();
741 if (traits_type::eq_int_type(__r, traits_type::eof()))
742 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000743 else
Howard Hinnant92a836c2011-09-01 21:02:45 +0000744 __gc_ = 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000745 }
746#ifndef _LIBCPP_NO_EXCEPTIONS
747 }
748 catch (...)
749 {
750 this->__set_badbit_and_consider_rethrow();
751 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000752#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000753 return __r;
754}
755
756template<class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000757basic_istream<_CharT, _Traits>&
758basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
759{
760 __gc_ = 0;
761#ifndef _LIBCPP_NO_EXCEPTIONS
762 try
763 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000764#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000765 sentry __sen(*this, true);
766 if (__sen)
767 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000768 if (__n > 0)
769 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000770 ios_base::iostate __err = ios_base::goodbit;
771 while (__gc_ < __n-1)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000772 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000773 int_type __i = this->rdbuf()->sgetc();
774 if (traits_type::eq_int_type(__i, traits_type::eof()))
775 {
776 __err |= ios_base::eofbit;
777 break;
778 }
779 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000780 if (traits_type::eq(__ch, __dlm))
781 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000782 *__s++ = __ch;
783 ++__gc_;
784 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000785 }
Howard Hinnant92a836c2011-09-01 21:02:45 +0000786 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000787 __err |= ios_base::failbit;
788 this->setstate(__err);
789 }
790 else
791 this->setstate(ios_base::failbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000792 }
Volodymyr Sapsai68050ff2018-01-11 23:23:49 +0000793 if (__n > 0)
794 *__s = char_type();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000795#ifndef _LIBCPP_NO_EXCEPTIONS
796 }
797 catch (...)
798 {
Volodymyr Sapsai68050ff2018-01-11 23:23:49 +0000799 if (__n > 0)
800 *__s = char_type();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000801 this->__set_badbit_and_consider_rethrow();
802 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000803#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000804 return *this;
805}
806
807template<class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000808basic_istream<_CharT, _Traits>&
809basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
810 char_type __dlm)
811{
812 __gc_ = 0;
813#ifndef _LIBCPP_NO_EXCEPTIONS
814 try
815 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000816#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000817 sentry __sen(*this, true);
818 if (__sen)
819 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000820 ios_base::iostate __err = ios_base::goodbit;
821#ifndef _LIBCPP_NO_EXCEPTIONS
822 try
823 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000824#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +0000825 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000826 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000827 typename traits_type::int_type __i = this->rdbuf()->sgetc();
828 if (traits_type::eq_int_type(__i, traits_type::eof()))
829 {
830 __err |= ios_base::eofbit;
831 break;
832 }
833 char_type __ch = traits_type::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000834 if (traits_type::eq(__ch, __dlm))
835 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000836 if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000837 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +0000838 ++__gc_;
839 this->rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000840 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000841#ifndef _LIBCPP_NO_EXCEPTIONS
842 }
843 catch (...)
844 {
845 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000846#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +0000847 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000848 __err |= ios_base::failbit;
849 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000850 }
851#ifndef _LIBCPP_NO_EXCEPTIONS
852 }
853 catch (...)
854 {
855 this->__set_badbit_and_consider_rethrow();
856 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000857#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000858 return *this;
859}
860
861template<class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000862basic_istream<_CharT, _Traits>&
863basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
864{
865 __gc_ = 0;
866#ifndef _LIBCPP_NO_EXCEPTIONS
867 try
868 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000869#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000870 sentry __sen(*this, true);
871 if (__sen)
872 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000873 ios_base::iostate __err = ios_base::goodbit;
874 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000875 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000876 typename traits_type::int_type __i = this->rdbuf()->sgetc();
877 if (traits_type::eq_int_type(__i, traits_type::eof()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000878 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000879 __err |= ios_base::eofbit;
880 break;
881 }
882 char_type __ch = traits_type::to_char_type(__i);
883 if (traits_type::eq(__ch, __dlm))
884 {
885 this->rdbuf()->sbumpc();
886 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000887 break;
888 }
Howard Hinnant92a836c2011-09-01 21:02:45 +0000889 if (__gc_ >= __n-1)
890 {
891 __err |= ios_base::failbit;
892 break;
893 }
894 *__s++ = __ch;
895 this->rdbuf()->sbumpc();
896 ++__gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000897 }
Howard Hinnant92a836c2011-09-01 21:02:45 +0000898 if (__gc_ == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000899 __err |= ios_base::failbit;
900 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000901 }
Volodymyr Sapsai2744cdf2017-11-22 18:52:36 +0000902 if (__n > 0)
903 *__s = char_type();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000904#ifndef _LIBCPP_NO_EXCEPTIONS
905 }
906 catch (...)
907 {
Volodymyr Sapsai2744cdf2017-11-22 18:52:36 +0000908 if (__n > 0)
909 *__s = char_type();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000910 this->__set_badbit_and_consider_rethrow();
911 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000912#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000913 return *this;
914}
915
916template<class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000917basic_istream<_CharT, _Traits>&
918basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
919{
920 __gc_ = 0;
921#ifndef _LIBCPP_NO_EXCEPTIONS
922 try
923 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000924#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000925 sentry __sen(*this, true);
926 if (__sen)
927 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000928 ios_base::iostate __err = ios_base::goodbit;
929 if (__n == numeric_limits<streamsize>::max())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000930 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000931 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000932 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000933 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
934 if (traits_type::eq_int_type(__i, traits_type::eof()))
935 {
936 __err |= ios_base::eofbit;
937 break;
938 }
939 ++__gc_;
Howard Hinnant11b87182013-07-01 00:37:50 +0000940 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000941 break;
942 }
943 }
944 else
945 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000946 while (__gc_ < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000947 {
Howard Hinnant92a836c2011-09-01 21:02:45 +0000948 typename traits_type::int_type __i = this->rdbuf()->sbumpc();
949 if (traits_type::eq_int_type(__i, traits_type::eof()))
950 {
951 __err |= ios_base::eofbit;
952 break;
953 }
954 ++__gc_;
Howard Hinnant11b87182013-07-01 00:37:50 +0000955 if (traits_type::eq_int_type(__i, __dlm))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000956 break;
957 }
958 }
Howard Hinnant92a836c2011-09-01 21:02:45 +0000959 this->setstate(__err);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000960 }
961#ifndef _LIBCPP_NO_EXCEPTIONS
962 }
963 catch (...)
964 {
965 this->__set_badbit_and_consider_rethrow();
966 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000967#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000968 return *this;
969}
970
971template<class _CharT, class _Traits>
972typename basic_istream<_CharT, _Traits>::int_type
973basic_istream<_CharT, _Traits>::peek()
974{
975 __gc_ = 0;
976 int_type __r = traits_type::eof();
977#ifndef _LIBCPP_NO_EXCEPTIONS
978 try
979 {
Howard Hinnant324bb032010-08-22 00:02:43 +0000980#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000981 sentry __sen(*this, true);
982 if (__sen)
Howard Hinnant73c85c72012-11-01 17:32:07 +0000983 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000984 __r = this->rdbuf()->sgetc();
Howard Hinnant73c85c72012-11-01 17:32:07 +0000985 if (traits_type::eq_int_type(__r, traits_type::eof()))
986 this->setstate(ios_base::eofbit);
987 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000988#ifndef _LIBCPP_NO_EXCEPTIONS
989 }
990 catch (...)
991 {
992 this->__set_badbit_and_consider_rethrow();
993 }
Howard Hinnant324bb032010-08-22 00:02:43 +0000994#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000995 return __r;
996}
997
998template<class _CharT, class _Traits>
999basic_istream<_CharT, _Traits>&
1000basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1001{
1002 __gc_ = 0;
1003#ifndef _LIBCPP_NO_EXCEPTIONS
1004 try
1005 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001006#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001007 sentry __sen(*this, true);
1008 if (__sen)
1009 {
Howard Hinnantcc7bdae2013-03-06 19:27:56 +00001010 __gc_ = this->rdbuf()->sgetn(__s, __n);
1011 if (__gc_ != __n)
1012 this->setstate(ios_base::failbit | ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001013 }
1014 else
1015 this->setstate(ios_base::failbit);
1016#ifndef _LIBCPP_NO_EXCEPTIONS
1017 }
1018 catch (...)
1019 {
1020 this->__set_badbit_and_consider_rethrow();
1021 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001022#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001023 return *this;
1024}
1025
1026template<class _CharT, class _Traits>
1027streamsize
1028basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1029{
Howard Hinnantee717d82012-12-20 15:40:28 +00001030 __gc_ = 0;
Marshall Clowa80de492016-07-13 16:58:48 +00001031#ifndef _LIBCPP_NO_EXCEPTIONS
1032 try
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001033 {
Marshall Clowa80de492016-07-13 16:58:48 +00001034#endif // _LIBCPP_NO_EXCEPTIONS
1035 sentry __sen(*this, true);
1036 if (__sen)
1037 {
1038 streamsize __c = this->rdbuf()->in_avail();
1039 switch (__c)
1040 {
1041 case -1:
1042 this->setstate(ios_base::eofbit);
1043 break;
1044 case 0:
1045 break;
1046 default:
1047 read(__s, _VSTD::min(__c, __n));
1048 break;
1049 }
1050 }
1051 else
1052 this->setstate(ios_base::failbit);
1053#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001054 }
Marshall Clowa80de492016-07-13 16:58:48 +00001055 catch (...)
1056 {
1057 this->__set_badbit_and_consider_rethrow();
1058 }
1059#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant92a836c2011-09-01 21:02:45 +00001060 return __gc_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001061}
1062
1063template<class _CharT, class _Traits>
1064basic_istream<_CharT, _Traits>&
1065basic_istream<_CharT, _Traits>::putback(char_type __c)
1066{
1067 __gc_ = 0;
1068#ifndef _LIBCPP_NO_EXCEPTIONS
1069 try
1070 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001071#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001072 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001073 sentry __sen(*this, true);
1074 if (__sen)
1075 {
1076 if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1077 this->setstate(ios_base::badbit);
1078 }
1079 else
1080 this->setstate(ios_base::failbit);
1081#ifndef _LIBCPP_NO_EXCEPTIONS
1082 }
1083 catch (...)
1084 {
1085 this->__set_badbit_and_consider_rethrow();
1086 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001087#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001088 return *this;
1089}
1090
1091template<class _CharT, class _Traits>
1092basic_istream<_CharT, _Traits>&
1093basic_istream<_CharT, _Traits>::unget()
1094{
1095 __gc_ = 0;
1096#ifndef _LIBCPP_NO_EXCEPTIONS
1097 try
1098 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001099#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001100 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001101 sentry __sen(*this, true);
1102 if (__sen)
1103 {
1104 if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1105 this->setstate(ios_base::badbit);
1106 }
1107 else
1108 this->setstate(ios_base::failbit);
1109#ifndef _LIBCPP_NO_EXCEPTIONS
1110 }
1111 catch (...)
1112 {
1113 this->__set_badbit_and_consider_rethrow();
1114 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001115#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001116 return *this;
1117}
1118
1119template<class _CharT, class _Traits>
1120int
1121basic_istream<_CharT, _Traits>::sync()
1122{
1123 int __r = 0;
1124#ifndef _LIBCPP_NO_EXCEPTIONS
1125 try
1126 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001127#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001128 sentry __sen(*this, true);
1129 if (__sen)
1130 {
1131 if (this->rdbuf() == 0)
1132 return -1;
1133 if (this->rdbuf()->pubsync() == -1)
1134 {
1135 this->setstate(ios_base::badbit);
1136 return -1;
1137 }
1138 }
1139#ifndef _LIBCPP_NO_EXCEPTIONS
1140 }
1141 catch (...)
1142 {
1143 this->__set_badbit_and_consider_rethrow();
1144 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001145#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001146 return __r;
1147}
1148
1149template<class _CharT, class _Traits>
1150typename basic_istream<_CharT, _Traits>::pos_type
1151basic_istream<_CharT, _Traits>::tellg()
1152{
1153 pos_type __r(-1);
1154#ifndef _LIBCPP_NO_EXCEPTIONS
1155 try
1156 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001157#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001158 sentry __sen(*this, true);
1159 if (__sen)
1160 __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1161#ifndef _LIBCPP_NO_EXCEPTIONS
1162 }
1163 catch (...)
1164 {
1165 this->__set_badbit_and_consider_rethrow();
1166 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001167#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001168 return __r;
1169}
1170
1171template<class _CharT, class _Traits>
1172basic_istream<_CharT, _Traits>&
1173basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1174{
1175#ifndef _LIBCPP_NO_EXCEPTIONS
1176 try
1177 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001178#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant37bdf0e2012-08-24 22:03:03 +00001179 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001180 sentry __sen(*this, true);
1181 if (__sen)
Marshall Clow76a86702013-10-31 22:20:45 +00001182 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001183 if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1184 this->setstate(ios_base::failbit);
Marshall Clow76a86702013-10-31 22:20:45 +00001185 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001186#ifndef _LIBCPP_NO_EXCEPTIONS
1187 }
1188 catch (...)
1189 {
1190 this->__set_badbit_and_consider_rethrow();
1191 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001192#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001193 return *this;
1194}
1195
1196template<class _CharT, class _Traits>
1197basic_istream<_CharT, _Traits>&
1198basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1199{
1200#ifndef _LIBCPP_NO_EXCEPTIONS
1201 try
1202 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001203#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clowdbef2bb2015-10-25 18:31:51 +00001204 this->clear(this->rdstate() & ~ios_base::eofbit);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001205 sentry __sen(*this, true);
1206 if (__sen)
Marshall Clow76a86702013-10-31 22:20:45 +00001207 {
1208 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
1209 this->setstate(ios_base::failbit);
1210 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001211#ifndef _LIBCPP_NO_EXCEPTIONS
1212 }
1213 catch (...)
1214 {
1215 this->__set_badbit_and_consider_rethrow();
1216 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001217#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001218 return *this;
1219}
1220
1221template <class _CharT, class _Traits>
1222basic_istream<_CharT, _Traits>&
1223ws(basic_istream<_CharT, _Traits>& __is)
1224{
1225#ifndef _LIBCPP_NO_EXCEPTIONS
1226 try
1227 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001228#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001229 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1230 if (__sen)
1231 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001232 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001233 while (true)
1234 {
1235 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1236 if (_Traits::eq_int_type(__i, _Traits::eof()))
1237 {
1238 __is.setstate(ios_base::eofbit);
1239 break;
1240 }
1241 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001242 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001243 __is.rdbuf()->sbumpc();
1244 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001245 }
1246#ifndef _LIBCPP_NO_EXCEPTIONS
1247 }
1248 catch (...)
1249 {
1250 __is.__set_badbit_and_consider_rethrow();
1251 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001252#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001253 return __is;
1254}
1255
Eric Fiseliere915b5c2017-04-18 23:38:41 +00001256#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001257
1258template <class _CharT, class _Traits, class _Tp>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001259inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001260basic_istream<_CharT, _Traits>&
Eric Fiselier7f630e82016-07-24 04:07:22 +00001261operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001262{
Eric Fiselier7f630e82016-07-24 04:07:22 +00001263 __is >> _VSTD::forward<_Tp>(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001264 return __is;
1265}
1266
Eric Fiseliere915b5c2017-04-18 23:38:41 +00001267#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001268
1269template <class _CharT, class _Traits>
Eric Fiselierc3589a82017-01-04 23:56:00 +00001270class _LIBCPP_TEMPLATE_VIS basic_iostream
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001271 : public basic_istream<_CharT, _Traits>,
1272 public basic_ostream<_CharT, _Traits>
1273{
1274public:
1275 // types:
1276 typedef _CharT char_type;
1277 typedef _Traits traits_type;
1278 typedef typename traits_type::int_type int_type;
1279 typedef typename traits_type::pos_type pos_type;
1280 typedef typename traits_type::off_type off_type;
1281
1282 // constructor/destructor
Louis Dionne3845a652018-10-16 19:26:23 +00001283 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-09-16 00:00:48 +00001284 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1285 : basic_istream<_CharT, _Traits>(__sb)
1286 {}
1287
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001288 virtual ~basic_iostream();
1289protected:
Eric Fiseliere915b5c2017-04-18 23:38:41 +00001290#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier6dbed462016-09-16 00:00:48 +00001291 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001292 basic_iostream(basic_iostream&& __rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001293
1294 // assign/swap
Eric Fiselier6dbed462016-09-16 00:00:48 +00001295 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001296 basic_iostream& operator=(basic_iostream&& __rhs);
1297#endif
Louis Dionne3845a652018-10-16 19:26:23 +00001298 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier6dbed462016-09-16 00:00:48 +00001299 void swap(basic_iostream& __rhs)
1300 { basic_istream<char_type, traits_type>::swap(__rhs); }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001301public:
1302};
1303
Eric Fiseliere915b5c2017-04-18 23:38:41 +00001304#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001305
1306template <class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001307basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001308 : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001309{
1310}
1311
1312template <class _CharT, class _Traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001313basic_iostream<_CharT, _Traits>&
1314basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1315{
1316 swap(__rhs);
1317 return *this;
1318}
1319
Eric Fiseliere915b5c2017-04-18 23:38:41 +00001320#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001321
1322template <class _CharT, class _Traits>
1323basic_iostream<_CharT, _Traits>::~basic_iostream()
1324{
1325}
1326
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001327template<class _CharT, class _Traits, class _Allocator>
1328basic_istream<_CharT, _Traits>&
1329operator>>(basic_istream<_CharT, _Traits>& __is,
1330 basic_string<_CharT, _Traits, _Allocator>& __str)
1331{
1332#ifndef _LIBCPP_NO_EXCEPTIONS
1333 try
1334 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001335#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001336 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1337 if (__sen)
1338 {
1339 __str.clear();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001340 streamsize __n = __is.width();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001341 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001342 __n = __str.max_size();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001343 if (__n <= 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001344 __n = numeric_limits<streamsize>::max();
1345 streamsize __c = 0;
1346 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Howard Hinnant92a836c2011-09-01 21:02:45 +00001347 ios_base::iostate __err = ios_base::goodbit;
1348 while (__c < __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001349 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001350 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1351 if (_Traits::eq_int_type(__i, _Traits::eof()))
1352 {
1353 __err |= ios_base::eofbit;
1354 break;
1355 }
1356 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001357 if (__ct.is(__ct.space, __ch))
1358 break;
1359 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001360 ++__c;
1361 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001362 }
1363 __is.width(0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001364 if (__c == 0)
1365 __err |= ios_base::failbit;
1366 __is.setstate(__err);
1367 }
1368 else
1369 __is.setstate(ios_base::failbit);
1370#ifndef _LIBCPP_NO_EXCEPTIONS
1371 }
1372 catch (...)
1373 {
1374 __is.__set_badbit_and_consider_rethrow();
1375 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001376#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001377 return __is;
1378}
1379
1380template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant324bb032010-08-22 00:02:43 +00001381basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001382getline(basic_istream<_CharT, _Traits>& __is,
1383 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1384{
1385#ifndef _LIBCPP_NO_EXCEPTIONS
1386 try
1387 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001388#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001389 typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1390 if (__sen)
1391 {
1392 __str.clear();
Howard Hinnant92a836c2011-09-01 21:02:45 +00001393 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantb97de442011-10-09 15:20:46 +00001394 streamsize __extr = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001395 while (true)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001396 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001397 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1398 if (_Traits::eq_int_type(__i, _Traits::eof()))
1399 {
1400 __err |= ios_base::eofbit;
1401 break;
1402 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001403 ++__extr;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001404 _CharT __ch = _Traits::to_char_type(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001405 if (_Traits::eq(__ch, __dlm))
1406 break;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001407 __str.push_back(__ch);
1408 if (__str.size() == __str.max_size())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001409 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001410 __err |= ios_base::failbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001411 break;
1412 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001413 }
Howard Hinnantb97de442011-10-09 15:20:46 +00001414 if (__extr == 0)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001415 __err |= ios_base::failbit;
1416 __is.setstate(__err);
1417 }
1418#ifndef _LIBCPP_NO_EXCEPTIONS
1419 }
1420 catch (...)
1421 {
1422 __is.__set_badbit_and_consider_rethrow();
1423 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001424#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001425 return __is;
1426}
1427
1428template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001429inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001430basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001431getline(basic_istream<_CharT, _Traits>& __is,
1432 basic_string<_CharT, _Traits, _Allocator>& __str)
1433{
1434 return getline(__is, __str, __is.widen('\n'));
1435}
1436
Eric Fiseliere915b5c2017-04-18 23:38:41 +00001437#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001438
1439template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001440inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001441basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001442getline(basic_istream<_CharT, _Traits>&& __is,
1443 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1444{
1445 return getline(__is, __str, __dlm);
1446}
1447
1448template<class _CharT, class _Traits, class _Allocator>
Evgeniy Stepanov4c7ee802016-01-08 19:21:02 +00001449inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00001450basic_istream<_CharT, _Traits>&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001451getline(basic_istream<_CharT, _Traits>&& __is,
1452 basic_string<_CharT, _Traits, _Allocator>& __str)
1453{
1454 return getline(__is, __str, __is.widen('\n'));
1455}
1456
Eric Fiseliere915b5c2017-04-18 23:38:41 +00001457#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001458
1459template <class _CharT, class _Traits, size_t _Size>
1460basic_istream<_CharT, _Traits>&
1461operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1462{
1463#ifndef _LIBCPP_NO_EXCEPTIONS
1464 try
1465 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001466#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001467 typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1468 if (__sen)
1469 {
1470 basic_string<_CharT, _Traits> __str;
1471 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
Eric Fiselier50f65792016-12-24 00:24:44 +00001472 size_t __c = 0;
Howard Hinnant92a836c2011-09-01 21:02:45 +00001473 ios_base::iostate __err = ios_base::goodbit;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001474 _CharT __zero = __ct.widen('0');
1475 _CharT __one = __ct.widen('1');
Howard Hinnant92a836c2011-09-01 21:02:45 +00001476 while (__c < _Size)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001477 {
Howard Hinnant92a836c2011-09-01 21:02:45 +00001478 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1479 if (_Traits::eq_int_type(__i, _Traits::eof()))
1480 {
1481 __err |= ios_base::eofbit;
1482 break;
1483 }
1484 _CharT __ch = _Traits::to_char_type(__i);
1485 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001486 break;
1487 __str.push_back(__ch);
Howard Hinnant92a836c2011-09-01 21:02:45 +00001488 ++__c;
1489 __is.rdbuf()->sbumpc();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001490 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001491 __x = bitset<_Size>(__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001492 if (__c == 0)
1493 __err |= ios_base::failbit;
1494 __is.setstate(__err);
1495 }
1496 else
1497 __is.setstate(ios_base::failbit);
1498#ifndef _LIBCPP_NO_EXCEPTIONS
1499 }
1500 catch (...)
1501 {
1502 __is.__set_badbit_and_consider_rethrow();
1503 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001504#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001505 return __is;
1506}
1507
Louis Dionnecaae3ec2018-12-06 00:24:58 +00001508#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
Eric Fiselier833d6442016-09-15 22:27:07 +00001509_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
1510_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
1511_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
Mehdi Amini907c1192017-05-04 17:08:54 +00001512#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001513
1514_LIBCPP_END_NAMESPACE_STD
1515
Eric Fiselier018a3d52017-05-31 22:07:49 +00001516_LIBCPP_POP_MACROS
1517
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001518#endif // _LIBCPP_ISTREAM