xref: /llvm-project/libcxx/include/__ostream/basic_ostream.h (revision 914fd916d5456e15cf9baaf617edaac6b7334d09)
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