blob: af50680f9a7cc91e05a77390eec4c543e8942a9a [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- ostream -----------------------------------===//
3//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_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);
58 basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb);
Marshall Clow706862d2019-07-01 16:20:25 +000059 basic_ostream& operator<<(nullptr_t);
Howard Hinnantc51e1022010-05-11 19:42:16 +000060
61 // 27.7.2.7 Unformatted output:
62 basic_ostream& put(char_type c);
63 basic_ostream& write(const char_type* s, streamsize n);
64 basic_ostream& flush();
65
66 // 27.7.2.5 seeks:
67 pos_type tellp();
68 basic_ostream& seekp(pos_type);
69 basic_ostream& seekp(off_type, ios_base::seekdir);
Marshall Clow27d29872014-09-16 15:27:01 +000070protected:
71 basic_ostream(const basic_ostream& rhs) = delete;
72 basic_ostream(basic_ostream&& rhs);
73 // 27.7.3.3 Assign/swap
74 basic_ostream& operator=(basic_ostream& rhs) = delete;
75 basic_ostream& operator=(const basic_ostream&& rhs);
76 void swap(basic_ostream& rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +000077};
78
79// 27.7.2.6.4 character inserters
80
81template<class charT, class traits>
82 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT);
83
84template<class charT, class traits>
85 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char);
86
87template<class traits>
88 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char);
89
90// signed and unsigned
91
92template<class traits>
93 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char);
94
95template<class traits>
96 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char);
97
98// NTBS
99template<class charT, class traits>
100 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
101
102template<class charT, class traits>
103 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*);
104
105template<class traits>
106 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*);
107
108// signed and unsigned
109template<class traits>
110basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*);
111
112template<class traits>
113 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*);
114
115// swap:
116template <class charT, class traits>
117 void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);
118
119template <class charT, class traits>
120 basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
121
122template <class charT, class traits>
123 basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
124
125template <class charT, class traits>
126 basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
127
128// rvalue stream insertion
Louis Dionned9f73b12020-09-23 08:49:00 -0400129template <class Stream, class T>
130 Stream&& operator<<(Stream&& os, const T& x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000131
132} // std
133
134*/
135
136#include <__config>
137#include <ios>
138#include <streambuf>
139#include <locale>
140#include <iterator>
141#include <bitset>
Marshall Clow8732fed2018-12-11 04:35:44 +0000142#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000143
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000144#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000145#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000146#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000147
148_LIBCPP_BEGIN_NAMESPACE_STD
149
150template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000151class _LIBCPP_TEMPLATE_VIS basic_ostream
Howard Hinnantc51e1022010-05-11 19:42:16 +0000152 : virtual public basic_ios<_CharT, _Traits>
153{
154public:
155 // types (inherited from basic_ios (27.5.4)):
156 typedef _CharT char_type;
157 typedef _Traits traits_type;
158 typedef typename traits_type::int_type int_type;
159 typedef typename traits_type::pos_type pos_type;
160 typedef typename traits_type::off_type off_type;
161
162 // 27.7.2.2 Constructor/destructor:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000163 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000164 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb)
165 { this->init(__sb); }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166 virtual ~basic_ostream();
167protected:
Eric Fiselier78ccf772017-04-18 23:38:41 +0000168#ifndef _LIBCPP_CXX03_LANG
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);
175#endif
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
Eric Fiselier2d8515f2017-01-06 20:58:25 +0000180#ifndef _LIBCPP_CXX03_LANG
Marshall Clow242d9c12014-09-16 15:33:53 +0000181 basic_ostream (const basic_ostream& __rhs) = delete;
182 basic_ostream& operator=(const basic_ostream& __rhs) = delete;
Marshall Clow27d29872014-09-16 15:27:01 +0000183#else
Marshall Clowd37f25c2014-09-17 01:58:15 +0000184 basic_ostream (const basic_ostream& __rhs); // not defined
185 basic_ostream& operator=(const basic_ostream& __rhs); // not defined
Marshall Clow27d29872014-09-16 15:27:01 +0000186#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000187public:
188
189 // 27.7.2.4 Prefix/suffix:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000190 class _LIBCPP_TEMPLATE_VIS sentry;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000191
192 // 27.7.2.6 Formatted output:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000193 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000194 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&))
195 { return __pf(*this); }
196
Louis Dionneb4d05d72018-10-16 19:26:23 +0000197 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000198 basic_ostream& operator<<(basic_ios<char_type, traits_type>&
Eric Fiselier815ed732016-09-16 00:00:48 +0000199 (*__pf)(basic_ios<char_type,traits_type>&))
200 { __pf(*this); return *this; }
201
Louis Dionneb4d05d72018-10-16 19:26:23 +0000202 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiselier815ed732016-09-16 00:00:48 +0000203 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&))
204 { __pf(*this); return *this; }
205
Howard Hinnantc51e1022010-05-11 19:42:16 +0000206 basic_ostream& operator<<(bool __n);
207 basic_ostream& operator<<(short __n);
208 basic_ostream& operator<<(unsigned short __n);
209 basic_ostream& operator<<(int __n);
210 basic_ostream& operator<<(unsigned int __n);
211 basic_ostream& operator<<(long __n);
212 basic_ostream& operator<<(unsigned long __n);
213 basic_ostream& operator<<(long long __n);
214 basic_ostream& operator<<(unsigned long long __n);
215 basic_ostream& operator<<(float __f);
216 basic_ostream& operator<<(double __f);
217 basic_ostream& operator<<(long double __f);
218 basic_ostream& operator<<(const void* __p);
219 basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);
220
Marshall Clow706862d2019-07-01 16:20:25 +0000221 _LIBCPP_INLINE_VISIBILITY
222 basic_ostream& operator<<(nullptr_t)
223 { return *this << "nullptr"; }
224
Howard Hinnantc51e1022010-05-11 19:42:16 +0000225 // 27.7.2.7 Unformatted output:
226 basic_ostream& put(char_type __c);
227 basic_ostream& write(const char_type* __s, streamsize __n);
228 basic_ostream& flush();
229
230 // 27.7.2.5 seeks:
Louis Dionneb4d05d72018-10-16 19:26:23 +0000231 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000232 pos_type tellp();
Louis Dionneb4d05d72018-10-16 19:26:23 +0000233 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234 basic_ostream& seekp(pos_type __pos);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000235 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000236 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
237
238protected:
Louis Dionne16fe2952018-07-11 23:14:33 +0000239 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000240 basic_ostream() {} // extension, intentially does not initialize
241};
242
243template <class _CharT, class _Traits>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000244class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245{
246 bool __ok_;
247 basic_ostream<_CharT, _Traits>& __os_;
248
249 sentry(const sentry&); // = delete;
250 sentry& operator=(const sentry&); // = delete;
251
252public:
253 explicit sentry(basic_ostream<_CharT, _Traits>& __os);
254 ~sentry();
255
Louis Dionne16fe2952018-07-11 23:14:33 +0000256 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant86a291f2012-02-21 21:46:43 +0000257 _LIBCPP_EXPLICIT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000258 operator bool() const {return __ok_;}
259};
260
261template <class _CharT, class _Traits>
262basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os)
263 : __ok_(false),
264 __os_(__os)
265{
266 if (__os.good())
267 {
268 if (__os.tie())
269 __os.tie()->flush();
270 __ok_ = true;
271 }
272}
273
274template <class _CharT, class _Traits>
275basic_ostream<_CharT, _Traits>::sentry::~sentry()
276{
277 if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf)
278 && !uncaught_exception())
279 {
280#ifndef _LIBCPP_NO_EXCEPTIONS
281 try
282 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400283#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000284 if (__os_.rdbuf()->pubsync() == -1)
285 __os_.setstate(ios_base::badbit);
286#ifndef _LIBCPP_NO_EXCEPTIONS
287 }
288 catch (...)
289 {
290 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400291#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292 }
293}
294
Eric Fiselier78ccf772017-04-18 23:38:41 +0000295#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000296
297template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000298basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs)
299{
300 this->move(__rhs);
301}
302
303template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304basic_ostream<_CharT, _Traits>&
305basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs)
306{
307 swap(__rhs);
308 return *this;
309}
310
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400311#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312
313template <class _CharT, class _Traits>
314basic_ostream<_CharT, _Traits>::~basic_ostream()
315{
316}
317
318template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000319basic_ostream<_CharT, _Traits>&
320basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb)
321{
322#ifndef _LIBCPP_NO_EXCEPTIONS
323 try
324 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400325#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326 sentry __s(*this);
327 if (__s)
328 {
329 if (__sb)
330 {
331#ifndef _LIBCPP_NO_EXCEPTIONS
332 try
333 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400334#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc834c512011-11-29 18:15:50 +0000335 typedef istreambuf_iterator<_CharT, _Traits> _Ip;
336 typedef ostreambuf_iterator<_CharT, _Traits> _Op;
337 _Ip __i(__sb);
338 _Ip __eof;
339 _Op __o(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000340 size_t __c = 0;
341 for (; __i != __eof; ++__i, ++__o, ++__c)
342 {
343 *__o = *__i;
344 if (__o.failed())
345 break;
346 }
347 if (__c == 0)
348 this->setstate(ios_base::failbit);
349#ifndef _LIBCPP_NO_EXCEPTIONS
350 }
351 catch (...)
352 {
353 this->__set_failbit_and_consider_rethrow();
354 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400355#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000356 }
357 else
358 this->setstate(ios_base::badbit);
359 }
360#ifndef _LIBCPP_NO_EXCEPTIONS
361 }
362 catch (...)
363 {
364 this->__set_badbit_and_consider_rethrow();
365 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400366#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 return *this;
368}
369
370template <class _CharT, class _Traits>
371basic_ostream<_CharT, _Traits>&
372basic_ostream<_CharT, _Traits>::operator<<(bool __n)
373{
374#ifndef _LIBCPP_NO_EXCEPTIONS
375 try
376 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400377#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378 sentry __s(*this);
379 if (__s)
380 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000381 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
382 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 if (__f.put(*this, *this, this->fill(), __n).failed())
384 this->setstate(ios_base::badbit | ios_base::failbit);
385 }
386#ifndef _LIBCPP_NO_EXCEPTIONS
387 }
388 catch (...)
389 {
390 this->__set_badbit_and_consider_rethrow();
391 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400392#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393 return *this;
394}
395
396template <class _CharT, class _Traits>
397basic_ostream<_CharT, _Traits>&
398basic_ostream<_CharT, _Traits>::operator<<(short __n)
399{
400#ifndef _LIBCPP_NO_EXCEPTIONS
401 try
402 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400403#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404 sentry __s(*this);
405 if (__s)
406 {
407 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
Howard Hinnantc834c512011-11-29 18:15:50 +0000408 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
409 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000410 if (__f.put(*this, *this, this->fill(),
411 __flags == ios_base::oct || __flags == ios_base::hex ?
412 static_cast<long>(static_cast<unsigned short>(__n)) :
413 static_cast<long>(__n)).failed())
414 this->setstate(ios_base::badbit | ios_base::failbit);
415 }
416#ifndef _LIBCPP_NO_EXCEPTIONS
417 }
418 catch (...)
419 {
420 this->__set_badbit_and_consider_rethrow();
421 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400422#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423 return *this;
424}
425
426template <class _CharT, class _Traits>
427basic_ostream<_CharT, _Traits>&
428basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n)
429{
430#ifndef _LIBCPP_NO_EXCEPTIONS
431 try
432 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400433#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000434 sentry __s(*this);
435 if (__s)
436 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000437 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
438 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000439 if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
440 this->setstate(ios_base::badbit | ios_base::failbit);
441 }
442#ifndef _LIBCPP_NO_EXCEPTIONS
443 }
444 catch (...)
445 {
446 this->__set_badbit_and_consider_rethrow();
447 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400448#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449 return *this;
450}
451
452template <class _CharT, class _Traits>
453basic_ostream<_CharT, _Traits>&
454basic_ostream<_CharT, _Traits>::operator<<(int __n)
455{
456#ifndef _LIBCPP_NO_EXCEPTIONS
457 try
458 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400459#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460 sentry __s(*this);
461 if (__s)
462 {
463 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
Howard Hinnantc834c512011-11-29 18:15:50 +0000464 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
465 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000466 if (__f.put(*this, *this, this->fill(),
467 __flags == ios_base::oct || __flags == ios_base::hex ?
468 static_cast<long>(static_cast<unsigned int>(__n)) :
469 static_cast<long>(__n)).failed())
470 this->setstate(ios_base::badbit | ios_base::failbit);
471 }
472#ifndef _LIBCPP_NO_EXCEPTIONS
473 }
474 catch (...)
475 {
476 this->__set_badbit_and_consider_rethrow();
477 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400478#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479 return *this;
480}
481
482template <class _CharT, class _Traits>
483basic_ostream<_CharT, _Traits>&
484basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n)
485{
486#ifndef _LIBCPP_NO_EXCEPTIONS
487 try
488 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400489#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490 sentry __s(*this);
491 if (__s)
492 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000493 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
494 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000495 if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
496 this->setstate(ios_base::badbit | ios_base::failbit);
497 }
498#ifndef _LIBCPP_NO_EXCEPTIONS
499 }
500 catch (...)
501 {
502 this->__set_badbit_and_consider_rethrow();
503 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400504#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000505 return *this;
506}
507
508template <class _CharT, class _Traits>
509basic_ostream<_CharT, _Traits>&
510basic_ostream<_CharT, _Traits>::operator<<(long __n)
511{
512#ifndef _LIBCPP_NO_EXCEPTIONS
513 try
514 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400515#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000516 sentry __s(*this);
517 if (__s)
518 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000519 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
520 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521 if (__f.put(*this, *this, this->fill(), __n).failed())
522 this->setstate(ios_base::badbit | ios_base::failbit);
523 }
524#ifndef _LIBCPP_NO_EXCEPTIONS
525 }
526 catch (...)
527 {
528 this->__set_badbit_and_consider_rethrow();
529 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400530#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531 return *this;
532}
533
534template <class _CharT, class _Traits>
535basic_ostream<_CharT, _Traits>&
536basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n)
537{
538#ifndef _LIBCPP_NO_EXCEPTIONS
539 try
540 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400541#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 sentry __s(*this);
543 if (__s)
544 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000545 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
546 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547 if (__f.put(*this, *this, this->fill(), __n).failed())
548 this->setstate(ios_base::badbit | ios_base::failbit);
549 }
550#ifndef _LIBCPP_NO_EXCEPTIONS
551 }
552 catch (...)
553 {
554 this->__set_badbit_and_consider_rethrow();
555 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400556#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000557 return *this;
558}
559
560template <class _CharT, class _Traits>
561basic_ostream<_CharT, _Traits>&
562basic_ostream<_CharT, _Traits>::operator<<(long long __n)
563{
564#ifndef _LIBCPP_NO_EXCEPTIONS
565 try
566 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400567#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000568 sentry __s(*this);
569 if (__s)
570 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000571 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
572 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000573 if (__f.put(*this, *this, this->fill(), __n).failed())
574 this->setstate(ios_base::badbit | ios_base::failbit);
575 }
576#ifndef _LIBCPP_NO_EXCEPTIONS
577 }
578 catch (...)
579 {
580 this->__set_badbit_and_consider_rethrow();
581 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400582#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000583 return *this;
584}
585
586template <class _CharT, class _Traits>
587basic_ostream<_CharT, _Traits>&
588basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n)
589{
590#ifndef _LIBCPP_NO_EXCEPTIONS
591 try
592 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400593#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000594 sentry __s(*this);
595 if (__s)
596 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000597 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
598 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000599 if (__f.put(*this, *this, this->fill(), __n).failed())
600 this->setstate(ios_base::badbit | ios_base::failbit);
601 }
602#ifndef _LIBCPP_NO_EXCEPTIONS
603 }
604 catch (...)
605 {
606 this->__set_badbit_and_consider_rethrow();
607 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400608#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000609 return *this;
610}
611
612template <class _CharT, class _Traits>
613basic_ostream<_CharT, _Traits>&
614basic_ostream<_CharT, _Traits>::operator<<(float __n)
615{
616#ifndef _LIBCPP_NO_EXCEPTIONS
617 try
618 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400619#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000620 sentry __s(*this);
621 if (__s)
622 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000623 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
624 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000625 if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed())
626 this->setstate(ios_base::badbit | ios_base::failbit);
627 }
628#ifndef _LIBCPP_NO_EXCEPTIONS
629 }
630 catch (...)
631 {
632 this->__set_badbit_and_consider_rethrow();
633 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400634#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000635 return *this;
636}
637
638template <class _CharT, class _Traits>
639basic_ostream<_CharT, _Traits>&
640basic_ostream<_CharT, _Traits>::operator<<(double __n)
641{
642#ifndef _LIBCPP_NO_EXCEPTIONS
643 try
644 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400645#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000646 sentry __s(*this);
647 if (__s)
648 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000649 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
650 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000651 if (__f.put(*this, *this, this->fill(), __n).failed())
652 this->setstate(ios_base::badbit | ios_base::failbit);
653 }
654#ifndef _LIBCPP_NO_EXCEPTIONS
655 }
656 catch (...)
657 {
658 this->__set_badbit_and_consider_rethrow();
659 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400660#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000661 return *this;
662}
663
664template <class _CharT, class _Traits>
665basic_ostream<_CharT, _Traits>&
666basic_ostream<_CharT, _Traits>::operator<<(long double __n)
667{
668#ifndef _LIBCPP_NO_EXCEPTIONS
669 try
670 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400671#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000672 sentry __s(*this);
673 if (__s)
674 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000675 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
676 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000677 if (__f.put(*this, *this, this->fill(), __n).failed())
678 this->setstate(ios_base::badbit | ios_base::failbit);
679 }
680#ifndef _LIBCPP_NO_EXCEPTIONS
681 }
682 catch (...)
683 {
684 this->__set_badbit_and_consider_rethrow();
685 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400686#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000687 return *this;
688}
689
690template <class _CharT, class _Traits>
691basic_ostream<_CharT, _Traits>&
692basic_ostream<_CharT, _Traits>::operator<<(const void* __n)
693{
694#ifndef _LIBCPP_NO_EXCEPTIONS
695 try
696 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400697#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698 sentry __s(*this);
699 if (__s)
700 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000701 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
702 const _Fp& __f = use_facet<_Fp>(this->getloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000703 if (__f.put(*this, *this, this->fill(), __n).failed())
704 this->setstate(ios_base::badbit | ios_base::failbit);
705 }
706#ifndef _LIBCPP_NO_EXCEPTIONS
707 }
708 catch (...)
709 {
710 this->__set_badbit_and_consider_rethrow();
711 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400712#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000713 return *this;
714}
715
716template<class _CharT, class _Traits>
717basic_ostream<_CharT, _Traits>&
Marshall Clow00995642013-12-10 19:25:49 +0000718__put_character_sequence(basic_ostream<_CharT, _Traits>& __os,
719 const _CharT* __str, size_t __len)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000720{
721#ifndef _LIBCPP_NO_EXCEPTIONS
722 try
723 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400724#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000725 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
726 if (__s)
727 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000728 typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
729 if (__pad_and_output(_Ip(__os),
Marshall Clow00995642013-12-10 19:25:49 +0000730 __str,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000731 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
Marshall Clow00995642013-12-10 19:25:49 +0000732 __str + __len :
733 __str,
734 __str + __len,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000735 __os,
736 __os.fill()).failed())
737 __os.setstate(ios_base::badbit | ios_base::failbit);
738 }
739#ifndef _LIBCPP_NO_EXCEPTIONS
740 }
741 catch (...)
742 {
743 __os.__set_badbit_and_consider_rethrow();
744 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400745#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000746 return __os;
747}
748
Volodymyr Sapsai4c14a922018-09-19 23:31:34 +0000749
Marshall Clow00995642013-12-10 19:25:49 +0000750template<class _CharT, class _Traits>
751basic_ostream<_CharT, _Traits>&
752operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c)
753{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000754 return _VSTD::__put_character_sequence(__os, &__c, 1);
Marshall Clow00995642013-12-10 19:25:49 +0000755}
756
Howard Hinnantc51e1022010-05-11 19:42:16 +0000757template<class _CharT, class _Traits>
758basic_ostream<_CharT, _Traits>&
759operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
760{
761#ifndef _LIBCPP_NO_EXCEPTIONS
762 try
763 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400764#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000765 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
766 if (__s)
767 {
768 _CharT __c = __os.widen(__cn);
Howard Hinnantc834c512011-11-29 18:15:50 +0000769 typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
770 if (__pad_and_output(_Ip(__os),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000771 &__c,
772 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
773 &__c + 1 :
774 &__c,
775 &__c + 1,
776 __os,
777 __os.fill()).failed())
778 __os.setstate(ios_base::badbit | ios_base::failbit);
779 }
780#ifndef _LIBCPP_NO_EXCEPTIONS
781 }
782 catch (...)
783 {
784 __os.__set_badbit_and_consider_rethrow();
785 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400786#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787 return __os;
788}
789
790template<class _Traits>
791basic_ostream<char, _Traits>&
792operator<<(basic_ostream<char, _Traits>& __os, char __c)
793{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000794 return _VSTD::__put_character_sequence(__os, &__c, 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000795}
796
797template<class _Traits>
798basic_ostream<char, _Traits>&
799operator<<(basic_ostream<char, _Traits>& __os, signed char __c)
800{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000801 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000802}
803
804template<class _Traits>
805basic_ostream<char, _Traits>&
806operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)
807{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000808 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000809}
810
811template<class _CharT, class _Traits>
812basic_ostream<_CharT, _Traits>&
813operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str)
814{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000815 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816}
817
818template<class _CharT, class _Traits>
819basic_ostream<_CharT, _Traits>&
820operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn)
821{
822#ifndef _LIBCPP_NO_EXCEPTIONS
823 try
824 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400825#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000826 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
827 if (__s)
828 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000829 typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000830 size_t __len = char_traits<char>::length(__strn);
831 const int __bs = 100;
832 _CharT __wbb[__bs];
833 _CharT* __wb = __wbb;
834 unique_ptr<_CharT, void(*)(void*)> __h(0, free);
835 if (__len > __bs)
836 {
837 __wb = (_CharT*)malloc(__len*sizeof(_CharT));
838 if (__wb == 0)
839 __throw_bad_alloc();
840 __h.reset(__wb);
841 }
842 for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p)
843 *__p = __os.widen(*__strn);
Howard Hinnantc834c512011-11-29 18:15:50 +0000844 if (__pad_and_output(_Ip(__os),
Howard Hinnantc51e1022010-05-11 19:42:16 +0000845 __wb,
846 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
847 __wb + __len :
848 __wb,
849 __wb + __len,
850 __os,
851 __os.fill()).failed())
852 __os.setstate(ios_base::badbit | ios_base::failbit);
853 }
854#ifndef _LIBCPP_NO_EXCEPTIONS
855 }
856 catch (...)
857 {
858 __os.__set_badbit_and_consider_rethrow();
859 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400860#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861 return __os;
862}
863
864template<class _Traits>
865basic_ostream<char, _Traits>&
866operator<<(basic_ostream<char, _Traits>& __os, const char* __str)
867{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000868 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000869}
870
871template<class _Traits>
872basic_ostream<char, _Traits>&
873operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str)
874{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000875 const char *__s = (const char *) __str;
876 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877}
878
879template<class _Traits>
880basic_ostream<char, _Traits>&
881operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str)
882{
Marshall Clow4bc2be22014-02-16 01:57:26 +0000883 const char *__s = (const char *) __str;
884 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000885}
886
887template <class _CharT, class _Traits>
888basic_ostream<_CharT, _Traits>&
889basic_ostream<_CharT, _Traits>::put(char_type __c)
890{
891#ifndef _LIBCPP_NO_EXCEPTIONS
892 try
893 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400894#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895 sentry __s(*this);
896 if (__s)
897 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000898 typedef ostreambuf_iterator<_CharT, _Traits> _Op;
899 _Op __o(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000900 *__o = __c;
901 if (__o.failed())
902 this->setstate(ios_base::badbit);
903 }
904#ifndef _LIBCPP_NO_EXCEPTIONS
905 }
906 catch (...)
907 {
908 this->__set_badbit_and_consider_rethrow();
909 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400910#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000911 return *this;
912}
913
914template <class _CharT, class _Traits>
915basic_ostream<_CharT, _Traits>&
916basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
917{
918#ifndef _LIBCPP_NO_EXCEPTIONS
919 try
920 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400921#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000922 sentry __sen(*this);
923 if (__sen && __n)
924 {
Howard Hinnant79cef932013-01-15 17:22:03 +0000925 if (this->rdbuf()->sputn(__s, __n) != __n)
926 this->setstate(ios_base::badbit);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000927 }
928#ifndef _LIBCPP_NO_EXCEPTIONS
929 }
930 catch (...)
931 {
932 this->__set_badbit_and_consider_rethrow();
933 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400934#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000935 return *this;
936}
937
938template <class _CharT, class _Traits>
939basic_ostream<_CharT, _Traits>&
940basic_ostream<_CharT, _Traits>::flush()
941{
942#ifndef _LIBCPP_NO_EXCEPTIONS
943 try
944 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400945#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000946 if (this->rdbuf())
947 {
948 sentry __s(*this);
949 if (__s)
950 {
951 if (this->rdbuf()->pubsync() == -1)
952 this->setstate(ios_base::badbit);
953 }
954 }
955#ifndef _LIBCPP_NO_EXCEPTIONS
956 }
957 catch (...)
958 {
959 this->__set_badbit_and_consider_rethrow();
960 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400961#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000962 return *this;
963}
964
965template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000966typename basic_ostream<_CharT, _Traits>::pos_type
967basic_ostream<_CharT, _Traits>::tellp()
968{
969 if (this->fail())
970 return pos_type(-1);
971 return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
972}
973
974template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000975basic_ostream<_CharT, _Traits>&
976basic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
977{
Marshall Clow29c4daa2013-10-31 22:20:45 +0000978 sentry __s(*this);
Marshall Clow8aa079a2015-06-22 15:01:21 +0000979 if (!this->fail())
Howard Hinnantc51e1022010-05-11 19:42:16 +0000980 {
981 if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
982 this->setstate(ios_base::failbit);
983 }
984 return *this;
985}
986
987template <class _CharT, class _Traits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000988basic_ostream<_CharT, _Traits>&
989basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir)
990{
Marshall Clow29c4daa2013-10-31 22:20:45 +0000991 sentry __s(*this);
Marshall Clow8aa079a2015-06-22 15:01:21 +0000992 if (!this->fail())
Marshall Clow29c4daa2013-10-31 22:20:45 +0000993 {
994 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
995 this->setstate(ios_base::failbit);
996 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000997 return *this;
998}
999
1000template <class _CharT, class _Traits>
Louis Dionnee29136f2020-07-13 11:53:48 -04001001inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001002basic_ostream<_CharT, _Traits>&
1003endl(basic_ostream<_CharT, _Traits>& __os)
1004{
1005 __os.put(__os.widen('\n'));
1006 __os.flush();
1007 return __os;
1008}
1009
1010template <class _CharT, class _Traits>
Louis Dionnee29136f2020-07-13 11:53:48 -04001011inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001012basic_ostream<_CharT, _Traits>&
1013ends(basic_ostream<_CharT, _Traits>& __os)
1014{
1015 __os.put(_CharT());
1016 return __os;
1017}
1018
1019template <class _CharT, class _Traits>
Louis Dionnee29136f2020-07-13 11:53:48 -04001020inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001021basic_ostream<_CharT, _Traits>&
1022flush(basic_ostream<_CharT, _Traits>& __os)
1023{
1024 __os.flush();
1025 return __os;
1026}
1027
Eric Fiselier78ccf772017-04-18 23:38:41 +00001028#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001029
Louis Dionned9f73b12020-09-23 08:49:00 -04001030template <class _Stream, class _Tp, class = void>
1031struct __is_ostreamable : false_type { };
1032
Howard Hinnantc51e1022010-05-11 19:42:16 +00001033template <class _Stream, class _Tp>
Louis Dionned9f73b12020-09-23 08:49:00 -04001034struct __is_ostreamable<_Stream, _Tp, decltype(
Arthur O'Dwyer3285c342021-05-10 13:04:16 -04001035 declval<_Stream>() << declval<_Tp>(), void()
Louis Dionned9f73b12020-09-23 08:49:00 -04001036)> : true_type { };
1037
1038template <class _Stream, class _Tp, class = typename enable_if<
1039 _And<is_base_of<ios_base, _Stream>,
1040 __is_ostreamable<_Stream&, const _Tp&>>::value
1041>::type>
1042_LIBCPP_INLINE_VISIBILITY
1043_Stream&& operator<<(_Stream&& __os, const _Tp& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001044{
1045 __os << __x;
Howard Hinnantc8697b62012-01-12 23:37:51 +00001046 return _VSTD::move(__os);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047}
1048
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001049#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050
1051template<class _CharT, class _Traits, class _Allocator>
1052basic_ostream<_CharT, _Traits>&
1053operator<<(basic_ostream<_CharT, _Traits>& __os,
1054 const basic_string<_CharT, _Traits, _Allocator>& __str)
1055{
Marshall Clow4bc2be22014-02-16 01:57:26 +00001056 return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001057}
1058
Marshall Clowdf63a6d2016-07-21 05:31:24 +00001059template<class _CharT, class _Traits>
1060basic_ostream<_CharT, _Traits>&
1061operator<<(basic_ostream<_CharT, _Traits>& __os,
Eric Fiselier14116922019-09-25 18:56:54 +00001062 basic_string_view<_CharT, _Traits> __sv)
Marshall Clowdf63a6d2016-07-21 05:31:24 +00001063{
1064 return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size());
1065}
1066
Howard Hinnantc51e1022010-05-11 19:42:16 +00001067template <class _CharT, class _Traits>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001068inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001069basic_ostream<_CharT, _Traits>&
1070operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec)
1071{
1072 return __os << __ec.category().name() << ':' << __ec.value();
1073}
1074
Howard Hinnantc834c512011-11-29 18:15:50 +00001075template<class _CharT, class _Traits, class _Yp>
Evgeniy Stepanovb9254262016-01-08 19:21:02 +00001076inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001077basic_ostream<_CharT, _Traits>&
Howard Hinnantc834c512011-11-29 18:15:50 +00001078operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079{
1080 return __os << __p.get();
1081}
1082
Marshall Clowe52a3242017-11-27 15:51:36 +00001083template<class _CharT, class _Traits, class _Yp, class _Dp>
1084inline _LIBCPP_INLINE_VISIBILITY
1085typename enable_if
1086<
Marshall Cloweea0a1d2018-03-22 18:27:28 +00001087 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 +00001088 basic_ostream<_CharT, _Traits>&
1089>::type
1090operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)
1091{
1092 return __os << __p.get();
1093}
1094
Howard Hinnantc51e1022010-05-11 19:42:16 +00001095template <class _CharT, class _Traits, size_t _Size>
1096basic_ostream<_CharT, _Traits>&
Howard Hinnantfa65ab62011-04-05 14:55:28 +00001097operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001098{
1099 return __os << __x.template to_string<_CharT, _Traits>
1100 (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'),
1101 use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
1102}
1103
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001104_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>)
1105_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001106
1107_LIBCPP_END_NAMESPACE_STD
1108
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001109#endif // _LIBCPP_OSTREAM