117f00620SNikolas Klauser //===---------------------------------------------------------------------===// 217f00620SNikolas Klauser // 317f00620SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 417f00620SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 517f00620SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 617f00620SNikolas Klauser // 717f00620SNikolas Klauser //===---------------------------------------------------------------------===// 817f00620SNikolas Klauser 917f00620SNikolas Klauser #ifndef _LIBCPP___OSTREAM_BASIC_OSTREAM_H 1017f00620SNikolas Klauser #define _LIBCPP___OSTREAM_BASIC_OSTREAM_H 1117f00620SNikolas Klauser 1217f00620SNikolas Klauser #include <__config> 1387d56c59SLouis Dionne 14c6f3b7bcSNikolas Klauser #if _LIBCPP_HAS_LOCALIZATION 1587d56c59SLouis Dionne 1617f00620SNikolas Klauser # include <__exception/operations.h> 17ffc7380fSNikolas Klauser # include <__fwd/memory.h> 1817f00620SNikolas Klauser # include <__memory/unique_ptr.h> 1959890c13SNikolas Klauser # include <__new/exceptions.h> 20764834d6SNikolas Klauser # include <__ostream/put_character_sequence.h> 2117f00620SNikolas Klauser # include <__system_error/error_code.h> 2217f00620SNikolas Klauser # include <__type_traits/conjunction.h> 2317f00620SNikolas Klauser # include <__type_traits/enable_if.h> 2417f00620SNikolas Klauser # include <__type_traits/is_base_of.h> 2517f00620SNikolas Klauser # include <__type_traits/void_t.h> 2617f00620SNikolas Klauser # include <__utility/declval.h> 2717f00620SNikolas Klauser # include <bitset> 2817f00620SNikolas Klauser # include <ios> 2917f00620SNikolas Klauser # include <locale> 3017f00620SNikolas Klauser # include <streambuf> 3117f00620SNikolas Klauser # include <string_view> 3217f00620SNikolas Klauser 3317f00620SNikolas Klauser # if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 3417f00620SNikolas Klauser # pragma GCC system_header 3517f00620SNikolas Klauser # endif 3617f00620SNikolas Klauser 3717f00620SNikolas Klauser _LIBCPP_PUSH_MACROS 3817f00620SNikolas Klauser # include <__undef_macros> 3917f00620SNikolas Klauser 4017f00620SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 4117f00620SNikolas Klauser 4217f00620SNikolas Klauser template <class _CharT, class _Traits> 4317f00620SNikolas Klauser class _LIBCPP_TEMPLATE_VIS basic_ostream : virtual public basic_ios<_CharT, _Traits> { 4417f00620SNikolas Klauser public: 4517f00620SNikolas Klauser // types (inherited from basic_ios (27.5.4)): 4617f00620SNikolas Klauser typedef _CharT char_type; 4717f00620SNikolas Klauser typedef _Traits traits_type; 4817f00620SNikolas Klauser typedef typename traits_type::int_type int_type; 4917f00620SNikolas Klauser typedef typename traits_type::pos_type pos_type; 5017f00620SNikolas Klauser typedef typename traits_type::off_type off_type; 5117f00620SNikolas Klauser 5217f00620SNikolas Klauser // 27.7.2.2 Constructor/destructor: 5317f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb) { 5417f00620SNikolas Klauser this->init(__sb); 5517f00620SNikolas Klauser } 5617f00620SNikolas Klauser ~basic_ostream() override; 5717f00620SNikolas Klauser 58bbe4a806SNikolas Klauser basic_ostream(const basic_ostream& __rhs) = delete; 59bbe4a806SNikolas Klauser basic_ostream& operator=(const basic_ostream& __rhs) = delete; 60bbe4a806SNikolas Klauser 6117f00620SNikolas Klauser protected: 6217f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI basic_ostream(basic_ostream&& __rhs); 6317f00620SNikolas Klauser 6417f00620SNikolas Klauser // 27.7.2.3 Assign/swap 6517f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI basic_ostream& operator=(basic_ostream&& __rhs); 6617f00620SNikolas Klauser 6717f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_ostream& __rhs) { 6817f00620SNikolas Klauser basic_ios<char_type, traits_type>::swap(__rhs); 6917f00620SNikolas Klauser } 7017f00620SNikolas Klauser 7117f00620SNikolas Klauser public: 7217f00620SNikolas Klauser // 27.7.2.4 Prefix/suffix: 7317f00620SNikolas Klauser class _LIBCPP_TEMPLATE_VIS sentry; 7417f00620SNikolas Klauser 7517f00620SNikolas Klauser // 27.7.2.6 Formatted output: 7617f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)) { 7717f00620SNikolas Klauser return __pf(*this); 7817f00620SNikolas Klauser } 7917f00620SNikolas Klauser 8017f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& 8117f00620SNikolas Klauser operator<<(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) { 8217f00620SNikolas Klauser __pf(*this); 8317f00620SNikolas Klauser return *this; 8417f00620SNikolas Klauser } 8517f00620SNikolas Klauser 8617f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&)) { 8717f00620SNikolas Klauser __pf(*this); 8817f00620SNikolas Klauser return *this; 8917f00620SNikolas Klauser } 9017f00620SNikolas Klauser 91*914fd916SNikolas Klauser template <class _Tp> 92*914fd916SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream& __put_num(_Tp __value) { 93*914fd916SNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 94*914fd916SNikolas Klauser try { 95*914fd916SNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 96*914fd916SNikolas Klauser sentry __s(*this); 97*914fd916SNikolas Klauser if (__s) { 98*914fd916SNikolas Klauser using _Fp = num_put<char_type, ostreambuf_iterator<char_type, traits_type> >; 99*914fd916SNikolas Klauser const _Fp& __facet = std::use_facet<_Fp>(this->getloc()); 100*914fd916SNikolas Klauser if (__facet.put(*this, *this, this->fill(), __value).failed()) 101*914fd916SNikolas Klauser this->setstate(ios_base::badbit | ios_base::failbit); 102*914fd916SNikolas Klauser } 103*914fd916SNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 104*914fd916SNikolas Klauser } catch (...) { 105*914fd916SNikolas Klauser this->__set_badbit_and_consider_rethrow(); 106*914fd916SNikolas Klauser } 107*914fd916SNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 108*914fd916SNikolas Klauser return *this; 109*914fd916SNikolas Klauser } 110*914fd916SNikolas Klauser 111*914fd916SNikolas Klauser template <class _Tp> 112*914fd916SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream& __put_num_integer_promote(_Tp __value) { 113*914fd916SNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 114*914fd916SNikolas Klauser try { 115*914fd916SNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 116*914fd916SNikolas Klauser sentry __s(*this); 117*914fd916SNikolas Klauser if (__s) { 118*914fd916SNikolas Klauser ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; 119*914fd916SNikolas Klauser 120*914fd916SNikolas Klauser using _Fp = num_put<char_type, ostreambuf_iterator<char_type, traits_type> >; 121*914fd916SNikolas Klauser const _Fp& __facet = std::use_facet<_Fp>(this->getloc()); 122*914fd916SNikolas Klauser if (__facet 123*914fd916SNikolas Klauser .put(*this, 124*914fd916SNikolas Klauser *this, 125*914fd916SNikolas Klauser this->fill(), 126*914fd916SNikolas Klauser __flags == ios_base::oct || __flags == ios_base::hex 127*914fd916SNikolas Klauser ? static_cast<__copy_unsigned_t<_Tp, long> >(std::__to_unsigned_like(__value)) 128*914fd916SNikolas Klauser : static_cast<__copy_unsigned_t<_Tp, long> >(__value)) 129*914fd916SNikolas Klauser .failed()) 130*914fd916SNikolas Klauser this->setstate(ios_base::badbit | ios_base::failbit); 131*914fd916SNikolas Klauser } 132*914fd916SNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 133*914fd916SNikolas Klauser } catch (...) { 134*914fd916SNikolas Klauser this->__set_badbit_and_consider_rethrow(); 135*914fd916SNikolas Klauser } 136*914fd916SNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 137*914fd916SNikolas Klauser return *this; 138*914fd916SNikolas Klauser } 139*914fd916SNikolas Klauser 14017f00620SNikolas Klauser basic_ostream& operator<<(bool __n); 14117f00620SNikolas Klauser basic_ostream& operator<<(short __n); 14217f00620SNikolas Klauser basic_ostream& operator<<(unsigned short __n); 14317f00620SNikolas Klauser basic_ostream& operator<<(int __n); 14417f00620SNikolas Klauser basic_ostream& operator<<(unsigned int __n); 14517f00620SNikolas Klauser basic_ostream& operator<<(long __n); 14617f00620SNikolas Klauser basic_ostream& operator<<(unsigned long __n); 14717f00620SNikolas Klauser basic_ostream& operator<<(long long __n); 14817f00620SNikolas Klauser basic_ostream& operator<<(unsigned long long __n); 14917f00620SNikolas Klauser basic_ostream& operator<<(float __f); 15017f00620SNikolas Klauser basic_ostream& operator<<(double __f); 15117f00620SNikolas Klauser basic_ostream& operator<<(long double __f); 15217f00620SNikolas Klauser basic_ostream& operator<<(const void* __p); 15317f00620SNikolas Klauser 15417f00620SNikolas Klauser # if _LIBCPP_STD_VER >= 23 15517f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(const volatile void* __p) { 15617f00620SNikolas Klauser return operator<<(const_cast<const void*>(__p)); 15717f00620SNikolas Klauser } 15817f00620SNikolas Klauser # endif 15917f00620SNikolas Klauser 16017f00620SNikolas Klauser basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb); 16117f00620SNikolas Klauser 16217f00620SNikolas Klauser # if _LIBCPP_STD_VER >= 17 16317f00620SNikolas Klauser // LWG 2221 - nullptr. This is not backported to older standards modes. 16417f00620SNikolas Klauser // See https://reviews.llvm.org/D127033 for more info on the rationale. 16517f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(nullptr_t) { return *this << "nullptr"; } 16617f00620SNikolas Klauser # endif 16717f00620SNikolas Klauser 16817f00620SNikolas Klauser // 27.7.2.7 Unformatted output: 16917f00620SNikolas Klauser basic_ostream& put(char_type __c); 17017f00620SNikolas Klauser basic_ostream& write(const char_type* __s, streamsize __n); 17117f00620SNikolas Klauser basic_ostream& flush(); 17217f00620SNikolas Klauser 17317f00620SNikolas Klauser // 27.7.2.5 seeks: 17417f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 pos_type tellp(); 17517f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(pos_type __pos); 17617f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir); 17717f00620SNikolas Klauser 17817f00620SNikolas Klauser protected: 17917f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream() {} // extension, intentially does not initialize 18017f00620SNikolas Klauser }; 18117f00620SNikolas Klauser 18217f00620SNikolas Klauser template <class _CharT, class _Traits> 18317f00620SNikolas Klauser class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry { 18417f00620SNikolas Klauser bool __ok_; 18517f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& __os_; 18617f00620SNikolas Klauser 18717f00620SNikolas Klauser public: 18817f00620SNikolas Klauser explicit sentry(basic_ostream<_CharT, _Traits>& __os); 18917f00620SNikolas Klauser ~sentry(); 19017f00620SNikolas Klauser sentry(const sentry&) = delete; 19117f00620SNikolas Klauser sentry& operator=(const sentry&) = delete; 19217f00620SNikolas Klauser 19317f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; } 19417f00620SNikolas Klauser }; 19517f00620SNikolas Klauser 19617f00620SNikolas Klauser template <class _CharT, class _Traits> 19717f00620SNikolas Klauser basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) : __ok_(false), __os_(__os) { 19817f00620SNikolas Klauser if (__os.good()) { 19917f00620SNikolas Klauser if (__os.tie()) 20017f00620SNikolas Klauser __os.tie()->flush(); 20117f00620SNikolas Klauser __ok_ = true; 20217f00620SNikolas Klauser } 20317f00620SNikolas Klauser } 20417f00620SNikolas Klauser 20517f00620SNikolas Klauser template <class _CharT, class _Traits> 20617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>::sentry::~sentry() { 2074ea2c738SA. Jiang if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) && uncaught_exceptions() == 0) { 208ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 20917f00620SNikolas Klauser try { 210ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 21117f00620SNikolas Klauser if (__os_.rdbuf()->pubsync() == -1) 21217f00620SNikolas Klauser __os_.setstate(ios_base::badbit); 213ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 21417f00620SNikolas Klauser } catch (...) { 21517f00620SNikolas Klauser } 216ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 21717f00620SNikolas Klauser } 21817f00620SNikolas Klauser } 21917f00620SNikolas Klauser 22017f00620SNikolas Klauser template <class _CharT, class _Traits> 22117f00620SNikolas Klauser basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) { 22217f00620SNikolas Klauser this->move(__rhs); 22317f00620SNikolas Klauser } 22417f00620SNikolas Klauser 22517f00620SNikolas Klauser template <class _CharT, class _Traits> 22617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs) { 22717f00620SNikolas Klauser swap(__rhs); 22817f00620SNikolas Klauser return *this; 22917f00620SNikolas Klauser } 23017f00620SNikolas Klauser 23117f00620SNikolas Klauser template <class _CharT, class _Traits> 23217f00620SNikolas Klauser basic_ostream<_CharT, _Traits>::~basic_ostream() {} 23317f00620SNikolas Klauser 23417f00620SNikolas Klauser template <class _CharT, class _Traits> 23517f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& 23617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) { 237ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 23817f00620SNikolas Klauser try { 239ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 24017f00620SNikolas Klauser sentry __s(*this); 24117f00620SNikolas Klauser if (__s) { 24217f00620SNikolas Klauser if (__sb) { 243ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 24417f00620SNikolas Klauser try { 245ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 24617f00620SNikolas Klauser typedef istreambuf_iterator<_CharT, _Traits> _Ip; 24717f00620SNikolas Klauser typedef ostreambuf_iterator<_CharT, _Traits> _Op; 24817f00620SNikolas Klauser _Ip __i(__sb); 24917f00620SNikolas Klauser _Ip __eof; 25017f00620SNikolas Klauser _Op __o(*this); 25117f00620SNikolas Klauser size_t __c = 0; 25217f00620SNikolas Klauser for (; __i != __eof; ++__i, ++__o, ++__c) { 25317f00620SNikolas Klauser *__o = *__i; 25417f00620SNikolas Klauser if (__o.failed()) 25517f00620SNikolas Klauser break; 25617f00620SNikolas Klauser } 25717f00620SNikolas Klauser if (__c == 0) 25817f00620SNikolas Klauser this->setstate(ios_base::failbit); 259ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 26017f00620SNikolas Klauser } catch (...) { 26117f00620SNikolas Klauser this->__set_failbit_and_consider_rethrow(); 26217f00620SNikolas Klauser } 263ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 26417f00620SNikolas Klauser } else 26517f00620SNikolas Klauser this->setstate(ios_base::badbit); 26617f00620SNikolas Klauser } 267ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 26817f00620SNikolas Klauser } catch (...) { 26917f00620SNikolas Klauser this->__set_badbit_and_consider_rethrow(); 27017f00620SNikolas Klauser } 271ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 27217f00620SNikolas Klauser return *this; 27317f00620SNikolas Klauser } 27417f00620SNikolas Klauser 27517f00620SNikolas Klauser template <class _CharT, class _Traits> 27617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(bool __n) { 277*914fd916SNikolas Klauser return __put_num(__n); 27817f00620SNikolas Klauser } 27917f00620SNikolas Klauser 28017f00620SNikolas Klauser template <class _CharT, class _Traits> 28117f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(short __n) { 282*914fd916SNikolas Klauser return __put_num_integer_promote(__n); 28317f00620SNikolas Klauser } 28417f00620SNikolas Klauser 28517f00620SNikolas Klauser template <class _CharT, class _Traits> 28617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) { 287*914fd916SNikolas Klauser return __put_num_integer_promote(__n); 28817f00620SNikolas Klauser } 28917f00620SNikolas Klauser 29017f00620SNikolas Klauser template <class _CharT, class _Traits> 29117f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(int __n) { 292*914fd916SNikolas Klauser return __put_num_integer_promote(__n); 29317f00620SNikolas Klauser } 29417f00620SNikolas Klauser 29517f00620SNikolas Klauser template <class _CharT, class _Traits> 29617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) { 297*914fd916SNikolas Klauser return __put_num_integer_promote(__n); 29817f00620SNikolas Klauser } 29917f00620SNikolas Klauser 30017f00620SNikolas Klauser template <class _CharT, class _Traits> 30117f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long __n) { 302*914fd916SNikolas Klauser return __put_num(__n); 30317f00620SNikolas Klauser } 30417f00620SNikolas Klauser 30517f00620SNikolas Klauser template <class _CharT, class _Traits> 30617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) { 307*914fd916SNikolas Klauser return __put_num(__n); 30817f00620SNikolas Klauser } 30917f00620SNikolas Klauser 31017f00620SNikolas Klauser template <class _CharT, class _Traits> 31117f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long long __n) { 312*914fd916SNikolas Klauser return __put_num(__n); 31317f00620SNikolas Klauser } 31417f00620SNikolas Klauser 31517f00620SNikolas Klauser template <class _CharT, class _Traits> 31617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) { 317*914fd916SNikolas Klauser return __put_num(__n); 31817f00620SNikolas Klauser } 31917f00620SNikolas Klauser 32017f00620SNikolas Klauser template <class _CharT, class _Traits> 32117f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(float __n) { 322*914fd916SNikolas Klauser return *this << static_cast<double>(__n); 32317f00620SNikolas Klauser } 32417f00620SNikolas Klauser 32517f00620SNikolas Klauser template <class _CharT, class _Traits> 32617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(double __n) { 327*914fd916SNikolas Klauser return __put_num(__n); 32817f00620SNikolas Klauser } 32917f00620SNikolas Klauser 33017f00620SNikolas Klauser template <class _CharT, class _Traits> 33117f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long double __n) { 332*914fd916SNikolas Klauser return __put_num(__n); 33317f00620SNikolas Klauser } 33417f00620SNikolas Klauser 33517f00620SNikolas Klauser template <class _CharT, class _Traits> 33617f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(const void* __n) { 337*914fd916SNikolas Klauser return __put_num(__n); 33817f00620SNikolas Klauser } 33917f00620SNikolas Klauser 34017f00620SNikolas Klauser template <class _CharT, class _Traits> 34117f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) { 34217f00620SNikolas Klauser return std::__put_character_sequence(__os, &__c, 1); 34317f00620SNikolas Klauser } 34417f00620SNikolas Klauser 34517f00620SNikolas Klauser template <class _CharT, class _Traits> 34617f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) { 347ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 34817f00620SNikolas Klauser try { 349ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 35017f00620SNikolas Klauser typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 35117f00620SNikolas Klauser if (__s) { 35217f00620SNikolas Klauser _CharT __c = __os.widen(__cn); 35317f00620SNikolas Klauser typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 35417f00620SNikolas Klauser if (std::__pad_and_output( 35517f00620SNikolas Klauser _Ip(__os), 35617f00620SNikolas Klauser &__c, 35717f00620SNikolas Klauser (__os.flags() & ios_base::adjustfield) == ios_base::left ? &__c + 1 : &__c, 35817f00620SNikolas Klauser &__c + 1, 35917f00620SNikolas Klauser __os, 36017f00620SNikolas Klauser __os.fill()) 36117f00620SNikolas Klauser .failed()) 36217f00620SNikolas Klauser __os.setstate(ios_base::badbit | ios_base::failbit); 36317f00620SNikolas Klauser } 364ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 36517f00620SNikolas Klauser } catch (...) { 36617f00620SNikolas Klauser __os.__set_badbit_and_consider_rethrow(); 36717f00620SNikolas Klauser } 368ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 36917f00620SNikolas Klauser return __os; 37017f00620SNikolas Klauser } 37117f00620SNikolas Klauser 37217f00620SNikolas Klauser template <class _Traits> 37317f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, char __c) { 37417f00620SNikolas Klauser return std::__put_character_sequence(__os, &__c, 1); 37517f00620SNikolas Klauser } 37617f00620SNikolas Klauser 37717f00620SNikolas Klauser template <class _Traits> 37817f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, signed char __c) { 37917f00620SNikolas Klauser return std::__put_character_sequence(__os, (char*)&__c, 1); 38017f00620SNikolas Klauser } 38117f00620SNikolas Klauser 38217f00620SNikolas Klauser template <class _Traits> 38317f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) { 38417f00620SNikolas Klauser return std::__put_character_sequence(__os, (char*)&__c, 1); 38517f00620SNikolas Klauser } 38617f00620SNikolas Klauser 38717f00620SNikolas Klauser template <class _CharT, class _Traits> 38817f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 38917f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) { 39017f00620SNikolas Klauser return std::__put_character_sequence(__os, __str, _Traits::length(__str)); 39117f00620SNikolas Klauser } 39217f00620SNikolas Klauser 39317f00620SNikolas Klauser template <class _CharT, class _Traits> 39417f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 39517f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) { 396ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 39717f00620SNikolas Klauser try { 398ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 39917f00620SNikolas Klauser typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 40017f00620SNikolas Klauser if (__s) { 40117f00620SNikolas Klauser typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 40217f00620SNikolas Klauser size_t __len = char_traits<char>::length(__strn); 40317f00620SNikolas Klauser const int __bs = 100; 40417f00620SNikolas Klauser _CharT __wbb[__bs]; 40517f00620SNikolas Klauser _CharT* __wb = __wbb; 40617f00620SNikolas Klauser unique_ptr<_CharT, void (*)(void*)> __h(0, free); 40717f00620SNikolas Klauser if (__len > __bs) { 40817f00620SNikolas Klauser __wb = (_CharT*)malloc(__len * sizeof(_CharT)); 40917f00620SNikolas Klauser if (__wb == 0) 41017f00620SNikolas Klauser __throw_bad_alloc(); 41117f00620SNikolas Klauser __h.reset(__wb); 41217f00620SNikolas Klauser } 41317f00620SNikolas Klauser for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p) 41417f00620SNikolas Klauser *__p = __os.widen(*__strn); 41517f00620SNikolas Klauser if (std::__pad_and_output( 41617f00620SNikolas Klauser _Ip(__os), 41717f00620SNikolas Klauser __wb, 41817f00620SNikolas Klauser (__os.flags() & ios_base::adjustfield) == ios_base::left ? __wb + __len : __wb, 41917f00620SNikolas Klauser __wb + __len, 42017f00620SNikolas Klauser __os, 42117f00620SNikolas Klauser __os.fill()) 42217f00620SNikolas Klauser .failed()) 42317f00620SNikolas Klauser __os.setstate(ios_base::badbit | ios_base::failbit); 42417f00620SNikolas Klauser } 425ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 42617f00620SNikolas Klauser } catch (...) { 42717f00620SNikolas Klauser __os.__set_badbit_and_consider_rethrow(); 42817f00620SNikolas Klauser } 429ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 43017f00620SNikolas Klauser return __os; 43117f00620SNikolas Klauser } 43217f00620SNikolas Klauser 43317f00620SNikolas Klauser template <class _Traits> 43417f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, const char* __str) { 43517f00620SNikolas Klauser return std::__put_character_sequence(__os, __str, _Traits::length(__str)); 43617f00620SNikolas Klauser } 43717f00620SNikolas Klauser 43817f00620SNikolas Klauser template <class _Traits> 43917f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& 44017f00620SNikolas Klauser operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) { 44117f00620SNikolas Klauser const char* __s = (const char*)__str; 44217f00620SNikolas Klauser return std::__put_character_sequence(__os, __s, _Traits::length(__s)); 44317f00620SNikolas Klauser } 44417f00620SNikolas Klauser 44517f00620SNikolas Klauser template <class _Traits> 44617f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& 44717f00620SNikolas Klauser operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) { 44817f00620SNikolas Klauser const char* __s = (const char*)__str; 44917f00620SNikolas Klauser return std::__put_character_sequence(__os, __s, _Traits::length(__s)); 45017f00620SNikolas Klauser } 45117f00620SNikolas Klauser 45217f00620SNikolas Klauser template <class _CharT, class _Traits> 45317f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::put(char_type __c) { 454ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 45517f00620SNikolas Klauser try { 456ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 45717f00620SNikolas Klauser sentry __s(*this); 45817f00620SNikolas Klauser if (__s) { 45917f00620SNikolas Klauser typedef ostreambuf_iterator<_CharT, _Traits> _Op; 46017f00620SNikolas Klauser _Op __o(*this); 46117f00620SNikolas Klauser *__o = __c; 46217f00620SNikolas Klauser if (__o.failed()) 46317f00620SNikolas Klauser this->setstate(ios_base::badbit); 46417f00620SNikolas Klauser } 465ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 46617f00620SNikolas Klauser } catch (...) { 46717f00620SNikolas Klauser this->__set_badbit_and_consider_rethrow(); 46817f00620SNikolas Klauser } 469ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 47017f00620SNikolas Klauser return *this; 47117f00620SNikolas Klauser } 47217f00620SNikolas Klauser 47317f00620SNikolas Klauser template <class _CharT, class _Traits> 47417f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) { 475ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 47617f00620SNikolas Klauser try { 477ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 47817f00620SNikolas Klauser sentry __sen(*this); 47917f00620SNikolas Klauser if (__sen && __n) { 48017f00620SNikolas Klauser if (this->rdbuf()->sputn(__s, __n) != __n) 48117f00620SNikolas Klauser this->setstate(ios_base::badbit); 48217f00620SNikolas Klauser } 483ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 48417f00620SNikolas Klauser } catch (...) { 48517f00620SNikolas Klauser this->__set_badbit_and_consider_rethrow(); 48617f00620SNikolas Klauser } 487ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 48817f00620SNikolas Klauser return *this; 48917f00620SNikolas Klauser } 49017f00620SNikolas Klauser 49117f00620SNikolas Klauser template <class _CharT, class _Traits> 49217f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::flush() { 493ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 49417f00620SNikolas Klauser try { 495ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 49617f00620SNikolas Klauser if (this->rdbuf()) { 49717f00620SNikolas Klauser sentry __s(*this); 49817f00620SNikolas Klauser if (__s) { 49917f00620SNikolas Klauser if (this->rdbuf()->pubsync() == -1) 50017f00620SNikolas Klauser this->setstate(ios_base::badbit); 50117f00620SNikolas Klauser } 50217f00620SNikolas Klauser } 503ba87515fSNikolas Klauser # if _LIBCPP_HAS_EXCEPTIONS 50417f00620SNikolas Klauser } catch (...) { 50517f00620SNikolas Klauser this->__set_badbit_and_consider_rethrow(); 50617f00620SNikolas Klauser } 507ba87515fSNikolas Klauser # endif // _LIBCPP_HAS_EXCEPTIONS 50817f00620SNikolas Klauser return *this; 50917f00620SNikolas Klauser } 51017f00620SNikolas Klauser 51117f00620SNikolas Klauser template <class _CharT, class _Traits> 51217f00620SNikolas Klauser typename basic_ostream<_CharT, _Traits>::pos_type basic_ostream<_CharT, _Traits>::tellp() { 51317f00620SNikolas Klauser if (this->fail()) 51417f00620SNikolas Klauser return pos_type(-1); 51517f00620SNikolas Klauser return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); 51617f00620SNikolas Klauser } 51717f00620SNikolas Klauser 51817f00620SNikolas Klauser template <class _CharT, class _Traits> 51917f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) { 52017f00620SNikolas Klauser sentry __s(*this); 52117f00620SNikolas Klauser if (!this->fail()) { 52217f00620SNikolas Klauser if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1)) 52317f00620SNikolas Klauser this->setstate(ios_base::failbit); 52417f00620SNikolas Klauser } 52517f00620SNikolas Klauser return *this; 52617f00620SNikolas Klauser } 52717f00620SNikolas Klauser 52817f00620SNikolas Klauser template <class _CharT, class _Traits> 52917f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) { 53017f00620SNikolas Klauser sentry __s(*this); 53117f00620SNikolas Klauser if (!this->fail()) { 53217f00620SNikolas Klauser if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1)) 53317f00620SNikolas Klauser this->setstate(ios_base::failbit); 53417f00620SNikolas Klauser } 53517f00620SNikolas Klauser return *this; 53617f00620SNikolas Klauser } 53717f00620SNikolas Klauser 53817f00620SNikolas Klauser template <class _CharT, class _Traits> 53917f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os) { 54017f00620SNikolas Klauser __os.put(__os.widen('\n')); 54117f00620SNikolas Klauser __os.flush(); 54217f00620SNikolas Klauser return __os; 54317f00620SNikolas Klauser } 54417f00620SNikolas Klauser 54517f00620SNikolas Klauser template <class _CharT, class _Traits> 54617f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& ends(basic_ostream<_CharT, _Traits>& __os) { 54717f00620SNikolas Klauser __os.put(_CharT()); 54817f00620SNikolas Klauser return __os; 54917f00620SNikolas Klauser } 55017f00620SNikolas Klauser 55117f00620SNikolas Klauser template <class _CharT, class _Traits> 55217f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& flush(basic_ostream<_CharT, _Traits>& __os) { 55317f00620SNikolas Klauser __os.flush(); 55417f00620SNikolas Klauser return __os; 55517f00620SNikolas Klauser } 55617f00620SNikolas Klauser 55717f00620SNikolas Klauser template <class _Stream, class _Tp, class = void> 55817f00620SNikolas Klauser struct __is_ostreamable : false_type {}; 55917f00620SNikolas Klauser 56017f00620SNikolas Klauser template <class _Stream, class _Tp> 56117f00620SNikolas Klauser struct __is_ostreamable<_Stream, _Tp, decltype(std::declval<_Stream>() << std::declval<_Tp>(), void())> : true_type {}; 56217f00620SNikolas Klauser 56317f00620SNikolas Klauser template <class _Stream, 56417f00620SNikolas Klauser class _Tp, 56517f00620SNikolas Klauser __enable_if_t<_And<is_base_of<ios_base, _Stream>, __is_ostreamable<_Stream&, const _Tp&> >::value, int> = 0> 56617f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _Stream&& operator<<(_Stream&& __os, const _Tp& __x) { 56717f00620SNikolas Klauser __os << __x; 56817f00620SNikolas Klauser return std::move(__os); 56917f00620SNikolas Klauser } 57017f00620SNikolas Klauser 57117f00620SNikolas Klauser template <class _CharT, class _Traits, class _Allocator> 57217f00620SNikolas Klauser basic_ostream<_CharT, _Traits>& 57317f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, const basic_string<_CharT, _Traits, _Allocator>& __str) { 57417f00620SNikolas Klauser return std::__put_character_sequence(__os, __str.data(), __str.size()); 57517f00620SNikolas Klauser } 57617f00620SNikolas Klauser 57717f00620SNikolas Klauser template <class _CharT, class _Traits> 57817f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 57917f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, basic_string_view<_CharT, _Traits> __sv) { 58017f00620SNikolas Klauser return std::__put_character_sequence(__os, __sv.data(), __sv.size()); 58117f00620SNikolas Klauser } 58217f00620SNikolas Klauser 58317f00620SNikolas Klauser template <class _CharT, class _Traits> 58417f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 58517f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) { 58617f00620SNikolas Klauser return __os << __ec.category().name() << ':' << __ec.value(); 58717f00620SNikolas Klauser } 58817f00620SNikolas Klauser 58917f00620SNikolas Klauser template <class _CharT, class _Traits, class _Yp> 59017f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 59117f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) { 59217f00620SNikolas Klauser return __os << __p.get(); 59317f00620SNikolas Klauser } 59417f00620SNikolas Klauser 59517f00620SNikolas Klauser template < 59617f00620SNikolas Klauser class _CharT, 59717f00620SNikolas Klauser class _Traits, 59817f00620SNikolas Klauser class _Yp, 59917f00620SNikolas Klauser class _Dp, 60017f00620SNikolas Klauser __enable_if_t<is_same<void, 60117f00620SNikolas Klauser __void_t<decltype((std::declval<basic_ostream<_CharT, _Traits>&>() 60217f00620SNikolas Klauser << std::declval<typename unique_ptr<_Yp, _Dp>::pointer>()))> >::value, 60317f00620SNikolas Klauser int> = 0> 60417f00620SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 60517f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p) { 60617f00620SNikolas Klauser return __os << __p.get(); 60717f00620SNikolas Klauser } 60817f00620SNikolas Klauser 60917f00620SNikolas Klauser template <class _CharT, class _Traits, size_t _Size> 61017f00620SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 61117f00620SNikolas Klauser operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) { 61217f00620SNikolas Klauser return __os << __x.template to_string<_CharT, _Traits>(std::use_facet<ctype<_CharT> >(__os.getloc()).widen('0'), 61317f00620SNikolas Klauser std::use_facet<ctype<_CharT> >(__os.getloc()).widen('1')); 61417f00620SNikolas Klauser } 61517f00620SNikolas Klauser 61617f00620SNikolas Klauser # if _LIBCPP_STD_VER >= 20 61717f00620SNikolas Klauser 618c6f3b7bcSNikolas Klauser # if _LIBCPP_HAS_WIDE_CHARACTERS 61917f00620SNikolas Klauser template <class _Traits> 62017f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete; 62117f00620SNikolas Klauser 62217f00620SNikolas Klauser template <class _Traits> 62317f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete; 62417f00620SNikolas Klauser 62517f00620SNikolas Klauser template <class _Traits> 62617f00620SNikolas Klauser basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete; 62717f00620SNikolas Klauser 62817f00620SNikolas Klauser template <class _Traits> 62917f00620SNikolas Klauser basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete; 63017f00620SNikolas Klauser 63117f00620SNikolas Klauser template <class _Traits> 63217f00620SNikolas Klauser basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete; 63317f00620SNikolas Klauser 63417f00620SNikolas Klauser template <class _Traits> 63517f00620SNikolas Klauser basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete; 63617f00620SNikolas Klauser 637c6f3b7bcSNikolas Klauser # endif // _LIBCPP_HAS_WIDE_CHARACTERS 63817f00620SNikolas Klauser 639ba87515fSNikolas Klauser # if _LIBCPP_HAS_CHAR8_T 64017f00620SNikolas Klauser template <class _Traits> 64117f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char8_t) = delete; 64217f00620SNikolas Klauser 64317f00620SNikolas Klauser template <class _Traits> 64417f00620SNikolas Klauser basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete; 64517f00620SNikolas Klauser 64617f00620SNikolas Klauser template <class _Traits> 64717f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete; 64817f00620SNikolas Klauser 64917f00620SNikolas Klauser template <class _Traits> 65017f00620SNikolas Klauser basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete; 65117f00620SNikolas Klauser # endif 65217f00620SNikolas Klauser 65317f00620SNikolas Klauser template <class _Traits> 65417f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char16_t) = delete; 65517f00620SNikolas Klauser 65617f00620SNikolas Klauser template <class _Traits> 65717f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char32_t) = delete; 65817f00620SNikolas Klauser 65917f00620SNikolas Klauser template <class _Traits> 66017f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete; 66117f00620SNikolas Klauser 66217f00620SNikolas Klauser template <class _Traits> 66317f00620SNikolas Klauser basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete; 66417f00620SNikolas Klauser 66517f00620SNikolas Klauser # endif // _LIBCPP_STD_VER >= 20 66617f00620SNikolas Klauser 66717f00620SNikolas Klauser extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>; 668c6f3b7bcSNikolas Klauser # if _LIBCPP_HAS_WIDE_CHARACTERS 66917f00620SNikolas Klauser extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>; 67017f00620SNikolas Klauser # endif 67117f00620SNikolas Klauser 67217f00620SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 67317f00620SNikolas Klauser 67417f00620SNikolas Klauser _LIBCPP_POP_MACROS 67517f00620SNikolas Klauser 676c6f3b7bcSNikolas Klauser #endif // _LIBCPP_HAS_LOCALIZATION 67787d56c59SLouis Dionne 67817f00620SNikolas Klauser #endif // _LIBCPP___OSTREAM_BASIC_OSTREAM_H 679