blob: d948d591c8f05319dddc463c6648fe665453454e [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_OSTREAM
11#define _LIBCPP_OSTREAM
12
13/*
14 ostream synopsis
15
16template <class charT, class traits = char_traits<charT> >
17class basic_ostream
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.2.2 Constructor/destructor:
29 explicit basic_ostream(basic_streambuf<char_type,traits>* sb);
30 basic_ostream(basic_ostream&& rhs);
31 virtual ~basic_ostream();
32
33 // 27.7.2.3 Assign/swap
Marshall Clowe9ca0272013-08-14 15:15:28 +000034 basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000035 basic_ostream& operator=(basic_ostream&& rhs);
36 void swap(basic_ostream& rhs);
37
38 // 27.7.2.4 Prefix/suffix:
39 class sentry;
40
41 // 27.7.2.6 Formatted output:
42 basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&));
43 basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&));
44 basic_ostream& operator<<(ios_base& (*pf)(ios_base&));
45 basic_ostream& operator<<(bool n);
46 basic_ostream& operator<<(short n);
47 basic_ostream& operator<<(unsigned short n);
48 basic_ostream& operator<<(int n);
49 basic_ostream& operator<<(unsigned int n);
50 basic_ostream& operator<<(long n);
51 basic_ostream& operator<<(unsigned long n);
52 basic_ostream& operator<<(long long n);
53 basic_ostream& operator<<(unsigned long long n);
54 basic_ostream& operator<<(float f);
55 basic_ostream& operator<<(double f);
56 basic_ostream& operator<<(long double f);
57 basic_ostream& operator<<(const void* p);
Nikolas Klauserd66919d2021-11-09 11:41:46 -050058 basic_ostream& operator<<(const volatile void* val); // C++23
Howard Hinnantc51e1022010-05-11 19:42:16 +000059 basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb);
Marshall Clow706862d2019-07-01 16:20:25 +000060 basic_ostream& operator<<(nullptr_t);
Howard Hinnantc51e1022010-05-11 19:42:16 +000061
62 // 27.7.2.7 Unformatted output:
63 basic_ostream& put(char_type c);
64 basic_ostream& write(const char_type* s, streamsize n);
65 basic_ostream& flush();
66
67 // 27.7.2.5 seeks:
68 pos_type tellp();
69 basic_ostream& seekp(pos_type);
70 basic_ostream& seekp(off_type, ios_base::seekdir);
Marshall Clow27d29872014-09-16 15:27:01 +000071protected:
72 basic_ostream(const basic_ostream& rhs) = delete;
73 basic_ostream(basic_ostream&& rhs);
74 // 27.7.3.3 Assign/swap
75 basic_ostream& operator=(basic_ostream& rhs) = delete;
76 basic_ostream& operator=(const basic_ostream&& rhs);
77 void swap(basic_ostream& rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +000078};
79
80// 27.7.2.6.4 character inserters
81
82template<class charT, class traits>
83 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT);
84
85template<class charT, class traits>
86 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char);
87
88template<class traits>
89 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char);
90
91// signed and unsigned
92
93template<class traits>
94 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char);
95
96template<class traits>
97 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char);
98
99// NTBS
100template<class charT, class traits>
101 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
102
103template<class charT, class traits>
104 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*);
105
106template<class traits>
107 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*);
108
109// signed and unsigned
110template<class traits>
111basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*);
112
113template<class traits>
114 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*);
115
116// swap:
117template <class charT, class traits>
118 void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);
119
120template <class charT, class traits>
121 basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
122
123template <class charT, class traits>
124 basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
125
126template <class charT, class traits>
127 basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
128
129// rvalue stream insertion
Louis Dionned9f73b12020-09-23 08:49:00 -0400130template <class Stream, class T>
131 Stream&& operator<<(Stream&& os, const T& x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132
133} // std
134
135*/
136
137#include <__config>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000138#include <bitset>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400139#include <ios>
140#include <iterator>
141#include <locale>
142#include <streambuf>
Marshall Clow8732fed2018-12-11 04:35:44 +0000143#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000144
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000145#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000146#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000147#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000148
149_LIBCPP_BEGIN_NAMESPACE_STD
150
151template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000152class _LIBCPP_TEMPLATE_VIS basic_ostream
Howard Hinnantc51e1022010-05-11 19:42:16 +0000153 : virtual public basic_ios<_CharT, _Traits>
154{
155public:
156 // types (inherited from basic_ios (27.5.4)):
157 typedef _CharT char_type;
158 typedef _Traits traits_type;
159 typedef typename traits_type::int_type int_type;
160 typedef typename traits_type::pos_type pos_type;
161 typedef typename traits_type::off_type off_type;
162
163 // 27.7.2.2 Constructor/destructor:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000164 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000165 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb)
166 { this->init(__sb); }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000167 virtual ~basic_ostream();
168protected:
Eric Fiselier815ed732016-09-16 00:00:48 +0000169 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000170 basic_ostream(basic_ostream&& __rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000171
172 // 27.7.2.3 Assign/swap
Eric Fiselier815ed732016-09-16 00:00:48 +0000173 inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000174 basic_ostream& operator=(basic_ostream&& __rhs);
Arthur O'Dwyer8dcd2982021-06-15 12:47:05 -0400175
Louis Dionneb4d05d72018-10-16 19:26:23 +0000176 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000177 void swap(basic_ostream& __rhs)
178 { basic_ios<char_type, traits_type>::swap(__rhs); }
Marshall Clow27d29872014-09-16 15:27:01 +0000179
Marshall Clow242d9c12014-09-16 15:33:53 +0000180 basic_ostream (const basic_ostream& __rhs) = delete;
181 basic_ostream& operator=(const basic_ostream& __rhs) = delete;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000182
Arthur O'Dwyer8dcd2982021-06-15 12:47:05 -0400183public:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000184 // 27.7.2.4 Prefix/suffix:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000185 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000186
187 // 27.7.2.6 Formatted output:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000188 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000189 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&))
190 { return __pf(*this); }
191
Louis Dionneb4d05d72018-10-16 19:26:23 +0000192 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000193 basic_ostream& operator<<(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000194 (*__pf)(basic_ios<char_type,traits_type>&))
195 { __pf(*this); return *this; }
196
Louis Dionneb4d05d72018-10-16 19:26:23 +0000197 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000198 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&))
199 { __pf(*this); return *this; }
200
Howard Hinnantc51e1022010-05-11 19:42:16 +0000201 basic_ostream& operator<<(bool __n);
202 basic_ostream& operator<<(short __n);
203 basic_ostream& operator<<(unsigned short __n);
204 basic_ostream& operator<<(int __n);
205 basic_ostream& operator<<(unsigned int __n);
206 basic_ostream& operator<<(long __n);
207 basic_ostream& operator<<(unsigned long __n);
208 basic_ostream& operator<<(long long __n);
209 basic_ostream& operator<<(unsigned long long __n);
210 basic_ostream& operator<<(float __f);
211 basic_ostream& operator<<(double __f);
212 basic_ostream& operator<<(long double __f);
213 basic_ostream& operator<<(const void* __p);
Nikolas Klauserd66919d2021-11-09 11:41:46 -0500214
215#if _LIBCPP_STD_VER > 20
216 _LIBCPP_HIDE_FROM_ABI
217 basic_ostream& operator<<(const volatile void* __p) {
218 return operator<<(const_cast<const void*>(__p));
219 }
220#endif
221
Howard Hinnantc51e1022010-05-11 19:42:16 +0000222 basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);
223
Marshall Clow706862d2019-07-01 16:20:25 +0000224 _LIBCPP_INLINE_VISIBILITY
225 basic_ostream& operator<<(nullptr_t)
226 { return *this << "nullptr"; }
227
Howard Hinnantc51e1022010-05-11 19:42:16 +0000228 // 27.7.2.7 Unformatted output:
229 basic_ostream& put(char_type __c);
230 basic_ostream& write(const char_type* __s, streamsize __n);
231 basic_ostream& flush();
232
233 // 27.7.2.5 seeks:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000234 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235 pos_type tellp();
Louis Dionneb4d05d72018-10-16 19:26:23 +0000236 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237 basic_ostream& seekp(pos_type __pos);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000238 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
240
241protected:
Louis Dionne16fe2952018-07-11 23:14:33 +0000242 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243 basic_ostream() {} // extension, intentially does not initialize
244};
245
246template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000247class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000248{
249 bool __ok_;
250 basic_ostream<_CharT, _Traits>& __os_;
251
Howard Hinnantc51e1022010-05-11 19:42:16 +0000252public:
253 explicit sentry(basic_ostream<_CharT, _Traits>& __os);
254 ~sentry();
Nikolas Klauser07088642021-12-08 10:57:12 +0100255 sentry(const sentry&) = delete;
256 sentry& operator=(const sentry&) = delete;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000257
Louis Dionne16fe2952018-07-11 23:14:33 +0000258 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer6c9c9a72021-06-15 12:57:54 -0400259 explicit operator bool() const {return __ok_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000260};
261
262template <class _CharT, class _Traits>
263basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os)
264 : __ok_(false),
265 __os_(__os)
266{
267 if (__os.good())
268 {
269 if (__os.tie())
270 __os.tie()->flush();
271 __ok_ = true;
272 }
273}
274
275template <class _CharT, class _Traits>
276basic_ostream<_CharT, _Traits>::sentry::~sentry()
277{
278 if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf)
279 && !uncaught_exception())
280 {
281#ifndef _LIBCPP_NO_EXCEPTIONS
282 try
283 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400284#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000285 if (__os_.rdbuf()->pubsync() == -1)
286 __os_.setstate(ios_base::badbit);
287#ifndef _LIBCPP_NO_EXCEPTIONS
288 }
289 catch (...)
290 {
291 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400292#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293 }
294}
295
Howard Hinnantc51e1022010-05-11 19:42:16 +0000296template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000297basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs)
298{
299 this->move(__rhs);
300}
301
302template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303basic_ostream<_CharT, _Traits>&
304basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs)
305{
306 swap(__rhs);
307 return *this;
308}
309
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310template <class _CharT, class _Traits>
311basic_ostream<_CharT, _Traits>::~basic_ostream()
312{
313}
314
315template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000316basic_ostream<_CharT, _Traits>&
317basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb)
318{
319#ifndef _LIBCPP_NO_EXCEPTIONS
320 try
321 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400322#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000323 sentry __s(*this);
324 if (__s)
325 {
326 if (__sb)
327 {
328#ifndef _LIBCPP_NO_EXCEPTIONS
329 try
330 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400331#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc834c512011-11-29 18:15:50 +0000332 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
333 typedef ostreambuf_iterator<_CharT, _Traits> _Op;
334 _Ip __i(__sb);
335 _Ip __eof;
336 _Op __o(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 size_t __c = 0;
338 for (; __i != __eof; ++__i, ++__o, ++__c)
339 {
340 *__o = *__i;
341 if (__o.failed())
342 break;
343 }
344 if (__c == 0)
345 this->setstate(ios_base::failbit);
346#ifndef _LIBCPP_NO_EXCEPTIONS
347 }
348 catch (...)
349 {
350 this->__set_failbit_and_consider_rethrow();
351 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400352#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353 }
354 else
355 this->setstate(ios_base::badbit);
356 }
357#ifndef _LIBCPP_NO_EXCEPTIONS
358 }
359 catch (...)
360 {
361 this->__set_badbit_and_consider_rethrow();
362 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400363#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000364 return *this;
365}
366
367template <class _CharT, class _Traits>
368basic_ostream<_CharT, _Traits>&
369basic_ostream<_CharT, _Traits>::operator<<(bool __n)
370{
371#ifndef _LIBCPP_NO_EXCEPTIONS
372 try
373 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400374#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375 sentry __s(*this);
376 if (__s)
377 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000378 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
379 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380 if (__f.put(*this, *this, this->fill(), __n).failed())
381 this->setstate(ios_base::badbit | ios_base::failbit);
382 }
383#ifndef _LIBCPP_NO_EXCEPTIONS
384 }
385 catch (...)
386 {
387 this->__set_badbit_and_consider_rethrow();
388 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400389#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390 return *this;
391}
392
393template <class _CharT, class _Traits>
394basic_ostream<_CharT, _Traits>&
395basic_ostream<_CharT, _Traits>::operator<<(short __n)
396{
397#ifndef _LIBCPP_NO_EXCEPTIONS
398 try
399 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400400#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401 sentry __s(*this);
402 if (__s)
403 {
404 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
Howard Hinnantc834c512011-11-29 18:15:50 +0000405 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
406 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407 if (__f.put(*this, *this, this->fill(),
408 __flags == ios_base::oct || __flags == ios_base::hex ?
409 static_cast<long>(static_cast<unsigned short>(__n)) :
410 static_cast<long>(__n)).failed())
411 this->setstate(ios_base::badbit | ios_base::failbit);
412 }
413#ifndef _LIBCPP_NO_EXCEPTIONS
414 }
415 catch (...)
416 {
417 this->__set_badbit_and_consider_rethrow();
418 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400419#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420 return *this;
421}
422
423template <class _CharT, class _Traits>
424basic_ostream<_CharT, _Traits>&
425basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n)
426{
427#ifndef _LIBCPP_NO_EXCEPTIONS
428 try
429 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400430#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000431 sentry __s(*this);
432 if (__s)
433 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000434 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
435 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000436 if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
437 this->setstate(ios_base::badbit | ios_base::failbit);
438 }
439#ifndef _LIBCPP_NO_EXCEPTIONS
440 }
441 catch (...)
442 {
443 this->__set_badbit_and_consider_rethrow();
444 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400445#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446 return *this;
447}
448
449template <class _CharT, class _Traits>
450basic_ostream<_CharT, _Traits>&
451basic_ostream<_CharT, _Traits>::operator<<(int __n)
452{
453#ifndef _LIBCPP_NO_EXCEPTIONS
454 try
455 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400456#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000457 sentry __s(*this);
458 if (__s)
459 {
460 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
Howard Hinnantc834c512011-11-29 18:15:50 +0000461 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
462 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463 if (__f.put(*this, *this, this->fill(),
464 __flags == ios_base::oct || __flags == ios_base::hex ?
465 static_cast<long>(static_cast<unsigned int>(__n)) :
466 static_cast<long>(__n)).failed())
467 this->setstate(ios_base::badbit | ios_base::failbit);
468 }
469#ifndef _LIBCPP_NO_EXCEPTIONS
470 }
471 catch (...)
472 {
473 this->__set_badbit_and_consider_rethrow();
474 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400475#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476 return *this;
477}
478
479template <class _CharT, class _Traits>
480basic_ostream<_CharT, _Traits>&
481basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n)
482{
483#ifndef _LIBCPP_NO_EXCEPTIONS
484 try
485 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400486#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000487 sentry __s(*this);
488 if (__s)
489 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000490 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
491 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492 if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
493 this->setstate(ios_base::badbit | ios_base::failbit);
494 }
495#ifndef _LIBCPP_NO_EXCEPTIONS
496 }
497 catch (...)
498 {
499 this->__set_badbit_and_consider_rethrow();
500 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400501#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502 return *this;
503}
504
505template <class _CharT, class _Traits>
506basic_ostream<_CharT, _Traits>&
507basic_ostream<_CharT, _Traits>::operator<<(long __n)
508{
509#ifndef _LIBCPP_NO_EXCEPTIONS
510 try
511 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400512#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000513 sentry __s(*this);
514 if (__s)
515 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000516 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
517 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518 if (__f.put(*this, *this, this->fill(), __n).failed())
519 this->setstate(ios_base::badbit | ios_base::failbit);
520 }
521#ifndef _LIBCPP_NO_EXCEPTIONS
522 }
523 catch (...)
524 {
525 this->__set_badbit_and_consider_rethrow();
526 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400527#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528 return *this;
529}
530
531template <class _CharT, class _Traits>
532basic_ostream<_CharT, _Traits>&
533basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n)
534{
535#ifndef _LIBCPP_NO_EXCEPTIONS
536 try
537 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400538#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539 sentry __s(*this);
540 if (__s)
541 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000542 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
543 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544 if (__f.put(*this, *this, this->fill(), __n).failed())
545 this->setstate(ios_base::badbit | ios_base::failbit);
546 }
547#ifndef _LIBCPP_NO_EXCEPTIONS
548 }
549 catch (...)
550 {
551 this->__set_badbit_and_consider_rethrow();
552 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400553#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554 return *this;
555}
556
557template <class _CharT, class _Traits>
558basic_ostream<_CharT, _Traits>&
559basic_ostream<_CharT, _Traits>::operator<<(long long __n)
560{
561#ifndef _LIBCPP_NO_EXCEPTIONS
562 try
563 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400564#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000565 sentry __s(*this);
566 if (__s)
567 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000568 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
569 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570 if (__f.put(*this, *this, this->fill(), __n).failed())
571 this->setstate(ios_base::badbit | ios_base::failbit);
572 }
573#ifndef _LIBCPP_NO_EXCEPTIONS
574 }
575 catch (...)
576 {
577 this->__set_badbit_and_consider_rethrow();
578 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400579#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000580 return *this;
581}
582
583template <class _CharT, class _Traits>
584basic_ostream<_CharT, _Traits>&
585basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n)
586{
587#ifndef _LIBCPP_NO_EXCEPTIONS
588 try
589 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400590#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000591 sentry __s(*this);
592 if (__s)
593 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000594 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
595 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000596 if (__f.put(*this, *this, this->fill(), __n).failed())
597 this->setstate(ios_base::badbit | ios_base::failbit);
598 }
599#ifndef _LIBCPP_NO_EXCEPTIONS
600 }
601 catch (...)
602 {
603 this->__set_badbit_and_consider_rethrow();
604 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400605#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000606 return *this;
607}
608
609template <class _CharT, class _Traits>
610basic_ostream<_CharT, _Traits>&
611basic_ostream<_CharT, _Traits>::operator<<(float __n)
612{
613#ifndef _LIBCPP_NO_EXCEPTIONS
614 try
615 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400616#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000617 sentry __s(*this);
618 if (__s)
619 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000620 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
621 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622 if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed())
623 this->setstate(ios_base::badbit | ios_base::failbit);
624 }
625#ifndef _LIBCPP_NO_EXCEPTIONS
626 }
627 catch (...)
628 {
629 this->__set_badbit_and_consider_rethrow();
630 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400631#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632 return *this;
633}
634
635template <class _CharT, class _Traits>
636basic_ostream<_CharT, _Traits>&
637basic_ostream<_CharT, _Traits>::operator<<(double __n)
638{
639#ifndef _LIBCPP_NO_EXCEPTIONS
640 try
641 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400642#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643 sentry __s(*this);
644 if (__s)
645 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000646 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
647 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000648 if (__f.put(*this, *this, this->fill(), __n).failed())
649 this->setstate(ios_base::badbit | ios_base::failbit);
650 }
651#ifndef _LIBCPP_NO_EXCEPTIONS
652 }
653 catch (...)
654 {
655 this->__set_badbit_and_consider_rethrow();
656 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400657#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000658 return *this;
659}
660
661template <class _CharT, class _Traits>
662basic_ostream<_CharT, _Traits>&
663basic_ostream<_CharT, _Traits>::operator<<(long double __n)
664{
665#ifndef _LIBCPP_NO_EXCEPTIONS
666 try
667 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400668#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000669 sentry __s(*this);
670 if (__s)
671 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000672 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
673 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000674 if (__f.put(*this, *this, this->fill(), __n).failed())
675 this->setstate(ios_base::badbit | ios_base::failbit);
676 }
677#ifndef _LIBCPP_NO_EXCEPTIONS
678 }
679 catch (...)
680 {
681 this->__set_badbit_and_consider_rethrow();
682 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400683#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000684 return *this;
685}
686
687template <class _CharT, class _Traits>
688basic_ostream<_CharT, _Traits>&
689basic_ostream<_CharT, _Traits>::operator<<(const void* __n)
690{
691#ifndef _LIBCPP_NO_EXCEPTIONS
692 try
693 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400694#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000695 sentry __s(*this);
696 if (__s)
697 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000698 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
699 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000700 if (__f.put(*this, *this, this->fill(), __n).failed())
701 this->setstate(ios_base::badbit | ios_base::failbit);
702 }
703#ifndef _LIBCPP_NO_EXCEPTIONS
704 }
705 catch (...)
706 {
707 this->__set_badbit_and_consider_rethrow();
708 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400709#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710 return *this;
711}
712
713template<class _CharT, class _Traits>
714basic_ostream<_CharT, _Traits>&
Marshall Clow00995642013-12-10 19:25:49 +0000715__put_character_sequence(basic_ostream<_CharT, _Traits>& __os,
716 const _CharT* __str, size_t __len)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000717{
718#ifndef _LIBCPP_NO_EXCEPTIONS
719 try
720 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400721#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000722 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
723 if (__s)
724 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000725 typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
726 if (__pad_and_output(_Ip(__os),
Marshall Clow00995642013-12-10 19:25:49 +0000727 __str,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000728 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
Marshall Clow00995642013-12-10 19:25:49 +0000729 __str + __len :
730 __str,
731 __str + __len,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000732 __os,
733 __os.fill()).failed())
734 __os.setstate(ios_base::badbit | ios_base::failbit);
735 }
736#ifndef _LIBCPP_NO_EXCEPTIONS
737 }
738 catch (...)
739 {
740 __os.__set_badbit_and_consider_rethrow();
741 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400742#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000743 return __os;
744}
745
Volodymyr Sapsai4c14a922018-09-19 23:31:34 +0000746
Marshall Clow00995642013-12-10 19:25:49 +0000747template<class _CharT, class _Traits>
748basic_ostream<_CharT, _Traits>&
749operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c)
750{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000751 return _VSTD::__put_character_sequence(__os, &__c, 1);
Marshall Clow00995642013-12-10 19:25:49 +0000752}
753
Howard Hinnantc51e1022010-05-11 19:42:16 +0000754template<class _CharT, class _Traits>
755basic_ostream<_CharT, _Traits>&
756operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
757{
758#ifndef _LIBCPP_NO_EXCEPTIONS
759 try
760 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400761#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000762 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
763 if (__s)
764 {
765 _CharT __c = __os.widen(__cn);
Howard Hinnantc834c512011-11-29 18:15:50 +0000766 typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
767 if (__pad_and_output(_Ip(__os),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000768 &__c,
769 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
770 &__c + 1 :
771 &__c,
772 &__c + 1,
773 __os,
774 __os.fill()).failed())
775 __os.setstate(ios_base::badbit | ios_base::failbit);
776 }
777#ifndef _LIBCPP_NO_EXCEPTIONS
778 }
779 catch (...)
780 {
781 __os.__set_badbit_and_consider_rethrow();
782 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400783#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000784 return __os;
785}
786
787template<class _Traits>
788basic_ostream<char, _Traits>&
789operator<<(basic_ostream<char, _Traits>& __os, char __c)
790{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000791 return _VSTD::__put_character_sequence(__os, &__c, 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000792}
793
794template<class _Traits>
795basic_ostream<char, _Traits>&
796operator<<(basic_ostream<char, _Traits>& __os, signed char __c)
797{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000798 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000799}
800
801template<class _Traits>
802basic_ostream<char, _Traits>&
803operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)
804{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000805 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000806}
807
808template<class _CharT, class _Traits>
809basic_ostream<_CharT, _Traits>&
810operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str)
811{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000812 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000813}
814
815template<class _CharT, class _Traits>
816basic_ostream<_CharT, _Traits>&
817operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn)
818{
819#ifndef _LIBCPP_NO_EXCEPTIONS
820 try
821 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400822#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000823 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
824 if (__s)
825 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000826 typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000827 size_t __len = char_traits<char>::length(__strn);
828 const int __bs = 100;
829 _CharT __wbb[__bs];
830 _CharT* __wb = __wbb;
831 unique_ptr<_CharT, void(*)(void*)> __h(0, free);
832 if (__len > __bs)
833 {
834 __wb = (_CharT*)malloc(__len*sizeof(_CharT));
835 if (__wb == 0)
836 __throw_bad_alloc();
837 __h.reset(__wb);
838 }
839 for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p)
840 *__p = __os.widen(*__strn);
Howard Hinnantc834c512011-11-29 18:15:50 +0000841 if (__pad_and_output(_Ip(__os),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000842 __wb,
843 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
844 __wb + __len :
845 __wb,
846 __wb + __len,
847 __os,
848 __os.fill()).failed())
849 __os.setstate(ios_base::badbit | ios_base::failbit);
850 }
851#ifndef _LIBCPP_NO_EXCEPTIONS
852 }
853 catch (...)
854 {
855 __os.__set_badbit_and_consider_rethrow();
856 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400857#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000858 return __os;
859}
860
861template<class _Traits>
862basic_ostream<char, _Traits>&
863operator<<(basic_ostream<char, _Traits>& __os, const char* __str)
864{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000865 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000866}
867
868template<class _Traits>
869basic_ostream<char, _Traits>&
870operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str)
871{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000872 const char *__s = (const char *) __str;
873 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000874}
875
876template<class _Traits>
877basic_ostream<char, _Traits>&
878operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str)
879{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000880 const char *__s = (const char *) __str;
881 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000882}
883
884template <class _CharT, class _Traits>
885basic_ostream<_CharT, _Traits>&
886basic_ostream<_CharT, _Traits>::put(char_type __c)
887{
888#ifndef _LIBCPP_NO_EXCEPTIONS
889 try
890 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400891#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000892 sentry __s(*this);
893 if (__s)
894 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000895 typedef ostreambuf_iterator<_CharT, _Traits> _Op;
896 _Op __o(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000897 *__o = __c;
898 if (__o.failed())
899 this->setstate(ios_base::badbit);
900 }
901#ifndef _LIBCPP_NO_EXCEPTIONS
902 }
903 catch (...)
904 {
905 this->__set_badbit_and_consider_rethrow();
906 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400907#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000908 return *this;
909}
910
911template <class _CharT, class _Traits>
912basic_ostream<_CharT, _Traits>&
913basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
914{
915#ifndef _LIBCPP_NO_EXCEPTIONS
916 try
917 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400918#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919 sentry __sen(*this);
920 if (__sen && __n)
921 {
Howard Hinnant79cef932013-01-15 17:22:03 +0000922 if (this->rdbuf()->sputn(__s, __n) != __n)
923 this->setstate(ios_base::badbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924 }
925#ifndef _LIBCPP_NO_EXCEPTIONS
926 }
927 catch (...)
928 {
929 this->__set_badbit_and_consider_rethrow();
930 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400931#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000932 return *this;
933}
934
935template <class _CharT, class _Traits>
936basic_ostream<_CharT, _Traits>&
937basic_ostream<_CharT, _Traits>::flush()
938{
939#ifndef _LIBCPP_NO_EXCEPTIONS
940 try
941 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400942#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000943 if (this->rdbuf())
944 {
945 sentry __s(*this);
946 if (__s)
947 {
948 if (this->rdbuf()->pubsync() == -1)
949 this->setstate(ios_base::badbit);
950 }
951 }
952#ifndef _LIBCPP_NO_EXCEPTIONS
953 }
954 catch (...)
955 {
956 this->__set_badbit_and_consider_rethrow();
957 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400958#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959 return *this;
960}
961
962template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000963typename basic_ostream<_CharT, _Traits>::pos_type
964basic_ostream<_CharT, _Traits>::tellp()
965{
966 if (this->fail())
967 return pos_type(-1);
968 return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
969}
970
971template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000972basic_ostream<_CharT, _Traits>&
973basic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
974{
Marshall Clow29c4daa2013-10-31 22:20:45 +0000975 sentry __s(*this);
Marshall Clow8aa079a2015-06-22 15:01:21 +0000976 if (!this->fail())
Howard Hinnantc51e1022010-05-11 19:42:16 +0000977 {
978 if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
979 this->setstate(ios_base::failbit);
980 }
981 return *this;
982}
983
984template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000985basic_ostream<_CharT, _Traits>&
986basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir)
987{
Marshall Clow29c4daa2013-10-31 22:20:45 +0000988 sentry __s(*this);
Marshall Clow8aa079a2015-06-22 15:01:21 +0000989 if (!this->fail())
Marshall Clow29c4daa2013-10-31 22:20:45 +0000990 {
991 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
992 this->setstate(ios_base::failbit);
993 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000994 return *this;
995}
996
997template <class _CharT, class _Traits>
Louis Dionnee29136f2020-07-13 11:53:48 -0400998inline
Howard Hinnantc51e1022010-05-11 19:42:16 +0000999basic_ostream<_CharT, _Traits>&
1000endl(basic_ostream<_CharT, _Traits>& __os)
1001{
1002 __os.put(__os.widen('\n'));
1003 __os.flush();
1004 return __os;
1005}
1006
1007template <class _CharT, class _Traits>
Louis Dionnee29136f2020-07-13 11:53:48 -04001008inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001009basic_ostream<_CharT, _Traits>&
1010ends(basic_ostream<_CharT, _Traits>& __os)
1011{
1012 __os.put(_CharT());
1013 return __os;
1014}
1015
1016template <class _CharT, class _Traits>
Louis Dionnee29136f2020-07-13 11:53:48 -04001017inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001018basic_ostream<_CharT, _Traits>&
1019flush(basic_ostream<_CharT, _Traits>& __os)
1020{
1021 __os.flush();
1022 return __os;
1023}
1024
Louis Dionned9f73b12020-09-23 08:49:00 -04001025template <class _Stream, class _Tp, class = void>
1026struct __is_ostreamable : false_type { };
1027
Howard Hinnantc51e1022010-05-11 19:42:16 +00001028template <class _Stream, class _Tp>
Louis Dionned9f73b12020-09-23 08:49:00 -04001029struct __is_ostreamable<_Stream, _Tp, decltype(
Arthur O'Dwyer3285c342021-05-10 13:04:16 -04001030 declval<_Stream>() << declval<_Tp>(), void()
Louis Dionned9f73b12020-09-23 08:49:00 -04001031)> : true_type { };
1032
1033template <class _Stream, class _Tp, class = typename enable_if<
1034 _And<is_base_of<ios_base, _Stream>,
Arthur O'Dwyer46d358c2021-06-15 12:57:05 -04001035 __is_ostreamable<_Stream&, const _Tp&> >::value
Louis Dionned9f73b12020-09-23 08:49:00 -04001036>::type>
1037_LIBCPP_INLINE_VISIBILITY
1038_Stream&& operator<<(_Stream&& __os, const _Tp& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001039{
1040 __os << __x;
Howard Hinnantc8697b62012-01-12 23:37:51 +00001041 return _VSTD::move(__os);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042}
1043
Howard Hinnantc51e1022010-05-11 19:42:16 +00001044template<class _CharT, class _Traits, class _Allocator>
1045basic_ostream<_CharT, _Traits>&
1046operator<<(basic_ostream<_CharT, _Traits>& __os,
1047 const basic_string<_CharT, _Traits, _Allocator>& __str)
1048{
Marshall Clow4bc2be22014-02-16 01:57:26 +00001049 return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050}
1051
Marshall Clowdf63a6d2016-07-21 05:31:24 +00001052template<class _CharT, class _Traits>
1053basic_ostream<_CharT, _Traits>&
1054operator<<(basic_ostream<_CharT, _Traits>& __os,
Eric Fiselier14116922019-09-25 18:56:54 +00001055 basic_string_view<_CharT, _Traits> __sv)
Marshall Clowdf63a6d2016-07-21 05:31:24 +00001056{
1057 return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size());
1058}
1059
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060template <class _CharT, class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001061inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001062basic_ostream<_CharT, _Traits>&
1063operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec)
1064{
1065 return __os << __ec.category().name() << ':' << __ec.value();
1066}
1067
Howard Hinnantc834c512011-11-29 18:15:50 +00001068template<class _CharT, class _Traits, class _Yp>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001069inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001070basic_ostream<_CharT, _Traits>&
Howard Hinnantc834c512011-11-29 18:15:50 +00001071operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001072{
1073 return __os << __p.get();
1074}
1075
Marshall Clowe52a3242017-11-27 15:51:36 +00001076template<class _CharT, class _Traits, class _Yp, class _Dp>
1077inline _LIBCPP_INLINE_VISIBILITY
1078typename enable_if
1079<
Marshall Cloweea0a1d2018-03-22 18:27:28 +00001080 is_same<void, typename __void_t<decltype((declval<basic_ostream<_CharT, _Traits>&>() << declval<typename unique_ptr<_Yp, _Dp>::pointer>()))>::type>::value,
Marshall Clowe52a3242017-11-27 15:51:36 +00001081 basic_ostream<_CharT, _Traits>&
1082>::type
1083operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)
1084{
1085 return __os << __p.get();
1086}
1087
Howard Hinnantc51e1022010-05-11 19:42:16 +00001088template <class _CharT, class _Traits, size_t _Size>
1089basic_ostream<_CharT, _Traits>&
Howard Hinnantfa65ab62011-04-05 14:55:28 +00001090operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001091{
1092 return __os << __x.template to_string<_CharT, _Traits>
1093 (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'),
1094 use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
1095}
1096
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001097_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>)
Louis Dionne89258142021-08-23 15:32:36 -04001098#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001099_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>)
Louis Dionne89258142021-08-23 15:32:36 -04001100#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001101
1102_LIBCPP_END_NAMESPACE_STD
1103
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001104#endif // _LIBCPP_OSTREAM