xref: /freebsd/contrib/llvm-project/libcxx/include/ostream (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_OSTREAM
110b57cec5SDimitry Andric#define _LIBCPP_OSTREAM
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    ostream synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> >
170b57cec5SDimitry Andricclass basic_ostream
180b57cec5SDimitry Andric    : virtual public basic_ios<charT,traits>
190b57cec5SDimitry Andric{
200b57cec5SDimitry Andricpublic:
210b57cec5SDimitry Andric    // types (inherited from basic_ios (27.5.4)):
220b57cec5SDimitry Andric    typedef charT                          char_type;
230b57cec5SDimitry Andric    typedef traits                         traits_type;
240b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
250b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
260b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric    // 27.7.2.2 Constructor/destructor:
290b57cec5SDimitry Andric    explicit basic_ostream(basic_streambuf<char_type,traits>* sb);
300b57cec5SDimitry Andric    basic_ostream(basic_ostream&& rhs);
310b57cec5SDimitry Andric    virtual ~basic_ostream();
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric    // 27.7.2.3 Assign/swap
340b57cec5SDimitry Andric    basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14
350b57cec5SDimitry Andric    basic_ostream& operator=(basic_ostream&& rhs);
360b57cec5SDimitry Andric    void swap(basic_ostream& rhs);
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric    // 27.7.2.4 Prefix/suffix:
390b57cec5SDimitry Andric    class sentry;
400b57cec5SDimitry Andric
410b57cec5SDimitry Andric    // 27.7.2.6 Formatted output:
420b57cec5SDimitry Andric    basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&));
430b57cec5SDimitry Andric    basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&));
440b57cec5SDimitry Andric    basic_ostream& operator<<(ios_base& (*pf)(ios_base&));
450b57cec5SDimitry Andric    basic_ostream& operator<<(bool n);
460b57cec5SDimitry Andric    basic_ostream& operator<<(short n);
470b57cec5SDimitry Andric    basic_ostream& operator<<(unsigned short n);
480b57cec5SDimitry Andric    basic_ostream& operator<<(int n);
490b57cec5SDimitry Andric    basic_ostream& operator<<(unsigned int n);
500b57cec5SDimitry Andric    basic_ostream& operator<<(long n);
510b57cec5SDimitry Andric    basic_ostream& operator<<(unsigned long n);
520b57cec5SDimitry Andric    basic_ostream& operator<<(long long n);
530b57cec5SDimitry Andric    basic_ostream& operator<<(unsigned long long n);
540b57cec5SDimitry Andric    basic_ostream& operator<<(float f);
550b57cec5SDimitry Andric    basic_ostream& operator<<(double f);
560b57cec5SDimitry Andric    basic_ostream& operator<<(long double f);
570b57cec5SDimitry Andric    basic_ostream& operator<<(const void* p);
58349cc55cSDimitry Andric    basic_ostream& operator<<(const volatile void* val); // C++23
590b57cec5SDimitry Andric    basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb);
600b57cec5SDimitry Andric    basic_ostream& operator<<(nullptr_t);
610b57cec5SDimitry Andric
620b57cec5SDimitry Andric    // 27.7.2.7 Unformatted output:
630b57cec5SDimitry Andric    basic_ostream& put(char_type c);
640b57cec5SDimitry Andric    basic_ostream& write(const char_type* s, streamsize n);
650b57cec5SDimitry Andric    basic_ostream& flush();
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric    // 27.7.2.5 seeks:
680b57cec5SDimitry Andric    pos_type tellp();
690b57cec5SDimitry Andric    basic_ostream& seekp(pos_type);
700b57cec5SDimitry Andric    basic_ostream& seekp(off_type, ios_base::seekdir);
710b57cec5SDimitry Andricprotected:
720b57cec5SDimitry Andric    basic_ostream(const basic_ostream& rhs) = delete;
730b57cec5SDimitry Andric    basic_ostream(basic_ostream&& rhs);
740b57cec5SDimitry Andric    // 27.7.3.3 Assign/swap
750b57cec5SDimitry Andric    basic_ostream& operator=(basic_ostream& rhs) = delete;
760b57cec5SDimitry Andric    basic_ostream& operator=(const basic_ostream&& rhs);
770b57cec5SDimitry Andric    void swap(basic_ostream& rhs);
780b57cec5SDimitry Andric};
790b57cec5SDimitry Andric
800b57cec5SDimitry Andric// 27.7.2.6.4 character inserters
810b57cec5SDimitry Andric
820b57cec5SDimitry Andrictemplate<class charT, class traits>
830b57cec5SDimitry Andric  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT);
840b57cec5SDimitry Andric
850b57cec5SDimitry Andrictemplate<class charT, class traits>
860b57cec5SDimitry Andric  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char);
870b57cec5SDimitry Andric
880b57cec5SDimitry Andrictemplate<class traits>
890b57cec5SDimitry Andric  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char);
900b57cec5SDimitry Andric
910b57cec5SDimitry Andric// signed and unsigned
920b57cec5SDimitry Andric
930b57cec5SDimitry Andrictemplate<class traits>
940b57cec5SDimitry Andric  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char);
950b57cec5SDimitry Andric
960b57cec5SDimitry Andrictemplate<class traits>
970b57cec5SDimitry Andric  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char);
980b57cec5SDimitry Andric
990b57cec5SDimitry Andric// NTBS
1000b57cec5SDimitry Andrictemplate<class charT, class traits>
1010b57cec5SDimitry Andric  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andrictemplate<class charT, class traits>
1040b57cec5SDimitry Andric  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*);
1050b57cec5SDimitry Andric
1060b57cec5SDimitry Andrictemplate<class traits>
1070b57cec5SDimitry Andric  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*);
1080b57cec5SDimitry Andric
1090b57cec5SDimitry Andric// signed and unsigned
1100b57cec5SDimitry Andrictemplate<class traits>
1110b57cec5SDimitry Andricbasic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*);
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andrictemplate<class traits>
1140b57cec5SDimitry Andric  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*);
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric// swap:
1170b57cec5SDimitry Andrictemplate <class charT, class traits>
1180b57cec5SDimitry Andric  void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andrictemplate <class charT, class traits>
1210b57cec5SDimitry Andric  basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
1220b57cec5SDimitry Andric
1230b57cec5SDimitry Andrictemplate <class charT, class traits>
1240b57cec5SDimitry Andric  basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andrictemplate <class charT, class traits>
1270b57cec5SDimitry Andric  basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andric// rvalue stream insertion
130e8d8bef9SDimitry Andrictemplate <class Stream, class T>
131e8d8bef9SDimitry Andric  Stream&& operator<<(Stream&& os, const T& x);
1320b57cec5SDimitry Andric
133fcaf7f86SDimitry Andrictemplate<class traits>
134fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, wchar_t) = delete;               // since C++20
135fcaf7f86SDimitry Andrictemplate<class traits>
136fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char8_t) = delete;               // since C++20
137fcaf7f86SDimitry Andrictemplate<class traits>
138fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char16_t) = delete;              // since C++20
139fcaf7f86SDimitry Andrictemplate<class traits>
140fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char32_t) = delete;              // since C++20
141fcaf7f86SDimitry Andrictemplate<class traits>
142fcaf7f86SDimitry Andricbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, char8_t) = delete;         // since C++20
143fcaf7f86SDimitry Andrictemplate<class traits>
144fcaf7f86SDimitry Andricbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, char16_t) = delete;        // since C++20
145fcaf7f86SDimitry Andrictemplate<class traits>
146fcaf7f86SDimitry Andricbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, char32_t) = delete;        // since C++20
147fcaf7f86SDimitry Andrictemplate<class traits>
148fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const wchar_t*) = delete;        // since C++20
149fcaf7f86SDimitry Andrictemplate<class traits>
150fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char8_t*) = delete;        // since C++20
151fcaf7f86SDimitry Andrictemplate<class traits>
152fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char16_t*) = delete;       // since C++20
153fcaf7f86SDimitry Andrictemplate<class traits>
154fcaf7f86SDimitry Andricbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char32_t*) = delete;       // since C++20
155fcaf7f86SDimitry Andrictemplate<class traits>
156fcaf7f86SDimitry Andricbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, const char8_t*) = delete;  // since C++20
157fcaf7f86SDimitry Andrictemplate<class traits>
158fcaf7f86SDimitry Andricbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, const char16_t*) = delete; // since C++20
159fcaf7f86SDimitry Andrictemplate<class traits>
160fcaf7f86SDimitry Andricbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, const char32_t*) = delete; // since C++20
161fcaf7f86SDimitry Andric
162*cb14a3feSDimitry Andric// [ostream.formatted.print], print functions
163*cb14a3feSDimitry Andrictemplate<class... Args>                                                                                // since C++23
164*cb14a3feSDimitry Andric  void print(ostream& os, format_string<Args...> fmt, Args&&... args);
165*cb14a3feSDimitry Andrictemplate<class... Args>                                                                                // since C++23
166*cb14a3feSDimitry Andric  void println(ostream& os, format_string<Args...> fmt, Args&&... args);
167*cb14a3feSDimitry Andric
168*cb14a3feSDimitry Andricvoid vprint_unicode(ostream& os, string_view fmt, format_args args);                                   // since C++23
169*cb14a3feSDimitry Andricvoid vprint_nonunicode(ostream& os, string_view fmt, format_args args);                                // since C++23
1700b57cec5SDimitry Andric}  // std
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric*/
1730b57cec5SDimitry Andric
17481ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
175*cb14a3feSDimitry Andric#include <__availability>
1760b57cec5SDimitry Andric#include <__config>
17706c3fb27SDimitry Andric#include <__exception/operations.h>
178*cb14a3feSDimitry Andric#include <__format/format_args.h>
179*cb14a3feSDimitry Andric#include <__format/format_functions.h>
18006c3fb27SDimitry Andric#include <__fwd/ostream.h>
181bdd1243dSDimitry Andric#include <__memory/shared_ptr.h>
182bdd1243dSDimitry Andric#include <__memory/unique_ptr.h>
18306c3fb27SDimitry Andric#include <__system_error/error_code.h>
18406c3fb27SDimitry Andric#include <__type_traits/conjunction.h>
18506c3fb27SDimitry Andric#include <__type_traits/enable_if.h>
18606c3fb27SDimitry Andric#include <__type_traits/is_base_of.h>
18706c3fb27SDimitry Andric#include <__type_traits/void_t.h>
18806c3fb27SDimitry Andric#include <__utility/declval.h>
1890b57cec5SDimitry Andric#include <bitset>
190*cb14a3feSDimitry Andric#include <cstdio>
191fe6060f1SDimitry Andric#include <ios>
192fe6060f1SDimitry Andric#include <locale>
193bdd1243dSDimitry Andric#include <new>
194*cb14a3feSDimitry Andric#include <print>
195fe6060f1SDimitry Andric#include <streambuf>
196*cb14a3feSDimitry Andric#include <string_view>
1970b57cec5SDimitry Andric#include <version>
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2000b57cec5SDimitry Andric#  pragma GCC system_header
2010b57cec5SDimitry Andric#endif
2020b57cec5SDimitry Andric
2030b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
2040b57cec5SDimitry Andric
2050b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
206*cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_ostream : virtual public basic_ios<_CharT, _Traits> {
2070b57cec5SDimitry Andricpublic:
2080b57cec5SDimitry Andric  // types (inherited from basic_ios (27.5.4)):
2090b57cec5SDimitry Andric  typedef _CharT char_type;
2100b57cec5SDimitry Andric  typedef _Traits traits_type;
2110b57cec5SDimitry Andric  typedef typename traits_type::int_type int_type;
2120b57cec5SDimitry Andric  typedef typename traits_type::pos_type pos_type;
2130b57cec5SDimitry Andric  typedef typename traits_type::off_type off_type;
2140b57cec5SDimitry Andric
2150b57cec5SDimitry Andric  // 27.7.2.2 Constructor/destructor:
216*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb) {
217*cb14a3feSDimitry Andric    this->init(__sb);
218*cb14a3feSDimitry Andric  }
219bdd1243dSDimitry Andric  ~basic_ostream() override;
220*cb14a3feSDimitry Andric
2210b57cec5SDimitry Andricprotected:
222*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_ostream(basic_ostream&& __rhs);
2230b57cec5SDimitry Andric
2240b57cec5SDimitry Andric  // 27.7.2.3 Assign/swap
225*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI basic_ostream& operator=(basic_ostream&& __rhs);
226fe6060f1SDimitry Andric
227*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_ostream& __rhs) {
228*cb14a3feSDimitry Andric    basic_ios<char_type, traits_type>::swap(__rhs);
229*cb14a3feSDimitry Andric  }
2300b57cec5SDimitry Andric
2310b57cec5SDimitry Andric  basic_ostream(const basic_ostream& __rhs)            = delete;
2320b57cec5SDimitry Andric  basic_ostream& operator=(const basic_ostream& __rhs) = delete;
2330b57cec5SDimitry Andric
234fe6060f1SDimitry Andricpublic:
2350b57cec5SDimitry Andric  // 27.7.2.4 Prefix/suffix:
2360b57cec5SDimitry Andric  class _LIBCPP_TEMPLATE_VIS sentry;
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andric  // 27.7.2.6 Formatted output:
239*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)) {
240*cb14a3feSDimitry Andric    return __pf(*this);
241*cb14a3feSDimitry Andric  }
2420b57cec5SDimitry Andric
243*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream&
244*cb14a3feSDimitry Andric  operator<<(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) {
245*cb14a3feSDimitry Andric    __pf(*this);
246*cb14a3feSDimitry Andric    return *this;
247*cb14a3feSDimitry Andric  }
2480b57cec5SDimitry Andric
249*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&)) {
250*cb14a3feSDimitry Andric    __pf(*this);
251*cb14a3feSDimitry Andric    return *this;
252*cb14a3feSDimitry Andric  }
2530b57cec5SDimitry Andric
2540b57cec5SDimitry Andric  basic_ostream& operator<<(bool __n);
2550b57cec5SDimitry Andric  basic_ostream& operator<<(short __n);
2560b57cec5SDimitry Andric  basic_ostream& operator<<(unsigned short __n);
2570b57cec5SDimitry Andric  basic_ostream& operator<<(int __n);
2580b57cec5SDimitry Andric  basic_ostream& operator<<(unsigned int __n);
2590b57cec5SDimitry Andric  basic_ostream& operator<<(long __n);
2600b57cec5SDimitry Andric  basic_ostream& operator<<(unsigned long __n);
2610b57cec5SDimitry Andric  basic_ostream& operator<<(long long __n);
2620b57cec5SDimitry Andric  basic_ostream& operator<<(unsigned long long __n);
2630b57cec5SDimitry Andric  basic_ostream& operator<<(float __f);
2640b57cec5SDimitry Andric  basic_ostream& operator<<(double __f);
2650b57cec5SDimitry Andric  basic_ostream& operator<<(long double __f);
2660b57cec5SDimitry Andric  basic_ostream& operator<<(const void* __p);
267349cc55cSDimitry Andric
26806c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 23
269*cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(const volatile void* __p) {
270349cc55cSDimitry Andric    return operator<<(const_cast<const void*>(__p));
271349cc55cSDimitry Andric  }
272349cc55cSDimitry Andric#endif
273349cc55cSDimitry Andric
2740b57cec5SDimitry Andric  basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);
2750b57cec5SDimitry Andric
27606c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 17
277fcaf7f86SDimitry Andric  // LWG 2221 - nullptr. This is not backported to older standards modes.
278fcaf7f86SDimitry Andric  // See https://reviews.llvm.org/D127033 for more info on the rationale.
279*cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(nullptr_t) { return *this << "nullptr"; }
280fcaf7f86SDimitry Andric#endif
2810b57cec5SDimitry Andric
2820b57cec5SDimitry Andric  // 27.7.2.7 Unformatted output:
2830b57cec5SDimitry Andric  basic_ostream& put(char_type __c);
2840b57cec5SDimitry Andric  basic_ostream& write(const char_type* __s, streamsize __n);
2850b57cec5SDimitry Andric  basic_ostream& flush();
2860b57cec5SDimitry Andric
2870b57cec5SDimitry Andric  // 27.7.2.5 seeks:
288*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 pos_type tellp();
289*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(pos_type __pos);
290*cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
2910b57cec5SDimitry Andric
2920b57cec5SDimitry Andricprotected:
293*cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI basic_ostream() {} // extension, intentially does not initialize
2940b57cec5SDimitry Andric};
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
297*cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry {
2980b57cec5SDimitry Andric  bool __ok_;
2990b57cec5SDimitry Andric  basic_ostream<_CharT, _Traits>& __os_;
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andricpublic:
3020b57cec5SDimitry Andric  explicit sentry(basic_ostream<_CharT, _Traits>& __os);
3030b57cec5SDimitry Andric  ~sentry();
3040eae32dcSDimitry Andric  sentry(const sentry&)            = delete;
3050eae32dcSDimitry Andric  sentry& operator=(const sentry&) = delete;
3060b57cec5SDimitry Andric
307*cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; }
3080b57cec5SDimitry Andric};
3090b57cec5SDimitry Andric
3100b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
311*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) : __ok_(false), __os_(__os) {
312*cb14a3feSDimitry Andric  if (__os.good()) {
3130b57cec5SDimitry Andric    if (__os.tie())
3140b57cec5SDimitry Andric      __os.tie()->flush();
3150b57cec5SDimitry Andric    __ok_ = true;
3160b57cec5SDimitry Andric  }
3170b57cec5SDimitry Andric}
3180b57cec5SDimitry Andric
3190b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
320*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>::sentry::~sentry() {
321*cb14a3feSDimitry Andric  if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) && !uncaught_exception()) {
32206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
323*cb14a3feSDimitry Andric    try {
32406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3250b57cec5SDimitry Andric      if (__os_.rdbuf()->pubsync() == -1)
3260b57cec5SDimitry Andric        __os_.setstate(ios_base::badbit);
32706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
328*cb14a3feSDimitry Andric    } catch (...) {
3290b57cec5SDimitry Andric    }
33006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3310b57cec5SDimitry Andric  }
3320b57cec5SDimitry Andric}
3330b57cec5SDimitry Andric
3340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
335*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) {
3360b57cec5SDimitry Andric  this->move(__rhs);
3370b57cec5SDimitry Andric}
3380b57cec5SDimitry Andric
3390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
340*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs) {
3410b57cec5SDimitry Andric  swap(__rhs);
3420b57cec5SDimitry Andric  return *this;
3430b57cec5SDimitry Andric}
3440b57cec5SDimitry Andric
3450b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
346*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>::~basic_ostream() {}
3470b57cec5SDimitry Andric
3480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
3490b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>&
350*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) {
35106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
352*cb14a3feSDimitry Andric  try {
35306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3540b57cec5SDimitry Andric    sentry __s(*this);
355*cb14a3feSDimitry Andric    if (__s) {
356*cb14a3feSDimitry Andric      if (__sb) {
35706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
358*cb14a3feSDimitry Andric        try {
35906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3600b57cec5SDimitry Andric          typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3610b57cec5SDimitry Andric          typedef ostreambuf_iterator<_CharT, _Traits> _Op;
3620b57cec5SDimitry Andric          _Ip __i(__sb);
3630b57cec5SDimitry Andric          _Ip __eof;
3640b57cec5SDimitry Andric          _Op __o(*this);
3650b57cec5SDimitry Andric          size_t __c = 0;
366*cb14a3feSDimitry Andric          for (; __i != __eof; ++__i, ++__o, ++__c) {
3670b57cec5SDimitry Andric            *__o = *__i;
3680b57cec5SDimitry Andric            if (__o.failed())
3690b57cec5SDimitry Andric              break;
3700b57cec5SDimitry Andric          }
3710b57cec5SDimitry Andric          if (__c == 0)
3720b57cec5SDimitry Andric            this->setstate(ios_base::failbit);
37306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
374*cb14a3feSDimitry Andric        } catch (...) {
3750b57cec5SDimitry Andric          this->__set_failbit_and_consider_rethrow();
3760b57cec5SDimitry Andric        }
37706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
378*cb14a3feSDimitry Andric      } else
3790b57cec5SDimitry Andric        this->setstate(ios_base::badbit);
3800b57cec5SDimitry Andric    }
38106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
382*cb14a3feSDimitry Andric  } catch (...) {
3830b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
3840b57cec5SDimitry Andric  }
38506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3860b57cec5SDimitry Andric  return *this;
3870b57cec5SDimitry Andric}
3880b57cec5SDimitry Andric
3890b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
390*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(bool __n) {
39106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
392*cb14a3feSDimitry Andric  try {
39306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3940b57cec5SDimitry Andric    sentry __s(*this);
395*cb14a3feSDimitry Andric    if (__s) {
3960b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
397bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
3980b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
3990b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
4000b57cec5SDimitry Andric    }
40106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
402*cb14a3feSDimitry Andric  } catch (...) {
4030b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
4040b57cec5SDimitry Andric  }
40506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4060b57cec5SDimitry Andric  return *this;
4070b57cec5SDimitry Andric}
4080b57cec5SDimitry Andric
4090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
410*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(short __n) {
41106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
412*cb14a3feSDimitry Andric  try {
41306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4140b57cec5SDimitry Andric    sentry __s(*this);
415*cb14a3feSDimitry Andric    if (__s) {
4160b57cec5SDimitry Andric      ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
4170b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
418bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
419*cb14a3feSDimitry Andric      if (__f.put(*this,
420*cb14a3feSDimitry Andric                  *this,
421*cb14a3feSDimitry Andric                  this->fill(),
422*cb14a3feSDimitry Andric                  __flags == ios_base::oct || __flags == ios_base::hex
423*cb14a3feSDimitry Andric                      ? static_cast<long>(static_cast<unsigned short>(__n))
424*cb14a3feSDimitry Andric                      : static_cast<long>(__n))
425*cb14a3feSDimitry Andric              .failed())
4260b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
4270b57cec5SDimitry Andric    }
42806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
429*cb14a3feSDimitry Andric  } catch (...) {
4300b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
4310b57cec5SDimitry Andric  }
43206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4330b57cec5SDimitry Andric  return *this;
4340b57cec5SDimitry Andric}
4350b57cec5SDimitry Andric
4360b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
437*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) {
43806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
439*cb14a3feSDimitry Andric  try {
44006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4410b57cec5SDimitry Andric    sentry __s(*this);
442*cb14a3feSDimitry Andric    if (__s) {
4430b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
444bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
4450b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
4460b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
4470b57cec5SDimitry Andric    }
44806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
449*cb14a3feSDimitry Andric  } catch (...) {
4500b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
4510b57cec5SDimitry Andric  }
45206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4530b57cec5SDimitry Andric  return *this;
4540b57cec5SDimitry Andric}
4550b57cec5SDimitry Andric
4560b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
457*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(int __n) {
45806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
459*cb14a3feSDimitry Andric  try {
46006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4610b57cec5SDimitry Andric    sentry __s(*this);
462*cb14a3feSDimitry Andric    if (__s) {
4630b57cec5SDimitry Andric      ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
4640b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
465bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
466*cb14a3feSDimitry Andric      if (__f.put(*this,
467*cb14a3feSDimitry Andric                  *this,
468*cb14a3feSDimitry Andric                  this->fill(),
469*cb14a3feSDimitry Andric                  __flags == ios_base::oct || __flags == ios_base::hex
470*cb14a3feSDimitry Andric                      ? static_cast<long>(static_cast<unsigned int>(__n))
471*cb14a3feSDimitry Andric                      : static_cast<long>(__n))
472*cb14a3feSDimitry Andric              .failed())
4730b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
4740b57cec5SDimitry Andric    }
47506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
476*cb14a3feSDimitry Andric  } catch (...) {
4770b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
4780b57cec5SDimitry Andric  }
47906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4800b57cec5SDimitry Andric  return *this;
4810b57cec5SDimitry Andric}
4820b57cec5SDimitry Andric
4830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
484*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) {
48506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
486*cb14a3feSDimitry Andric  try {
48706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
4880b57cec5SDimitry Andric    sentry __s(*this);
489*cb14a3feSDimitry Andric    if (__s) {
4900b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
491bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
4920b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
4930b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
4940b57cec5SDimitry Andric    }
49506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
496*cb14a3feSDimitry Andric  } catch (...) {
4970b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
4980b57cec5SDimitry Andric  }
49906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5000b57cec5SDimitry Andric  return *this;
5010b57cec5SDimitry Andric}
5020b57cec5SDimitry Andric
5030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
504*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long __n) {
50506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
506*cb14a3feSDimitry Andric  try {
50706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5080b57cec5SDimitry Andric    sentry __s(*this);
509*cb14a3feSDimitry Andric    if (__s) {
5100b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
511bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
5120b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
5130b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
5140b57cec5SDimitry Andric    }
51506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
516*cb14a3feSDimitry Andric  } catch (...) {
5170b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
5180b57cec5SDimitry Andric  }
51906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5200b57cec5SDimitry Andric  return *this;
5210b57cec5SDimitry Andric}
5220b57cec5SDimitry Andric
5230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
524*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) {
52506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
526*cb14a3feSDimitry Andric  try {
52706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5280b57cec5SDimitry Andric    sentry __s(*this);
529*cb14a3feSDimitry Andric    if (__s) {
5300b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
531bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
5320b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
5330b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
5340b57cec5SDimitry Andric    }
53506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
536*cb14a3feSDimitry Andric  } catch (...) {
5370b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
5380b57cec5SDimitry Andric  }
53906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5400b57cec5SDimitry Andric  return *this;
5410b57cec5SDimitry Andric}
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
544*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long long __n) {
54506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
546*cb14a3feSDimitry Andric  try {
54706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5480b57cec5SDimitry Andric    sentry __s(*this);
549*cb14a3feSDimitry Andric    if (__s) {
5500b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
551bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
5520b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
5530b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
5540b57cec5SDimitry Andric    }
55506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
556*cb14a3feSDimitry Andric  } catch (...) {
5570b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
5580b57cec5SDimitry Andric  }
55906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5600b57cec5SDimitry Andric  return *this;
5610b57cec5SDimitry Andric}
5620b57cec5SDimitry Andric
5630b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
564*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) {
56506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
566*cb14a3feSDimitry Andric  try {
56706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5680b57cec5SDimitry Andric    sentry __s(*this);
569*cb14a3feSDimitry Andric    if (__s) {
5700b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
571bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
5720b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
5730b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
5740b57cec5SDimitry Andric    }
57506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
576*cb14a3feSDimitry Andric  } catch (...) {
5770b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
5780b57cec5SDimitry Andric  }
57906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5800b57cec5SDimitry Andric  return *this;
5810b57cec5SDimitry Andric}
5820b57cec5SDimitry Andric
5830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
584*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(float __n) {
58506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
586*cb14a3feSDimitry Andric  try {
58706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
5880b57cec5SDimitry Andric    sentry __s(*this);
589*cb14a3feSDimitry Andric    if (__s) {
5900b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
591bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
5920b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed())
5930b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
5940b57cec5SDimitry Andric    }
59506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
596*cb14a3feSDimitry Andric  } catch (...) {
5970b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
5980b57cec5SDimitry Andric  }
59906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6000b57cec5SDimitry Andric  return *this;
6010b57cec5SDimitry Andric}
6020b57cec5SDimitry Andric
6030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
604*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(double __n) {
60506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
606*cb14a3feSDimitry Andric  try {
60706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6080b57cec5SDimitry Andric    sentry __s(*this);
609*cb14a3feSDimitry Andric    if (__s) {
6100b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
611bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
6120b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
6130b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
6140b57cec5SDimitry Andric    }
61506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
616*cb14a3feSDimitry Andric  } catch (...) {
6170b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
6180b57cec5SDimitry Andric  }
61906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6200b57cec5SDimitry Andric  return *this;
6210b57cec5SDimitry Andric}
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
624*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long double __n) {
62506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
626*cb14a3feSDimitry Andric  try {
62706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6280b57cec5SDimitry Andric    sentry __s(*this);
629*cb14a3feSDimitry Andric    if (__s) {
6300b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
631bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
6320b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
6330b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
6340b57cec5SDimitry Andric    }
63506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
636*cb14a3feSDimitry Andric  } catch (...) {
6370b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
6380b57cec5SDimitry Andric  }
63906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6400b57cec5SDimitry Andric  return *this;
6410b57cec5SDimitry Andric}
6420b57cec5SDimitry Andric
6430b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
644*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(const void* __n) {
64506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
646*cb14a3feSDimitry Andric  try {
64706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6480b57cec5SDimitry Andric    sentry __s(*this);
649*cb14a3feSDimitry Andric    if (__s) {
6500b57cec5SDimitry Andric      typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
651bdd1243dSDimitry Andric      const _Fp& __f = std::use_facet<_Fp>(this->getloc());
6520b57cec5SDimitry Andric      if (__f.put(*this, *this, this->fill(), __n).failed())
6530b57cec5SDimitry Andric        this->setstate(ios_base::badbit | ios_base::failbit);
6540b57cec5SDimitry Andric    }
65506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
656*cb14a3feSDimitry Andric  } catch (...) {
6570b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
6580b57cec5SDimitry Andric  }
65906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6600b57cec5SDimitry Andric  return *this;
6610b57cec5SDimitry Andric}
6620b57cec5SDimitry Andric
6630b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
664bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
665*cb14a3feSDimitry Andric__put_character_sequence(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str, size_t __len) {
66606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
667*cb14a3feSDimitry Andric  try {
66806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6690b57cec5SDimitry Andric    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
670*cb14a3feSDimitry Andric    if (__s) {
6710b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
672*cb14a3feSDimitry Andric      if (std::__pad_and_output(
673*cb14a3feSDimitry Andric              _Ip(__os),
6740b57cec5SDimitry Andric              __str,
675*cb14a3feSDimitry Andric              (__os.flags() & ios_base::adjustfield) == ios_base::left ? __str + __len : __str,
6760b57cec5SDimitry Andric              __str + __len,
6770b57cec5SDimitry Andric              __os,
678*cb14a3feSDimitry Andric              __os.fill())
679*cb14a3feSDimitry Andric              .failed())
6800b57cec5SDimitry Andric        __os.setstate(ios_base::badbit | ios_base::failbit);
6810b57cec5SDimitry Andric    }
68206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
683*cb14a3feSDimitry Andric  } catch (...) {
6840b57cec5SDimitry Andric    __os.__set_badbit_and_consider_rethrow();
6850b57cec5SDimitry Andric  }
68606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
6870b57cec5SDimitry Andric  return __os;
6880b57cec5SDimitry Andric}
6890b57cec5SDimitry Andric
6900b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
691*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) {
6925f757f3fSDimitry Andric  return std::__put_character_sequence(__os, &__c, 1);
6930b57cec5SDimitry Andric}
6940b57cec5SDimitry Andric
6950b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
696*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) {
69706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
698*cb14a3feSDimitry Andric  try {
69906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
7000b57cec5SDimitry Andric    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
701*cb14a3feSDimitry Andric    if (__s) {
7020b57cec5SDimitry Andric      _CharT __c = __os.widen(__cn);
7030b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
704*cb14a3feSDimitry Andric      if (std::__pad_and_output(
705*cb14a3feSDimitry Andric              _Ip(__os),
7060b57cec5SDimitry Andric              &__c,
707*cb14a3feSDimitry Andric              (__os.flags() & ios_base::adjustfield) == ios_base::left ? &__c + 1 : &__c,
7080b57cec5SDimitry Andric              &__c + 1,
7090b57cec5SDimitry Andric              __os,
710*cb14a3feSDimitry Andric              __os.fill())
711*cb14a3feSDimitry Andric              .failed())
7120b57cec5SDimitry Andric        __os.setstate(ios_base::badbit | ios_base::failbit);
7130b57cec5SDimitry Andric    }
71406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
715*cb14a3feSDimitry Andric  } catch (...) {
7160b57cec5SDimitry Andric    __os.__set_badbit_and_consider_rethrow();
7170b57cec5SDimitry Andric  }
71806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
7190b57cec5SDimitry Andric  return __os;
7200b57cec5SDimitry Andric}
7210b57cec5SDimitry Andric
7220b57cec5SDimitry Andrictemplate <class _Traits>
723*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, char __c) {
7245f757f3fSDimitry Andric  return std::__put_character_sequence(__os, &__c, 1);
7250b57cec5SDimitry Andric}
7260b57cec5SDimitry Andric
7270b57cec5SDimitry Andrictemplate <class _Traits>
728*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, signed char __c) {
7295f757f3fSDimitry Andric  return std::__put_character_sequence(__os, (char*)&__c, 1);
7300b57cec5SDimitry Andric}
7310b57cec5SDimitry Andric
7320b57cec5SDimitry Andrictemplate <class _Traits>
733*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) {
7345f757f3fSDimitry Andric  return std::__put_character_sequence(__os, (char*)&__c, 1);
7350b57cec5SDimitry Andric}
7360b57cec5SDimitry Andric
7370b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
738bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
739*cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) {
7405f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __str, _Traits::length(__str));
7410b57cec5SDimitry Andric}
7420b57cec5SDimitry Andric
7430b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
744bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
745*cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) {
74606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
747*cb14a3feSDimitry Andric  try {
74806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
7490b57cec5SDimitry Andric    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
750*cb14a3feSDimitry Andric    if (__s) {
7510b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
7520b57cec5SDimitry Andric      size_t __len   = char_traits<char>::length(__strn);
7530b57cec5SDimitry Andric      const int __bs = 100;
7540b57cec5SDimitry Andric      _CharT __wbb[__bs];
7550b57cec5SDimitry Andric      _CharT* __wb = __wbb;
7560b57cec5SDimitry Andric      unique_ptr<_CharT, void (*)(void*)> __h(0, free);
757*cb14a3feSDimitry Andric      if (__len > __bs) {
7580b57cec5SDimitry Andric        __wb = (_CharT*)malloc(__len * sizeof(_CharT));
7590b57cec5SDimitry Andric        if (__wb == 0)
7600b57cec5SDimitry Andric          __throw_bad_alloc();
7610b57cec5SDimitry Andric        __h.reset(__wb);
7620b57cec5SDimitry Andric      }
7630b57cec5SDimitry Andric      for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p)
7640b57cec5SDimitry Andric        *__p = __os.widen(*__strn);
765*cb14a3feSDimitry Andric      if (std::__pad_and_output(
766*cb14a3feSDimitry Andric              _Ip(__os),
7670b57cec5SDimitry Andric              __wb,
768*cb14a3feSDimitry Andric              (__os.flags() & ios_base::adjustfield) == ios_base::left ? __wb + __len : __wb,
7690b57cec5SDimitry Andric              __wb + __len,
7700b57cec5SDimitry Andric              __os,
771*cb14a3feSDimitry Andric              __os.fill())
772*cb14a3feSDimitry Andric              .failed())
7730b57cec5SDimitry Andric        __os.setstate(ios_base::badbit | ios_base::failbit);
7740b57cec5SDimitry Andric    }
77506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
776*cb14a3feSDimitry Andric  } catch (...) {
7770b57cec5SDimitry Andric    __os.__set_badbit_and_consider_rethrow();
7780b57cec5SDimitry Andric  }
77906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
7800b57cec5SDimitry Andric  return __os;
7810b57cec5SDimitry Andric}
7820b57cec5SDimitry Andric
7830b57cec5SDimitry Andrictemplate <class _Traits>
784*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, const char* __str) {
7855f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __str, _Traits::length(__str));
7860b57cec5SDimitry Andric}
7870b57cec5SDimitry Andric
7880b57cec5SDimitry Andrictemplate <class _Traits>
789bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>&
790*cb14a3feSDimitry Andricoperator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) {
7910b57cec5SDimitry Andric  const char* __s = (const char*)__str;
7925f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __s, _Traits::length(__s));
7930b57cec5SDimitry Andric}
7940b57cec5SDimitry Andric
7950b57cec5SDimitry Andrictemplate <class _Traits>
796bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>&
797*cb14a3feSDimitry Andricoperator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) {
7980b57cec5SDimitry Andric  const char* __s = (const char*)__str;
7995f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __s, _Traits::length(__s));
8000b57cec5SDimitry Andric}
8010b57cec5SDimitry Andric
8020b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
803*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::put(char_type __c) {
80406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
805*cb14a3feSDimitry Andric  try {
80606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8070b57cec5SDimitry Andric    sentry __s(*this);
808*cb14a3feSDimitry Andric    if (__s) {
8090b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
8100b57cec5SDimitry Andric      _Op __o(*this);
8110b57cec5SDimitry Andric      *__o = __c;
8120b57cec5SDimitry Andric      if (__o.failed())
8130b57cec5SDimitry Andric        this->setstate(ios_base::badbit);
8140b57cec5SDimitry Andric    }
81506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
816*cb14a3feSDimitry Andric  } catch (...) {
8170b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
8180b57cec5SDimitry Andric  }
81906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8200b57cec5SDimitry Andric  return *this;
8210b57cec5SDimitry Andric}
8220b57cec5SDimitry Andric
8230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
824*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) {
82506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
826*cb14a3feSDimitry Andric  try {
82706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8280b57cec5SDimitry Andric    sentry __sen(*this);
829*cb14a3feSDimitry Andric    if (__sen && __n) {
8300b57cec5SDimitry Andric      if (this->rdbuf()->sputn(__s, __n) != __n)
8310b57cec5SDimitry Andric        this->setstate(ios_base::badbit);
8320b57cec5SDimitry Andric    }
83306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
834*cb14a3feSDimitry Andric  } catch (...) {
8350b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
8360b57cec5SDimitry Andric  }
83706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8380b57cec5SDimitry Andric  return *this;
8390b57cec5SDimitry Andric}
8400b57cec5SDimitry Andric
8410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
842*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::flush() {
84306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
844*cb14a3feSDimitry Andric  try {
84506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
846*cb14a3feSDimitry Andric    if (this->rdbuf()) {
8470b57cec5SDimitry Andric      sentry __s(*this);
848*cb14a3feSDimitry Andric      if (__s) {
8490b57cec5SDimitry Andric        if (this->rdbuf()->pubsync() == -1)
8500b57cec5SDimitry Andric          this->setstate(ios_base::badbit);
8510b57cec5SDimitry Andric      }
8520b57cec5SDimitry Andric    }
85306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
854*cb14a3feSDimitry Andric  } catch (...) {
8550b57cec5SDimitry Andric    this->__set_badbit_and_consider_rethrow();
8560b57cec5SDimitry Andric  }
85706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
8580b57cec5SDimitry Andric  return *this;
8590b57cec5SDimitry Andric}
8600b57cec5SDimitry Andric
8610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
862*cb14a3feSDimitry Andrictypename basic_ostream<_CharT, _Traits>::pos_type basic_ostream<_CharT, _Traits>::tellp() {
8630b57cec5SDimitry Andric  if (this->fail())
8640b57cec5SDimitry Andric    return pos_type(-1);
8650b57cec5SDimitry Andric  return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
8660b57cec5SDimitry Andric}
8670b57cec5SDimitry Andric
8680b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
869*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) {
8700b57cec5SDimitry Andric  sentry __s(*this);
871*cb14a3feSDimitry Andric  if (!this->fail()) {
8720b57cec5SDimitry Andric    if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
8730b57cec5SDimitry Andric      this->setstate(ios_base::failbit);
8740b57cec5SDimitry Andric  }
8750b57cec5SDimitry Andric  return *this;
8760b57cec5SDimitry Andric}
8770b57cec5SDimitry Andric
8780b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
879*cb14a3feSDimitry Andricbasic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) {
8800b57cec5SDimitry Andric  sentry __s(*this);
881*cb14a3feSDimitry Andric  if (!this->fail()) {
8820b57cec5SDimitry Andric    if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
8830b57cec5SDimitry Andric      this->setstate(ios_base::failbit);
8840b57cec5SDimitry Andric  }
8850b57cec5SDimitry Andric  return *this;
8860b57cec5SDimitry Andric}
8870b57cec5SDimitry Andric
8880b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
889*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os) {
8900b57cec5SDimitry Andric  __os.put(__os.widen('\n'));
8910b57cec5SDimitry Andric  __os.flush();
8920b57cec5SDimitry Andric  return __os;
8930b57cec5SDimitry Andric}
8940b57cec5SDimitry Andric
8950b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
896*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& ends(basic_ostream<_CharT, _Traits>& __os) {
8970b57cec5SDimitry Andric  __os.put(_CharT());
8980b57cec5SDimitry Andric  return __os;
8990b57cec5SDimitry Andric}
9000b57cec5SDimitry Andric
9010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
902*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& flush(basic_ostream<_CharT, _Traits>& __os) {
9030b57cec5SDimitry Andric  __os.flush();
9040b57cec5SDimitry Andric  return __os;
9050b57cec5SDimitry Andric}
9060b57cec5SDimitry Andric
907e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = void>
908e8d8bef9SDimitry Andricstruct __is_ostreamable : false_type {};
909e8d8bef9SDimitry Andric
9100b57cec5SDimitry Andrictemplate <class _Stream, class _Tp>
911*cb14a3feSDimitry Andricstruct __is_ostreamable<_Stream, _Tp, decltype(std::declval<_Stream>() << std::declval<_Tp>(), void())> : true_type {};
912e8d8bef9SDimitry Andric
9135f757f3fSDimitry Andrictemplate <class _Stream,
9145f757f3fSDimitry Andric          class _Tp,
9155f757f3fSDimitry Andric          __enable_if_t<_And<is_base_of<ios_base, _Stream>, __is_ostreamable<_Stream&, const _Tp&> >::value, int> = 0>
916*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI _Stream&& operator<<(_Stream&& __os, const _Tp& __x) {
9170b57cec5SDimitry Andric  __os << __x;
9185f757f3fSDimitry Andric  return std::move(__os);
9190b57cec5SDimitry Andric}
9200b57cec5SDimitry Andric
9210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
9220b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>&
923*cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const basic_string<_CharT, _Traits, _Allocator>& __str) {
9245f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __str.data(), __str.size());
9250b57cec5SDimitry Andric}
9260b57cec5SDimitry Andric
9270b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
928bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
929*cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, basic_string_view<_CharT, _Traits> __sv) {
9305f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __sv.data(), __sv.size());
9310b57cec5SDimitry Andric}
9320b57cec5SDimitry Andric
9330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
934*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
935*cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) {
9360b57cec5SDimitry Andric  return __os << __ec.category().name() << ':' << __ec.value();
9370b57cec5SDimitry Andric}
9380b57cec5SDimitry Andric
9390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Yp>
940*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
941*cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) {
9420b57cec5SDimitry Andric  return __os << __p.get();
9430b57cec5SDimitry Andric}
9440b57cec5SDimitry Andric
9455f757f3fSDimitry Andrictemplate <
9465f757f3fSDimitry Andric    class _CharT,
9475f757f3fSDimitry Andric    class _Traits,
9485f757f3fSDimitry Andric    class _Yp,
9495f757f3fSDimitry Andric    class _Dp,
9505f757f3fSDimitry Andric    __enable_if_t<is_same<void,
9515f757f3fSDimitry Andric                          __void_t<decltype((std::declval<basic_ostream<_CharT, _Traits>&>()
9525f757f3fSDimitry Andric                                             << std::declval<typename unique_ptr<_Yp, _Dp>::pointer>()))> >::value,
9535f757f3fSDimitry Andric                  int> = 0>
9545f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
9555f757f3fSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p) {
9560b57cec5SDimitry Andric  return __os << __p.get();
9570b57cec5SDimitry Andric}
9580b57cec5SDimitry Andric
9590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Size>
960bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
961*cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) {
962*cb14a3feSDimitry Andric  return __os << __x.template to_string<_CharT, _Traits>(std::use_facet<ctype<_CharT> >(__os.getloc()).widen('0'),
963bdd1243dSDimitry Andric                                                         std::use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
9640b57cec5SDimitry Andric}
9650b57cec5SDimitry Andric
96606c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20
967fcaf7f86SDimitry Andric
968fcaf7f86SDimitry Andric#  ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
969fcaf7f86SDimitry Andrictemplate <class _Traits>
970fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete;
971fcaf7f86SDimitry Andric
972fcaf7f86SDimitry Andrictemplate <class _Traits>
973fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete;
974fcaf7f86SDimitry Andric
975fcaf7f86SDimitry Andrictemplate <class _Traits>
976fcaf7f86SDimitry Andricbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete;
977fcaf7f86SDimitry Andric
978fcaf7f86SDimitry Andrictemplate <class _Traits>
979fcaf7f86SDimitry Andricbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete;
980fcaf7f86SDimitry Andric
981fcaf7f86SDimitry Andrictemplate <class _Traits>
982fcaf7f86SDimitry Andricbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete;
983fcaf7f86SDimitry Andric
984fcaf7f86SDimitry Andrictemplate <class _Traits>
985fcaf7f86SDimitry Andricbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete;
986fcaf7f86SDimitry Andric
987fcaf7f86SDimitry Andric#  endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
988fcaf7f86SDimitry Andric
989fcaf7f86SDimitry Andric#  ifndef _LIBCPP_HAS_NO_CHAR8_T
990fcaf7f86SDimitry Andrictemplate <class _Traits>
991fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char8_t) = delete;
992fcaf7f86SDimitry Andric
993fcaf7f86SDimitry Andrictemplate <class _Traits>
994fcaf7f86SDimitry Andricbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete;
995fcaf7f86SDimitry Andric
996fcaf7f86SDimitry Andrictemplate <class _Traits>
997fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete;
998fcaf7f86SDimitry Andric
999fcaf7f86SDimitry Andrictemplate <class _Traits>
1000fcaf7f86SDimitry Andricbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete;
1001fcaf7f86SDimitry Andric#  endif
1002fcaf7f86SDimitry Andric
1003fcaf7f86SDimitry Andrictemplate <class _Traits>
1004fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char16_t) = delete;
1005fcaf7f86SDimitry Andric
1006fcaf7f86SDimitry Andrictemplate <class _Traits>
1007fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char32_t) = delete;
1008fcaf7f86SDimitry Andric
1009fcaf7f86SDimitry Andrictemplate <class _Traits>
1010fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete;
1011fcaf7f86SDimitry Andric
1012fcaf7f86SDimitry Andrictemplate <class _Traits>
1013fcaf7f86SDimitry Andricbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete;
1014fcaf7f86SDimitry Andric
101506c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 20
1016fcaf7f86SDimitry Andric
101781ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>;
1018349cc55cSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
101981ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>;
1020349cc55cSDimitry Andric#endif
10210b57cec5SDimitry Andric
1022*cb14a3feSDimitry Andric#if _LIBCPP_STD_VER >= 23
1023*cb14a3feSDimitry Andric
1024*cb14a3feSDimitry Andrictemplate <class = void> // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563).
1025*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI inline void
1026*cb14a3feSDimitry Andric__vprint_nonunicode(ostream& __os, string_view __fmt, format_args __args, bool __write_nl) {
1027*cb14a3feSDimitry Andric  // [ostream.formatted.print]/3
1028*cb14a3feSDimitry Andric  // Effects: Behaves as a formatted output function
1029*cb14a3feSDimitry Andric  // ([ostream.formatted.reqmts]) of os, except that:
1030*cb14a3feSDimitry Andric  // - failure to generate output is reported as specified below, and
1031*cb14a3feSDimitry Andric  // - any exception thrown by the call to vformat is propagated without regard
1032*cb14a3feSDimitry Andric  //   to the value of os.exceptions() and without turning on ios_base::badbit
1033*cb14a3feSDimitry Andric  //   in the error state of os.
1034*cb14a3feSDimitry Andric  // After constructing a sentry object, the function initializes an automatic
1035*cb14a3feSDimitry Andric  // variable via
1036*cb14a3feSDimitry Andric  //   string out = vformat(os.getloc(), fmt, args);
1037*cb14a3feSDimitry Andric
1038*cb14a3feSDimitry Andric  ostream::sentry __s(__os);
1039*cb14a3feSDimitry Andric  if (__s) {
1040*cb14a3feSDimitry Andric    string __o = std::vformat(__os.getloc(), __fmt, __args);
1041*cb14a3feSDimitry Andric    if (__write_nl)
1042*cb14a3feSDimitry Andric      __o += '\n';
1043*cb14a3feSDimitry Andric
1044*cb14a3feSDimitry Andric    const char* __str = __o.data();
1045*cb14a3feSDimitry Andric    size_t __len      = __o.size();
1046*cb14a3feSDimitry Andric
1047*cb14a3feSDimitry Andric#  ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1048*cb14a3feSDimitry Andric    try {
1049*cb14a3feSDimitry Andric#  endif // _LIBCPP_HAS_NO_EXCEPTIONS
1050*cb14a3feSDimitry Andric      typedef ostreambuf_iterator<char> _Ip;
1051*cb14a3feSDimitry Andric      if (std::__pad_and_output(
1052*cb14a3feSDimitry Andric              _Ip(__os),
1053*cb14a3feSDimitry Andric              __str,
1054*cb14a3feSDimitry Andric              (__os.flags() & ios_base::adjustfield) == ios_base::left ? __str + __len : __str,
1055*cb14a3feSDimitry Andric              __str + __len,
1056*cb14a3feSDimitry Andric              __os,
1057*cb14a3feSDimitry Andric              __os.fill())
1058*cb14a3feSDimitry Andric              .failed())
1059*cb14a3feSDimitry Andric        __os.setstate(ios_base::badbit | ios_base::failbit);
1060*cb14a3feSDimitry Andric
1061*cb14a3feSDimitry Andric#  ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1062*cb14a3feSDimitry Andric    } catch (...) {
1063*cb14a3feSDimitry Andric      __os.__set_badbit_and_consider_rethrow();
1064*cb14a3feSDimitry Andric    }
1065*cb14a3feSDimitry Andric#  endif // _LIBCPP_HAS_NO_EXCEPTIONS
1066*cb14a3feSDimitry Andric  }
1067*cb14a3feSDimitry Andric}
1068*cb14a3feSDimitry Andric
1069*cb14a3feSDimitry Andrictemplate <class = void> // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563).
1070*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI inline void vprint_nonunicode(ostream& __os, string_view __fmt, format_args __args) {
1071*cb14a3feSDimitry Andric  std::__vprint_nonunicode(__os, __fmt, __args, false);
1072*cb14a3feSDimitry Andric}
1073*cb14a3feSDimitry Andric
1074*cb14a3feSDimitry Andric// Returns the FILE* associated with the __os.
1075*cb14a3feSDimitry Andric// Returns a nullptr when no FILE* is associated with __os.
1076*cb14a3feSDimitry Andric// This function is in the dylib since the type of the buffer associated
1077*cb14a3feSDimitry Andric// with std::cout, std::cerr, and std::clog is only known in the dylib.
1078*cb14a3feSDimitry Andric//
1079*cb14a3feSDimitry Andric// This function implements part of the implementation-defined behavior
1080*cb14a3feSDimitry Andric// of [ostream.formatted.print]/3
1081*cb14a3feSDimitry Andric//   If the function is vprint_unicode and os is a stream that refers to
1082*cb14a3feSDimitry Andric//   a terminal capable of displaying Unicode which is determined in an
1083*cb14a3feSDimitry Andric//   implementation-defined manner, writes out to the terminal using the
1084*cb14a3feSDimitry Andric//   native Unicode API;
1085*cb14a3feSDimitry Andric// Whether the returned FILE* is "a terminal capable of displaying Unicode"
1086*cb14a3feSDimitry Andric// is determined in the same way as the print(FILE*, ...) overloads.
1087*cb14a3feSDimitry Andric_LIBCPP_AVAILABILITY_PRINT _LIBCPP_EXPORTED_FROM_ABI FILE* __get_ostream_file(ostream& __os);
1088*cb14a3feSDimitry Andric
1089*cb14a3feSDimitry Andric#  ifndef _LIBCPP_HAS_NO_UNICODE
1090*cb14a3feSDimitry Andrictemplate <class = void> // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563).
1091*cb14a3feSDimitry Andric_LIBCPP_AVAILABILITY_PRINT _LIBCPP_HIDE_FROM_ABI void
1092*cb14a3feSDimitry Andric__vprint_unicode(ostream& __os, string_view __fmt, format_args __args, bool __write_nl) {
1093*cb14a3feSDimitry Andric  FILE* __file = std::__get_ostream_file(__os);
1094*cb14a3feSDimitry Andric  if (!__file || !__print::__is_terminal(__file))
1095*cb14a3feSDimitry Andric    return std::__vprint_nonunicode(__os, __fmt, __args, __write_nl);
1096*cb14a3feSDimitry Andric
1097*cb14a3feSDimitry Andric  // [ostream.formatted.print]/3
1098*cb14a3feSDimitry Andric  //    If the function is vprint_unicode and os is a stream that refers to a
1099*cb14a3feSDimitry Andric  //    terminal capable of displaying Unicode which is determined in an
1100*cb14a3feSDimitry Andric  //    implementation-defined manner, writes out to the terminal using the
1101*cb14a3feSDimitry Andric  //    native Unicode API; if out contains invalid code units, the behavior is
1102*cb14a3feSDimitry Andric  //    undefined and implementations are encouraged to diagnose it. If the
1103*cb14a3feSDimitry Andric  //    native Unicode API is used, the function flushes os before writing out.
1104*cb14a3feSDimitry Andric  //
1105*cb14a3feSDimitry Andric  // This is the path for the native API, start with flushing.
1106*cb14a3feSDimitry Andric  __os.flush();
1107*cb14a3feSDimitry Andric
1108*cb14a3feSDimitry Andric#    ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1109*cb14a3feSDimitry Andric  try {
1110*cb14a3feSDimitry Andric#    endif // _LIBCPP_HAS_NO_EXCEPTIONS
1111*cb14a3feSDimitry Andric    ostream::sentry __s(__os);
1112*cb14a3feSDimitry Andric    if (__s) {
1113*cb14a3feSDimitry Andric#    ifndef _LIBCPP_WIN32API
1114*cb14a3feSDimitry Andric      __print::__vprint_unicode_posix(__file, __fmt, __args, __write_nl, true);
1115*cb14a3feSDimitry Andric#    elif !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
1116*cb14a3feSDimitry Andric    __print::__vprint_unicode_windows(__file, __fmt, __args, __write_nl, true);
1117*cb14a3feSDimitry Andric#    else
1118*cb14a3feSDimitry Andric#      error "Windows builds with wchar_t disabled are not supported."
1119*cb14a3feSDimitry Andric#    endif
1120*cb14a3feSDimitry Andric    }
1121*cb14a3feSDimitry Andric
1122*cb14a3feSDimitry Andric#    ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1123*cb14a3feSDimitry Andric  } catch (...) {
1124*cb14a3feSDimitry Andric    __os.__set_badbit_and_consider_rethrow();
1125*cb14a3feSDimitry Andric  }
1126*cb14a3feSDimitry Andric#    endif // _LIBCPP_HAS_NO_EXCEPTIONS
1127*cb14a3feSDimitry Andric}
1128*cb14a3feSDimitry Andric
1129*cb14a3feSDimitry Andrictemplate <class = void> // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563).
1130*cb14a3feSDimitry Andric_LIBCPP_AVAILABILITY_PRINT _LIBCPP_HIDE_FROM_ABI inline void
1131*cb14a3feSDimitry Andricvprint_unicode(ostream& __os, string_view __fmt, format_args __args) {
1132*cb14a3feSDimitry Andric  std::__vprint_unicode(__os, __fmt, __args, false);
1133*cb14a3feSDimitry Andric}
1134*cb14a3feSDimitry Andric#  endif // _LIBCPP_HAS_NO_UNICODE
1135*cb14a3feSDimitry Andric
1136*cb14a3feSDimitry Andrictemplate <class... _Args>
1137*cb14a3feSDimitry Andric_LIBCPP_AVAILABILITY_PRINT _LIBCPP_HIDE_FROM_ABI void
1138*cb14a3feSDimitry Andricprint(ostream& __os, format_string<_Args...> __fmt, _Args&&... __args) {
1139*cb14a3feSDimitry Andric#  ifndef _LIBCPP_HAS_NO_UNICODE
1140*cb14a3feSDimitry Andric  if constexpr (__print::__use_unicode)
1141*cb14a3feSDimitry Andric    std::__vprint_unicode(__os, __fmt.get(), std::make_format_args(__args...), false);
1142*cb14a3feSDimitry Andric  else
1143*cb14a3feSDimitry Andric    std::__vprint_nonunicode(__os, __fmt.get(), std::make_format_args(__args...), false);
1144*cb14a3feSDimitry Andric#  else  // _LIBCPP_HAS_NO_UNICODE
1145*cb14a3feSDimitry Andric  std::__vprint_nonunicode(__os, __fmt.get(), std::make_format_args(__args...), false);
1146*cb14a3feSDimitry Andric#  endif // _LIBCPP_HAS_NO_UNICODE
1147*cb14a3feSDimitry Andric}
1148*cb14a3feSDimitry Andric
1149*cb14a3feSDimitry Andrictemplate <class... _Args>
1150*cb14a3feSDimitry Andric_LIBCPP_AVAILABILITY_PRINT _LIBCPP_HIDE_FROM_ABI void
1151*cb14a3feSDimitry Andricprintln(ostream& __os, format_string<_Args...> __fmt, _Args&&... __args) {
1152*cb14a3feSDimitry Andric#  ifndef _LIBCPP_HAS_NO_UNICODE
1153*cb14a3feSDimitry Andric  // Note the wording in the Standard is inefficient. The output of
1154*cb14a3feSDimitry Andric  // std::format is a std::string which is then copied. This solution
1155*cb14a3feSDimitry Andric  // just appends a newline at the end of the output.
1156*cb14a3feSDimitry Andric  if constexpr (__print::__use_unicode)
1157*cb14a3feSDimitry Andric    std::__vprint_unicode(__os, __fmt.get(), std::make_format_args(__args...), true);
1158*cb14a3feSDimitry Andric  else
1159*cb14a3feSDimitry Andric    std::__vprint_nonunicode(__os, __fmt.get(), std::make_format_args(__args...), true);
1160*cb14a3feSDimitry Andric#  else  // _LIBCPP_HAS_NO_UNICODE
1161*cb14a3feSDimitry Andric  std::__vprint_nonunicode(__os, __fmt.get(), std::make_format_args(__args...), true);
1162*cb14a3feSDimitry Andric#  endif // _LIBCPP_HAS_NO_UNICODE
1163*cb14a3feSDimitry Andric}
1164*cb14a3feSDimitry Andric
1165*cb14a3feSDimitry Andric#endif // _LIBCPP_STD_VER >= 23
1166*cb14a3feSDimitry Andric
11670b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
11680b57cec5SDimitry Andric
1169bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
117006c3fb27SDimitry Andric#  include <atomic>
1171bdd1243dSDimitry Andric#  include <concepts>
117206c3fb27SDimitry Andric#  include <cstdlib>
11735f757f3fSDimitry Andric#  include <iosfwd>
1174bdd1243dSDimitry Andric#  include <iterator>
11755f757f3fSDimitry Andric#  include <stdexcept>
1176bdd1243dSDimitry Andric#  include <type_traits>
1177bdd1243dSDimitry Andric#endif
1178bdd1243dSDimitry Andric
11790b57cec5SDimitry Andric#endif // _LIBCPP_OSTREAM
1180