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