xref: /freebsd-src/contrib/llvm-project/libcxx/include/__ostream/basic_ostream.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric //===---------------------------------------------------------------------===//
2*0fca6ea1SDimitry Andric //
3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric //
7*0fca6ea1SDimitry Andric //===---------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric 
9*0fca6ea1SDimitry Andric #ifndef _LIBCPP___OSTREAM_BASIC_OSTREAM_H
10*0fca6ea1SDimitry Andric #define _LIBCPP___OSTREAM_BASIC_OSTREAM_H
11*0fca6ea1SDimitry Andric 
12*0fca6ea1SDimitry Andric #include <__config>
13*0fca6ea1SDimitry Andric #include <__exception/operations.h>
14*0fca6ea1SDimitry Andric #include <__memory/shared_ptr.h>
15*0fca6ea1SDimitry Andric #include <__memory/unique_ptr.h>
16*0fca6ea1SDimitry Andric #include <__system_error/error_code.h>
17*0fca6ea1SDimitry Andric #include <__type_traits/conjunction.h>
18*0fca6ea1SDimitry Andric #include <__type_traits/enable_if.h>
19*0fca6ea1SDimitry Andric #include <__type_traits/is_base_of.h>
20*0fca6ea1SDimitry Andric #include <__type_traits/void_t.h>
21*0fca6ea1SDimitry Andric #include <__utility/declval.h>
22*0fca6ea1SDimitry Andric #include <bitset>
23*0fca6ea1SDimitry Andric #include <cstddef>
24*0fca6ea1SDimitry Andric #include <ios>
25*0fca6ea1SDimitry Andric #include <locale>
26*0fca6ea1SDimitry Andric #include <new> // for __throw_bad_alloc
27*0fca6ea1SDimitry Andric #include <streambuf>
28*0fca6ea1SDimitry Andric #include <string_view>
29*0fca6ea1SDimitry Andric 
30*0fca6ea1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
31*0fca6ea1SDimitry Andric #  pragma GCC system_header
32*0fca6ea1SDimitry Andric #endif
33*0fca6ea1SDimitry Andric 
34*0fca6ea1SDimitry Andric _LIBCPP_PUSH_MACROS
35*0fca6ea1SDimitry Andric #include <__undef_macros>
36*0fca6ea1SDimitry Andric 
37*0fca6ea1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
38*0fca6ea1SDimitry Andric 
39*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
40*0fca6ea1SDimitry Andric class _LIBCPP_TEMPLATE_VIS basic_ostream : virtual public basic_ios<_CharT, _Traits> {
41*0fca6ea1SDimitry Andric public:
42*0fca6ea1SDimitry Andric   // types (inherited from basic_ios (27.5.4)):
43*0fca6ea1SDimitry Andric   typedef _CharT char_type;
44*0fca6ea1SDimitry Andric   typedef _Traits traits_type;
45*0fca6ea1SDimitry Andric   typedef typename traits_type::int_type int_type;
46*0fca6ea1SDimitry Andric   typedef typename traits_type::pos_type pos_type;
47*0fca6ea1SDimitry Andric   typedef typename traits_type::off_type off_type;
48*0fca6ea1SDimitry Andric 
49*0fca6ea1SDimitry Andric   // 27.7.2.2 Constructor/destructor:
50*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb) {
51*0fca6ea1SDimitry Andric     this->init(__sb);
52*0fca6ea1SDimitry Andric   }
53*0fca6ea1SDimitry Andric   ~basic_ostream() override;
54*0fca6ea1SDimitry Andric 
55*0fca6ea1SDimitry Andric   basic_ostream(const basic_ostream& __rhs)            = delete;
56*0fca6ea1SDimitry Andric   basic_ostream& operator=(const basic_ostream& __rhs) = delete;
57*0fca6ea1SDimitry Andric 
58*0fca6ea1SDimitry Andric protected:
59*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI basic_ostream(basic_ostream&& __rhs);
60*0fca6ea1SDimitry Andric 
61*0fca6ea1SDimitry Andric   // 27.7.2.3 Assign/swap
62*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI basic_ostream& operator=(basic_ostream&& __rhs);
63*0fca6ea1SDimitry Andric 
64*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_ostream& __rhs) {
65*0fca6ea1SDimitry Andric     basic_ios<char_type, traits_type>::swap(__rhs);
66*0fca6ea1SDimitry Andric   }
67*0fca6ea1SDimitry Andric 
68*0fca6ea1SDimitry Andric public:
69*0fca6ea1SDimitry Andric   // 27.7.2.4 Prefix/suffix:
70*0fca6ea1SDimitry Andric   class _LIBCPP_TEMPLATE_VIS sentry;
71*0fca6ea1SDimitry Andric 
72*0fca6ea1SDimitry Andric   // 27.7.2.6 Formatted output:
73*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)) {
74*0fca6ea1SDimitry Andric     return __pf(*this);
75*0fca6ea1SDimitry Andric   }
76*0fca6ea1SDimitry Andric 
77*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream&
78*0fca6ea1SDimitry Andric   operator<<(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) {
79*0fca6ea1SDimitry Andric     __pf(*this);
80*0fca6ea1SDimitry Andric     return *this;
81*0fca6ea1SDimitry Andric   }
82*0fca6ea1SDimitry Andric 
83*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&)) {
84*0fca6ea1SDimitry Andric     __pf(*this);
85*0fca6ea1SDimitry Andric     return *this;
86*0fca6ea1SDimitry Andric   }
87*0fca6ea1SDimitry Andric 
88*0fca6ea1SDimitry Andric   basic_ostream& operator<<(bool __n);
89*0fca6ea1SDimitry Andric   basic_ostream& operator<<(short __n);
90*0fca6ea1SDimitry Andric   basic_ostream& operator<<(unsigned short __n);
91*0fca6ea1SDimitry Andric   basic_ostream& operator<<(int __n);
92*0fca6ea1SDimitry Andric   basic_ostream& operator<<(unsigned int __n);
93*0fca6ea1SDimitry Andric   basic_ostream& operator<<(long __n);
94*0fca6ea1SDimitry Andric   basic_ostream& operator<<(unsigned long __n);
95*0fca6ea1SDimitry Andric   basic_ostream& operator<<(long long __n);
96*0fca6ea1SDimitry Andric   basic_ostream& operator<<(unsigned long long __n);
97*0fca6ea1SDimitry Andric   basic_ostream& operator<<(float __f);
98*0fca6ea1SDimitry Andric   basic_ostream& operator<<(double __f);
99*0fca6ea1SDimitry Andric   basic_ostream& operator<<(long double __f);
100*0fca6ea1SDimitry Andric   basic_ostream& operator<<(const void* __p);
101*0fca6ea1SDimitry Andric 
102*0fca6ea1SDimitry Andric #if _LIBCPP_STD_VER >= 23
103*0fca6ea1SDimitry Andric   _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(const volatile void* __p) {
104*0fca6ea1SDimitry Andric     return operator<<(const_cast<const void*>(__p));
105*0fca6ea1SDimitry Andric   }
106*0fca6ea1SDimitry Andric #endif
107*0fca6ea1SDimitry Andric 
108*0fca6ea1SDimitry Andric   basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);
109*0fca6ea1SDimitry Andric 
110*0fca6ea1SDimitry Andric #if _LIBCPP_STD_VER >= 17
111*0fca6ea1SDimitry Andric   // LWG 2221 - nullptr. This is not backported to older standards modes.
112*0fca6ea1SDimitry Andric   // See https://reviews.llvm.org/D127033 for more info on the rationale.
113*0fca6ea1SDimitry Andric   _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(nullptr_t) { return *this << "nullptr"; }
114*0fca6ea1SDimitry Andric #endif
115*0fca6ea1SDimitry Andric 
116*0fca6ea1SDimitry Andric   // 27.7.2.7 Unformatted output:
117*0fca6ea1SDimitry Andric   basic_ostream& put(char_type __c);
118*0fca6ea1SDimitry Andric   basic_ostream& write(const char_type* __s, streamsize __n);
119*0fca6ea1SDimitry Andric   basic_ostream& flush();
120*0fca6ea1SDimitry Andric 
121*0fca6ea1SDimitry Andric   // 27.7.2.5 seeks:
122*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 pos_type tellp();
123*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(pos_type __pos);
124*0fca6ea1SDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
125*0fca6ea1SDimitry Andric 
126*0fca6ea1SDimitry Andric protected:
127*0fca6ea1SDimitry Andric   _LIBCPP_HIDE_FROM_ABI basic_ostream() {} // extension, intentially does not initialize
128*0fca6ea1SDimitry Andric };
129*0fca6ea1SDimitry Andric 
130*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
131*0fca6ea1SDimitry Andric class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry {
132*0fca6ea1SDimitry Andric   bool __ok_;
133*0fca6ea1SDimitry Andric   basic_ostream<_CharT, _Traits>& __os_;
134*0fca6ea1SDimitry Andric 
135*0fca6ea1SDimitry Andric public:
136*0fca6ea1SDimitry Andric   explicit sentry(basic_ostream<_CharT, _Traits>& __os);
137*0fca6ea1SDimitry Andric   ~sentry();
138*0fca6ea1SDimitry Andric   sentry(const sentry&)            = delete;
139*0fca6ea1SDimitry Andric   sentry& operator=(const sentry&) = delete;
140*0fca6ea1SDimitry Andric 
141*0fca6ea1SDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; }
142*0fca6ea1SDimitry Andric };
143*0fca6ea1SDimitry Andric 
144*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
145*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) : __ok_(false), __os_(__os) {
146*0fca6ea1SDimitry Andric   if (__os.good()) {
147*0fca6ea1SDimitry Andric     if (__os.tie())
148*0fca6ea1SDimitry Andric       __os.tie()->flush();
149*0fca6ea1SDimitry Andric     __ok_ = true;
150*0fca6ea1SDimitry Andric   }
151*0fca6ea1SDimitry Andric }
152*0fca6ea1SDimitry Andric 
153*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
154*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::sentry::~sentry() {
155*0fca6ea1SDimitry Andric   if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) && !uncaught_exception()) {
156*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
157*0fca6ea1SDimitry Andric     try {
158*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
159*0fca6ea1SDimitry Andric       if (__os_.rdbuf()->pubsync() == -1)
160*0fca6ea1SDimitry Andric         __os_.setstate(ios_base::badbit);
161*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
162*0fca6ea1SDimitry Andric     } catch (...) {
163*0fca6ea1SDimitry Andric     }
164*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
165*0fca6ea1SDimitry Andric   }
166*0fca6ea1SDimitry Andric }
167*0fca6ea1SDimitry Andric 
168*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
169*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) {
170*0fca6ea1SDimitry Andric   this->move(__rhs);
171*0fca6ea1SDimitry Andric }
172*0fca6ea1SDimitry Andric 
173*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
174*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs) {
175*0fca6ea1SDimitry Andric   swap(__rhs);
176*0fca6ea1SDimitry Andric   return *this;
177*0fca6ea1SDimitry Andric }
178*0fca6ea1SDimitry Andric 
179*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
180*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::~basic_ostream() {}
181*0fca6ea1SDimitry Andric 
182*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
183*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>&
184*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) {
185*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
186*0fca6ea1SDimitry Andric   try {
187*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
188*0fca6ea1SDimitry Andric     sentry __s(*this);
189*0fca6ea1SDimitry Andric     if (__s) {
190*0fca6ea1SDimitry Andric       if (__sb) {
191*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
192*0fca6ea1SDimitry Andric         try {
193*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
194*0fca6ea1SDimitry Andric           typedef istreambuf_iterator<_CharT, _Traits> _Ip;
195*0fca6ea1SDimitry Andric           typedef ostreambuf_iterator<_CharT, _Traits> _Op;
196*0fca6ea1SDimitry Andric           _Ip __i(__sb);
197*0fca6ea1SDimitry Andric           _Ip __eof;
198*0fca6ea1SDimitry Andric           _Op __o(*this);
199*0fca6ea1SDimitry Andric           size_t __c = 0;
200*0fca6ea1SDimitry Andric           for (; __i != __eof; ++__i, ++__o, ++__c) {
201*0fca6ea1SDimitry Andric             *__o = *__i;
202*0fca6ea1SDimitry Andric             if (__o.failed())
203*0fca6ea1SDimitry Andric               break;
204*0fca6ea1SDimitry Andric           }
205*0fca6ea1SDimitry Andric           if (__c == 0)
206*0fca6ea1SDimitry Andric             this->setstate(ios_base::failbit);
207*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
208*0fca6ea1SDimitry Andric         } catch (...) {
209*0fca6ea1SDimitry Andric           this->__set_failbit_and_consider_rethrow();
210*0fca6ea1SDimitry Andric         }
211*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
212*0fca6ea1SDimitry Andric       } else
213*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit);
214*0fca6ea1SDimitry Andric     }
215*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
216*0fca6ea1SDimitry Andric   } catch (...) {
217*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
218*0fca6ea1SDimitry Andric   }
219*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
220*0fca6ea1SDimitry Andric   return *this;
221*0fca6ea1SDimitry Andric }
222*0fca6ea1SDimitry Andric 
223*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
224*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(bool __n) {
225*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
226*0fca6ea1SDimitry Andric   try {
227*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
228*0fca6ea1SDimitry Andric     sentry __s(*this);
229*0fca6ea1SDimitry Andric     if (__s) {
230*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
231*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
232*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
233*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
234*0fca6ea1SDimitry Andric     }
235*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
236*0fca6ea1SDimitry Andric   } catch (...) {
237*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
238*0fca6ea1SDimitry Andric   }
239*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
240*0fca6ea1SDimitry Andric   return *this;
241*0fca6ea1SDimitry Andric }
242*0fca6ea1SDimitry Andric 
243*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
244*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(short __n) {
245*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
246*0fca6ea1SDimitry Andric   try {
247*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
248*0fca6ea1SDimitry Andric     sentry __s(*this);
249*0fca6ea1SDimitry Andric     if (__s) {
250*0fca6ea1SDimitry Andric       ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
251*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
252*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
253*0fca6ea1SDimitry Andric       if (__f.put(*this,
254*0fca6ea1SDimitry Andric                   *this,
255*0fca6ea1SDimitry Andric                   this->fill(),
256*0fca6ea1SDimitry Andric                   __flags == ios_base::oct || __flags == ios_base::hex
257*0fca6ea1SDimitry Andric                       ? static_cast<long>(static_cast<unsigned short>(__n))
258*0fca6ea1SDimitry Andric                       : static_cast<long>(__n))
259*0fca6ea1SDimitry Andric               .failed())
260*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
261*0fca6ea1SDimitry Andric     }
262*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
263*0fca6ea1SDimitry Andric   } catch (...) {
264*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
265*0fca6ea1SDimitry Andric   }
266*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
267*0fca6ea1SDimitry Andric   return *this;
268*0fca6ea1SDimitry Andric }
269*0fca6ea1SDimitry Andric 
270*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
271*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) {
272*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
273*0fca6ea1SDimitry Andric   try {
274*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
275*0fca6ea1SDimitry Andric     sentry __s(*this);
276*0fca6ea1SDimitry Andric     if (__s) {
277*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
278*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
279*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
280*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
281*0fca6ea1SDimitry Andric     }
282*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
283*0fca6ea1SDimitry Andric   } catch (...) {
284*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
285*0fca6ea1SDimitry Andric   }
286*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
287*0fca6ea1SDimitry Andric   return *this;
288*0fca6ea1SDimitry Andric }
289*0fca6ea1SDimitry Andric 
290*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
291*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(int __n) {
292*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
293*0fca6ea1SDimitry Andric   try {
294*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
295*0fca6ea1SDimitry Andric     sentry __s(*this);
296*0fca6ea1SDimitry Andric     if (__s) {
297*0fca6ea1SDimitry Andric       ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
298*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
299*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
300*0fca6ea1SDimitry Andric       if (__f.put(*this,
301*0fca6ea1SDimitry Andric                   *this,
302*0fca6ea1SDimitry Andric                   this->fill(),
303*0fca6ea1SDimitry Andric                   __flags == ios_base::oct || __flags == ios_base::hex
304*0fca6ea1SDimitry Andric                       ? static_cast<long>(static_cast<unsigned int>(__n))
305*0fca6ea1SDimitry Andric                       : static_cast<long>(__n))
306*0fca6ea1SDimitry Andric               .failed())
307*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
308*0fca6ea1SDimitry Andric     }
309*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
310*0fca6ea1SDimitry Andric   } catch (...) {
311*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
312*0fca6ea1SDimitry Andric   }
313*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
314*0fca6ea1SDimitry Andric   return *this;
315*0fca6ea1SDimitry Andric }
316*0fca6ea1SDimitry Andric 
317*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
318*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) {
319*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
320*0fca6ea1SDimitry Andric   try {
321*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
322*0fca6ea1SDimitry Andric     sentry __s(*this);
323*0fca6ea1SDimitry Andric     if (__s) {
324*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
325*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
326*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
327*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
328*0fca6ea1SDimitry Andric     }
329*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
330*0fca6ea1SDimitry Andric   } catch (...) {
331*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
332*0fca6ea1SDimitry Andric   }
333*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
334*0fca6ea1SDimitry Andric   return *this;
335*0fca6ea1SDimitry Andric }
336*0fca6ea1SDimitry Andric 
337*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
338*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long __n) {
339*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
340*0fca6ea1SDimitry Andric   try {
341*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
342*0fca6ea1SDimitry Andric     sentry __s(*this);
343*0fca6ea1SDimitry Andric     if (__s) {
344*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
345*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
346*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
347*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
348*0fca6ea1SDimitry Andric     }
349*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
350*0fca6ea1SDimitry Andric   } catch (...) {
351*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
352*0fca6ea1SDimitry Andric   }
353*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
354*0fca6ea1SDimitry Andric   return *this;
355*0fca6ea1SDimitry Andric }
356*0fca6ea1SDimitry Andric 
357*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
358*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) {
359*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
360*0fca6ea1SDimitry Andric   try {
361*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
362*0fca6ea1SDimitry Andric     sentry __s(*this);
363*0fca6ea1SDimitry Andric     if (__s) {
364*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
365*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
366*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
367*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
368*0fca6ea1SDimitry Andric     }
369*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
370*0fca6ea1SDimitry Andric   } catch (...) {
371*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
372*0fca6ea1SDimitry Andric   }
373*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
374*0fca6ea1SDimitry Andric   return *this;
375*0fca6ea1SDimitry Andric }
376*0fca6ea1SDimitry Andric 
377*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
378*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long long __n) {
379*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
380*0fca6ea1SDimitry Andric   try {
381*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
382*0fca6ea1SDimitry Andric     sentry __s(*this);
383*0fca6ea1SDimitry Andric     if (__s) {
384*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
385*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
386*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
387*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
388*0fca6ea1SDimitry Andric     }
389*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
390*0fca6ea1SDimitry Andric   } catch (...) {
391*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
392*0fca6ea1SDimitry Andric   }
393*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
394*0fca6ea1SDimitry Andric   return *this;
395*0fca6ea1SDimitry Andric }
396*0fca6ea1SDimitry Andric 
397*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
398*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) {
399*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
400*0fca6ea1SDimitry Andric   try {
401*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
402*0fca6ea1SDimitry Andric     sentry __s(*this);
403*0fca6ea1SDimitry Andric     if (__s) {
404*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
405*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
406*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
407*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
408*0fca6ea1SDimitry Andric     }
409*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
410*0fca6ea1SDimitry Andric   } catch (...) {
411*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
412*0fca6ea1SDimitry Andric   }
413*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
414*0fca6ea1SDimitry Andric   return *this;
415*0fca6ea1SDimitry Andric }
416*0fca6ea1SDimitry Andric 
417*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
418*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(float __n) {
419*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
420*0fca6ea1SDimitry Andric   try {
421*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
422*0fca6ea1SDimitry Andric     sentry __s(*this);
423*0fca6ea1SDimitry Andric     if (__s) {
424*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
425*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
426*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed())
427*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
428*0fca6ea1SDimitry Andric     }
429*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
430*0fca6ea1SDimitry Andric   } catch (...) {
431*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
432*0fca6ea1SDimitry Andric   }
433*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
434*0fca6ea1SDimitry Andric   return *this;
435*0fca6ea1SDimitry Andric }
436*0fca6ea1SDimitry Andric 
437*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
438*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(double __n) {
439*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
440*0fca6ea1SDimitry Andric   try {
441*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
442*0fca6ea1SDimitry Andric     sentry __s(*this);
443*0fca6ea1SDimitry Andric     if (__s) {
444*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
445*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
446*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
447*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
448*0fca6ea1SDimitry Andric     }
449*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
450*0fca6ea1SDimitry Andric   } catch (...) {
451*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
452*0fca6ea1SDimitry Andric   }
453*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
454*0fca6ea1SDimitry Andric   return *this;
455*0fca6ea1SDimitry Andric }
456*0fca6ea1SDimitry Andric 
457*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
458*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long double __n) {
459*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
460*0fca6ea1SDimitry Andric   try {
461*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
462*0fca6ea1SDimitry Andric     sentry __s(*this);
463*0fca6ea1SDimitry Andric     if (__s) {
464*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
465*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
466*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
467*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
468*0fca6ea1SDimitry Andric     }
469*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
470*0fca6ea1SDimitry Andric   } catch (...) {
471*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
472*0fca6ea1SDimitry Andric   }
473*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
474*0fca6ea1SDimitry Andric   return *this;
475*0fca6ea1SDimitry Andric }
476*0fca6ea1SDimitry Andric 
477*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
478*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(const void* __n) {
479*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
480*0fca6ea1SDimitry Andric   try {
481*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
482*0fca6ea1SDimitry Andric     sentry __s(*this);
483*0fca6ea1SDimitry Andric     if (__s) {
484*0fca6ea1SDimitry Andric       typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
485*0fca6ea1SDimitry Andric       const _Fp& __f = std::use_facet<_Fp>(this->getloc());
486*0fca6ea1SDimitry Andric       if (__f.put(*this, *this, this->fill(), __n).failed())
487*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit | ios_base::failbit);
488*0fca6ea1SDimitry Andric     }
489*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
490*0fca6ea1SDimitry Andric   } catch (...) {
491*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
492*0fca6ea1SDimitry Andric   }
493*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
494*0fca6ea1SDimitry Andric   return *this;
495*0fca6ea1SDimitry Andric }
496*0fca6ea1SDimitry Andric 
497*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
498*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
499*0fca6ea1SDimitry Andric __put_character_sequence(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str, size_t __len) {
500*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
501*0fca6ea1SDimitry Andric   try {
502*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
503*0fca6ea1SDimitry Andric     typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
504*0fca6ea1SDimitry Andric     if (__s) {
505*0fca6ea1SDimitry Andric       typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
506*0fca6ea1SDimitry Andric       if (std::__pad_and_output(
507*0fca6ea1SDimitry Andric               _Ip(__os),
508*0fca6ea1SDimitry Andric               __str,
509*0fca6ea1SDimitry Andric               (__os.flags() & ios_base::adjustfield) == ios_base::left ? __str + __len : __str,
510*0fca6ea1SDimitry Andric               __str + __len,
511*0fca6ea1SDimitry Andric               __os,
512*0fca6ea1SDimitry Andric               __os.fill())
513*0fca6ea1SDimitry Andric               .failed())
514*0fca6ea1SDimitry Andric         __os.setstate(ios_base::badbit | ios_base::failbit);
515*0fca6ea1SDimitry Andric     }
516*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
517*0fca6ea1SDimitry Andric   } catch (...) {
518*0fca6ea1SDimitry Andric     __os.__set_badbit_and_consider_rethrow();
519*0fca6ea1SDimitry Andric   }
520*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
521*0fca6ea1SDimitry Andric   return __os;
522*0fca6ea1SDimitry Andric }
523*0fca6ea1SDimitry Andric 
524*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
525*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) {
526*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, &__c, 1);
527*0fca6ea1SDimitry Andric }
528*0fca6ea1SDimitry Andric 
529*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
530*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) {
531*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
532*0fca6ea1SDimitry Andric   try {
533*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
534*0fca6ea1SDimitry Andric     typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
535*0fca6ea1SDimitry Andric     if (__s) {
536*0fca6ea1SDimitry Andric       _CharT __c = __os.widen(__cn);
537*0fca6ea1SDimitry Andric       typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
538*0fca6ea1SDimitry Andric       if (std::__pad_and_output(
539*0fca6ea1SDimitry Andric               _Ip(__os),
540*0fca6ea1SDimitry Andric               &__c,
541*0fca6ea1SDimitry Andric               (__os.flags() & ios_base::adjustfield) == ios_base::left ? &__c + 1 : &__c,
542*0fca6ea1SDimitry Andric               &__c + 1,
543*0fca6ea1SDimitry Andric               __os,
544*0fca6ea1SDimitry Andric               __os.fill())
545*0fca6ea1SDimitry Andric               .failed())
546*0fca6ea1SDimitry Andric         __os.setstate(ios_base::badbit | ios_base::failbit);
547*0fca6ea1SDimitry Andric     }
548*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
549*0fca6ea1SDimitry Andric   } catch (...) {
550*0fca6ea1SDimitry Andric     __os.__set_badbit_and_consider_rethrow();
551*0fca6ea1SDimitry Andric   }
552*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
553*0fca6ea1SDimitry Andric   return __os;
554*0fca6ea1SDimitry Andric }
555*0fca6ea1SDimitry Andric 
556*0fca6ea1SDimitry Andric template <class _Traits>
557*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, char __c) {
558*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, &__c, 1);
559*0fca6ea1SDimitry Andric }
560*0fca6ea1SDimitry Andric 
561*0fca6ea1SDimitry Andric template <class _Traits>
562*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, signed char __c) {
563*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, (char*)&__c, 1);
564*0fca6ea1SDimitry Andric }
565*0fca6ea1SDimitry Andric 
566*0fca6ea1SDimitry Andric template <class _Traits>
567*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) {
568*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, (char*)&__c, 1);
569*0fca6ea1SDimitry Andric }
570*0fca6ea1SDimitry Andric 
571*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
572*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
573*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) {
574*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, __str, _Traits::length(__str));
575*0fca6ea1SDimitry Andric }
576*0fca6ea1SDimitry Andric 
577*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
578*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
579*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) {
580*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
581*0fca6ea1SDimitry Andric   try {
582*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
583*0fca6ea1SDimitry Andric     typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
584*0fca6ea1SDimitry Andric     if (__s) {
585*0fca6ea1SDimitry Andric       typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
586*0fca6ea1SDimitry Andric       size_t __len   = char_traits<char>::length(__strn);
587*0fca6ea1SDimitry Andric       const int __bs = 100;
588*0fca6ea1SDimitry Andric       _CharT __wbb[__bs];
589*0fca6ea1SDimitry Andric       _CharT* __wb = __wbb;
590*0fca6ea1SDimitry Andric       unique_ptr<_CharT, void (*)(void*)> __h(0, free);
591*0fca6ea1SDimitry Andric       if (__len > __bs) {
592*0fca6ea1SDimitry Andric         __wb = (_CharT*)malloc(__len * sizeof(_CharT));
593*0fca6ea1SDimitry Andric         if (__wb == 0)
594*0fca6ea1SDimitry Andric           __throw_bad_alloc();
595*0fca6ea1SDimitry Andric         __h.reset(__wb);
596*0fca6ea1SDimitry Andric       }
597*0fca6ea1SDimitry Andric       for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p)
598*0fca6ea1SDimitry Andric         *__p = __os.widen(*__strn);
599*0fca6ea1SDimitry Andric       if (std::__pad_and_output(
600*0fca6ea1SDimitry Andric               _Ip(__os),
601*0fca6ea1SDimitry Andric               __wb,
602*0fca6ea1SDimitry Andric               (__os.flags() & ios_base::adjustfield) == ios_base::left ? __wb + __len : __wb,
603*0fca6ea1SDimitry Andric               __wb + __len,
604*0fca6ea1SDimitry Andric               __os,
605*0fca6ea1SDimitry Andric               __os.fill())
606*0fca6ea1SDimitry Andric               .failed())
607*0fca6ea1SDimitry Andric         __os.setstate(ios_base::badbit | ios_base::failbit);
608*0fca6ea1SDimitry Andric     }
609*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
610*0fca6ea1SDimitry Andric   } catch (...) {
611*0fca6ea1SDimitry Andric     __os.__set_badbit_and_consider_rethrow();
612*0fca6ea1SDimitry Andric   }
613*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
614*0fca6ea1SDimitry Andric   return __os;
615*0fca6ea1SDimitry Andric }
616*0fca6ea1SDimitry Andric 
617*0fca6ea1SDimitry Andric template <class _Traits>
618*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, const char* __str) {
619*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, __str, _Traits::length(__str));
620*0fca6ea1SDimitry Andric }
621*0fca6ea1SDimitry Andric 
622*0fca6ea1SDimitry Andric template <class _Traits>
623*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>&
624*0fca6ea1SDimitry Andric operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) {
625*0fca6ea1SDimitry Andric   const char* __s = (const char*)__str;
626*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, __s, _Traits::length(__s));
627*0fca6ea1SDimitry Andric }
628*0fca6ea1SDimitry Andric 
629*0fca6ea1SDimitry Andric template <class _Traits>
630*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>&
631*0fca6ea1SDimitry Andric operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) {
632*0fca6ea1SDimitry Andric   const char* __s = (const char*)__str;
633*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, __s, _Traits::length(__s));
634*0fca6ea1SDimitry Andric }
635*0fca6ea1SDimitry Andric 
636*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
637*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::put(char_type __c) {
638*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
639*0fca6ea1SDimitry Andric   try {
640*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
641*0fca6ea1SDimitry Andric     sentry __s(*this);
642*0fca6ea1SDimitry Andric     if (__s) {
643*0fca6ea1SDimitry Andric       typedef ostreambuf_iterator<_CharT, _Traits> _Op;
644*0fca6ea1SDimitry Andric       _Op __o(*this);
645*0fca6ea1SDimitry Andric       *__o = __c;
646*0fca6ea1SDimitry Andric       if (__o.failed())
647*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit);
648*0fca6ea1SDimitry Andric     }
649*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
650*0fca6ea1SDimitry Andric   } catch (...) {
651*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
652*0fca6ea1SDimitry Andric   }
653*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
654*0fca6ea1SDimitry Andric   return *this;
655*0fca6ea1SDimitry Andric }
656*0fca6ea1SDimitry Andric 
657*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
658*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) {
659*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
660*0fca6ea1SDimitry Andric   try {
661*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
662*0fca6ea1SDimitry Andric     sentry __sen(*this);
663*0fca6ea1SDimitry Andric     if (__sen && __n) {
664*0fca6ea1SDimitry Andric       if (this->rdbuf()->sputn(__s, __n) != __n)
665*0fca6ea1SDimitry Andric         this->setstate(ios_base::badbit);
666*0fca6ea1SDimitry Andric     }
667*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
668*0fca6ea1SDimitry Andric   } catch (...) {
669*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
670*0fca6ea1SDimitry Andric   }
671*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
672*0fca6ea1SDimitry Andric   return *this;
673*0fca6ea1SDimitry Andric }
674*0fca6ea1SDimitry Andric 
675*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
676*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::flush() {
677*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
678*0fca6ea1SDimitry Andric   try {
679*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
680*0fca6ea1SDimitry Andric     if (this->rdbuf()) {
681*0fca6ea1SDimitry Andric       sentry __s(*this);
682*0fca6ea1SDimitry Andric       if (__s) {
683*0fca6ea1SDimitry Andric         if (this->rdbuf()->pubsync() == -1)
684*0fca6ea1SDimitry Andric           this->setstate(ios_base::badbit);
685*0fca6ea1SDimitry Andric       }
686*0fca6ea1SDimitry Andric     }
687*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
688*0fca6ea1SDimitry Andric   } catch (...) {
689*0fca6ea1SDimitry Andric     this->__set_badbit_and_consider_rethrow();
690*0fca6ea1SDimitry Andric   }
691*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS
692*0fca6ea1SDimitry Andric   return *this;
693*0fca6ea1SDimitry Andric }
694*0fca6ea1SDimitry Andric 
695*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
696*0fca6ea1SDimitry Andric typename basic_ostream<_CharT, _Traits>::pos_type basic_ostream<_CharT, _Traits>::tellp() {
697*0fca6ea1SDimitry Andric   if (this->fail())
698*0fca6ea1SDimitry Andric     return pos_type(-1);
699*0fca6ea1SDimitry Andric   return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
700*0fca6ea1SDimitry Andric }
701*0fca6ea1SDimitry Andric 
702*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
703*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) {
704*0fca6ea1SDimitry Andric   sentry __s(*this);
705*0fca6ea1SDimitry Andric   if (!this->fail()) {
706*0fca6ea1SDimitry Andric     if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
707*0fca6ea1SDimitry Andric       this->setstate(ios_base::failbit);
708*0fca6ea1SDimitry Andric   }
709*0fca6ea1SDimitry Andric   return *this;
710*0fca6ea1SDimitry Andric }
711*0fca6ea1SDimitry Andric 
712*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
713*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) {
714*0fca6ea1SDimitry Andric   sentry __s(*this);
715*0fca6ea1SDimitry Andric   if (!this->fail()) {
716*0fca6ea1SDimitry Andric     if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
717*0fca6ea1SDimitry Andric       this->setstate(ios_base::failbit);
718*0fca6ea1SDimitry Andric   }
719*0fca6ea1SDimitry Andric   return *this;
720*0fca6ea1SDimitry Andric }
721*0fca6ea1SDimitry Andric 
722*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
723*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os) {
724*0fca6ea1SDimitry Andric   __os.put(__os.widen('\n'));
725*0fca6ea1SDimitry Andric   __os.flush();
726*0fca6ea1SDimitry Andric   return __os;
727*0fca6ea1SDimitry Andric }
728*0fca6ea1SDimitry Andric 
729*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
730*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& ends(basic_ostream<_CharT, _Traits>& __os) {
731*0fca6ea1SDimitry Andric   __os.put(_CharT());
732*0fca6ea1SDimitry Andric   return __os;
733*0fca6ea1SDimitry Andric }
734*0fca6ea1SDimitry Andric 
735*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
736*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& flush(basic_ostream<_CharT, _Traits>& __os) {
737*0fca6ea1SDimitry Andric   __os.flush();
738*0fca6ea1SDimitry Andric   return __os;
739*0fca6ea1SDimitry Andric }
740*0fca6ea1SDimitry Andric 
741*0fca6ea1SDimitry Andric template <class _Stream, class _Tp, class = void>
742*0fca6ea1SDimitry Andric struct __is_ostreamable : false_type {};
743*0fca6ea1SDimitry Andric 
744*0fca6ea1SDimitry Andric template <class _Stream, class _Tp>
745*0fca6ea1SDimitry Andric struct __is_ostreamable<_Stream, _Tp, decltype(std::declval<_Stream>() << std::declval<_Tp>(), void())> : true_type {};
746*0fca6ea1SDimitry Andric 
747*0fca6ea1SDimitry Andric template <class _Stream,
748*0fca6ea1SDimitry Andric           class _Tp,
749*0fca6ea1SDimitry Andric           __enable_if_t<_And<is_base_of<ios_base, _Stream>, __is_ostreamable<_Stream&, const _Tp&> >::value, int> = 0>
750*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI _Stream&& operator<<(_Stream&& __os, const _Tp& __x) {
751*0fca6ea1SDimitry Andric   __os << __x;
752*0fca6ea1SDimitry Andric   return std::move(__os);
753*0fca6ea1SDimitry Andric }
754*0fca6ea1SDimitry Andric 
755*0fca6ea1SDimitry Andric template <class _CharT, class _Traits, class _Allocator>
756*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>&
757*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const basic_string<_CharT, _Traits, _Allocator>& __str) {
758*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, __str.data(), __str.size());
759*0fca6ea1SDimitry Andric }
760*0fca6ea1SDimitry Andric 
761*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
762*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
763*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, basic_string_view<_CharT, _Traits> __sv) {
764*0fca6ea1SDimitry Andric   return std::__put_character_sequence(__os, __sv.data(), __sv.size());
765*0fca6ea1SDimitry Andric }
766*0fca6ea1SDimitry Andric 
767*0fca6ea1SDimitry Andric template <class _CharT, class _Traits>
768*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
769*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) {
770*0fca6ea1SDimitry Andric   return __os << __ec.category().name() << ':' << __ec.value();
771*0fca6ea1SDimitry Andric }
772*0fca6ea1SDimitry Andric 
773*0fca6ea1SDimitry Andric template <class _CharT, class _Traits, class _Yp>
774*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
775*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) {
776*0fca6ea1SDimitry Andric   return __os << __p.get();
777*0fca6ea1SDimitry Andric }
778*0fca6ea1SDimitry Andric 
779*0fca6ea1SDimitry Andric template <
780*0fca6ea1SDimitry Andric     class _CharT,
781*0fca6ea1SDimitry Andric     class _Traits,
782*0fca6ea1SDimitry Andric     class _Yp,
783*0fca6ea1SDimitry Andric     class _Dp,
784*0fca6ea1SDimitry Andric     __enable_if_t<is_same<void,
785*0fca6ea1SDimitry Andric                           __void_t<decltype((std::declval<basic_ostream<_CharT, _Traits>&>()
786*0fca6ea1SDimitry Andric                                              << std::declval<typename unique_ptr<_Yp, _Dp>::pointer>()))> >::value,
787*0fca6ea1SDimitry Andric                   int> = 0>
788*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
789*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p) {
790*0fca6ea1SDimitry Andric   return __os << __p.get();
791*0fca6ea1SDimitry Andric }
792*0fca6ea1SDimitry Andric 
793*0fca6ea1SDimitry Andric template <class _CharT, class _Traits, size_t _Size>
794*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
795*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) {
796*0fca6ea1SDimitry Andric   return __os << __x.template to_string<_CharT, _Traits>(std::use_facet<ctype<_CharT> >(__os.getloc()).widen('0'),
797*0fca6ea1SDimitry Andric                                                          std::use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
798*0fca6ea1SDimitry Andric }
799*0fca6ea1SDimitry Andric 
800*0fca6ea1SDimitry Andric #if _LIBCPP_STD_VER >= 20
801*0fca6ea1SDimitry Andric 
802*0fca6ea1SDimitry Andric #  ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
803*0fca6ea1SDimitry Andric template <class _Traits>
804*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete;
805*0fca6ea1SDimitry Andric 
806*0fca6ea1SDimitry Andric template <class _Traits>
807*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete;
808*0fca6ea1SDimitry Andric 
809*0fca6ea1SDimitry Andric template <class _Traits>
810*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete;
811*0fca6ea1SDimitry Andric 
812*0fca6ea1SDimitry Andric template <class _Traits>
813*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete;
814*0fca6ea1SDimitry Andric 
815*0fca6ea1SDimitry Andric template <class _Traits>
816*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete;
817*0fca6ea1SDimitry Andric 
818*0fca6ea1SDimitry Andric template <class _Traits>
819*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete;
820*0fca6ea1SDimitry Andric 
821*0fca6ea1SDimitry Andric #  endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
822*0fca6ea1SDimitry Andric 
823*0fca6ea1SDimitry Andric #  ifndef _LIBCPP_HAS_NO_CHAR8_T
824*0fca6ea1SDimitry Andric template <class _Traits>
825*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char8_t) = delete;
826*0fca6ea1SDimitry Andric 
827*0fca6ea1SDimitry Andric template <class _Traits>
828*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete;
829*0fca6ea1SDimitry Andric 
830*0fca6ea1SDimitry Andric template <class _Traits>
831*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete;
832*0fca6ea1SDimitry Andric 
833*0fca6ea1SDimitry Andric template <class _Traits>
834*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete;
835*0fca6ea1SDimitry Andric #  endif
836*0fca6ea1SDimitry Andric 
837*0fca6ea1SDimitry Andric template <class _Traits>
838*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char16_t) = delete;
839*0fca6ea1SDimitry Andric 
840*0fca6ea1SDimitry Andric template <class _Traits>
841*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char32_t) = delete;
842*0fca6ea1SDimitry Andric 
843*0fca6ea1SDimitry Andric template <class _Traits>
844*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete;
845*0fca6ea1SDimitry Andric 
846*0fca6ea1SDimitry Andric template <class _Traits>
847*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete;
848*0fca6ea1SDimitry Andric 
849*0fca6ea1SDimitry Andric #endif // _LIBCPP_STD_VER >= 20
850*0fca6ea1SDimitry Andric 
851*0fca6ea1SDimitry Andric extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>;
852*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
853*0fca6ea1SDimitry Andric extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>;
854*0fca6ea1SDimitry Andric #endif
855*0fca6ea1SDimitry Andric 
856*0fca6ea1SDimitry Andric _LIBCPP_END_NAMESPACE_STD
857*0fca6ea1SDimitry Andric 
858*0fca6ea1SDimitry Andric _LIBCPP_POP_MACROS
859*0fca6ea1SDimitry Andric 
860*0fca6ea1SDimitry Andric #endif // _LIBCPP___OSTREAM_BASIC_OSTREAM_H
861