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