13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_OSTREAM
113e519524SHoward Hinnant#define _LIBCPP_OSTREAM
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    ostream synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
173e519524SHoward Hinnantclass basic_ostream
183e519524SHoward Hinnant    : virtual public basic_ios<charT,traits>
193e519524SHoward Hinnant{
203e519524SHoward Hinnantpublic:
213e519524SHoward Hinnant    // types (inherited from basic_ios (27.5.4)):
223e519524SHoward Hinnant    typedef charT                          char_type;
233e519524SHoward Hinnant    typedef traits                         traits_type;
243e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
253e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
263e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
273e519524SHoward Hinnant
283e519524SHoward Hinnant    // 27.7.2.2 Constructor/destructor:
293e519524SHoward Hinnant    explicit basic_ostream(basic_streambuf<char_type,traits>* sb);
303e519524SHoward Hinnant    basic_ostream(basic_ostream&& rhs);
313e519524SHoward Hinnant    virtual ~basic_ostream();
323e519524SHoward Hinnant
333e519524SHoward Hinnant    // 27.7.2.3 Assign/swap
34ede1aa2dSMarshall Clow    basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14
353e519524SHoward Hinnant    basic_ostream& operator=(basic_ostream&& rhs);
363e519524SHoward Hinnant    void swap(basic_ostream& rhs);
373e519524SHoward Hinnant
383e519524SHoward Hinnant    // 27.7.2.4 Prefix/suffix:
393e519524SHoward Hinnant    class sentry;
403e519524SHoward Hinnant
413e519524SHoward Hinnant    // 27.7.2.6 Formatted output:
423e519524SHoward Hinnant    basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&));
433e519524SHoward Hinnant    basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&));
443e519524SHoward Hinnant    basic_ostream& operator<<(ios_base& (*pf)(ios_base&));
453e519524SHoward Hinnant    basic_ostream& operator<<(bool n);
463e519524SHoward Hinnant    basic_ostream& operator<<(short n);
473e519524SHoward Hinnant    basic_ostream& operator<<(unsigned short n);
483e519524SHoward Hinnant    basic_ostream& operator<<(int n);
493e519524SHoward Hinnant    basic_ostream& operator<<(unsigned int n);
503e519524SHoward Hinnant    basic_ostream& operator<<(long n);
513e519524SHoward Hinnant    basic_ostream& operator<<(unsigned long n);
523e519524SHoward Hinnant    basic_ostream& operator<<(long long n);
533e519524SHoward Hinnant    basic_ostream& operator<<(unsigned long long n);
543e519524SHoward Hinnant    basic_ostream& operator<<(float f);
553e519524SHoward Hinnant    basic_ostream& operator<<(double f);
563e519524SHoward Hinnant    basic_ostream& operator<<(long double f);
573e519524SHoward Hinnant    basic_ostream& operator<<(const void* p);
58f0d5a60fSNikolas Klauser    basic_ostream& operator<<(const volatile void* val); // C++23
593e519524SHoward Hinnant    basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb);
603c125fe8SMarshall Clow    basic_ostream& operator<<(nullptr_t);
613e519524SHoward Hinnant
623e519524SHoward Hinnant    // 27.7.2.7 Unformatted output:
633e519524SHoward Hinnant    basic_ostream& put(char_type c);
643e519524SHoward Hinnant    basic_ostream& write(const char_type* s, streamsize n);
653e519524SHoward Hinnant    basic_ostream& flush();
663e519524SHoward Hinnant
673e519524SHoward Hinnant    // 27.7.2.5 seeks:
683e519524SHoward Hinnant    pos_type tellp();
693e519524SHoward Hinnant    basic_ostream& seekp(pos_type);
703e519524SHoward Hinnant    basic_ostream& seekp(off_type, ios_base::seekdir);
71f45b237cSMarshall Clowprotected:
72f45b237cSMarshall Clow    basic_ostream(const basic_ostream& rhs) = delete;
73f45b237cSMarshall Clow    basic_ostream(basic_ostream&& rhs);
74f45b237cSMarshall Clow    // 27.7.3.3 Assign/swap
75f45b237cSMarshall Clow    basic_ostream& operator=(basic_ostream& rhs) = delete;
76f45b237cSMarshall Clow    basic_ostream& operator=(const basic_ostream&& rhs);
77f45b237cSMarshall Clow    void swap(basic_ostream& rhs);
783e519524SHoward Hinnant};
793e519524SHoward Hinnant
803e519524SHoward Hinnant// 27.7.2.6.4 character inserters
813e519524SHoward Hinnant
823e519524SHoward Hinnanttemplate<class charT, class traits>
833e519524SHoward Hinnant  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT);
843e519524SHoward Hinnant
853e519524SHoward Hinnanttemplate<class charT, class traits>
863e519524SHoward Hinnant  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char);
873e519524SHoward Hinnant
883e519524SHoward Hinnanttemplate<class traits>
893e519524SHoward Hinnant  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char);
903e519524SHoward Hinnant
913e519524SHoward Hinnant// signed and unsigned
923e519524SHoward Hinnant
933e519524SHoward Hinnanttemplate<class traits>
943e519524SHoward Hinnant  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char);
953e519524SHoward Hinnant
963e519524SHoward Hinnanttemplate<class traits>
973e519524SHoward Hinnant  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char);
983e519524SHoward Hinnant
993e519524SHoward Hinnant// NTBS
1003e519524SHoward Hinnanttemplate<class charT, class traits>
1013e519524SHoward Hinnant  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
1023e519524SHoward Hinnant
1033e519524SHoward Hinnanttemplate<class charT, class traits>
1043e519524SHoward Hinnant  basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*);
1053e519524SHoward Hinnant
1063e519524SHoward Hinnanttemplate<class traits>
1073e519524SHoward Hinnant  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*);
1083e519524SHoward Hinnant
1093e519524SHoward Hinnant// signed and unsigned
1103e519524SHoward Hinnanttemplate<class traits>
1113e519524SHoward Hinnantbasic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*);
1123e519524SHoward Hinnant
1133e519524SHoward Hinnanttemplate<class traits>
1143e519524SHoward Hinnant  basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*);
1153e519524SHoward Hinnant
1163e519524SHoward Hinnant// swap:
1173e519524SHoward Hinnanttemplate <class charT, class traits>
1183e519524SHoward Hinnant  void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);
1193e519524SHoward Hinnant
1203e519524SHoward Hinnanttemplate <class charT, class traits>
1213e519524SHoward Hinnant  basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
1223e519524SHoward Hinnant
1233e519524SHoward Hinnanttemplate <class charT, class traits>
1243e519524SHoward Hinnant  basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
1253e519524SHoward Hinnant
1263e519524SHoward Hinnanttemplate <class charT, class traits>
1273e519524SHoward Hinnant  basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
1283e519524SHoward Hinnant
1293e519524SHoward Hinnant// rvalue stream insertion
130c90dee1eSLouis Dionnetemplate <class Stream, class T>
131c90dee1eSLouis Dionne  Stream&& operator<<(Stream&& os, const T& x);
1323e519524SHoward Hinnant
133*309aed30SNikolas Klausertemplate<class traits>
134*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, wchar_t) = delete;               // since C++20
135*309aed30SNikolas Klausertemplate<class traits>
136*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char8_t) = delete;               // since C++20
137*309aed30SNikolas Klausertemplate<class traits>
138*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char16_t) = delete;              // since C++20
139*309aed30SNikolas Klausertemplate<class traits>
140*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char32_t) = delete;              // since C++20
141*309aed30SNikolas Klausertemplate<class traits>
142*309aed30SNikolas Klauserbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, char8_t) = delete;         // since C++20
143*309aed30SNikolas Klausertemplate<class traits>
144*309aed30SNikolas Klauserbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, char16_t) = delete;        // since C++20
145*309aed30SNikolas Klausertemplate<class traits>
146*309aed30SNikolas Klauserbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, char32_t) = delete;        // since C++20
147*309aed30SNikolas Klausertemplate<class traits>
148*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const wchar_t*) = delete;        // since C++20
149*309aed30SNikolas Klausertemplate<class traits>
150*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char8_t*) = delete;        // since C++20
151*309aed30SNikolas Klausertemplate<class traits>
152*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char16_t*) = delete;       // since C++20
153*309aed30SNikolas Klausertemplate<class traits>
154*309aed30SNikolas Klauserbasic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char32_t*) = delete;       // since C++20
155*309aed30SNikolas Klausertemplate<class traits>
156*309aed30SNikolas Klauserbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, const char8_t*) = delete;  // since C++20
157*309aed30SNikolas Klausertemplate<class traits>
158*309aed30SNikolas Klauserbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, const char16_t*) = delete; // since C++20
159*309aed30SNikolas Klausertemplate<class traits>
160*309aed30SNikolas Klauserbasic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, const char32_t*) = delete; // since C++20
161*309aed30SNikolas Klauser
1623e519524SHoward Hinnant}  // std
1633e519524SHoward Hinnant
1643e519524SHoward Hinnant*/
1653e519524SHoward Hinnant
166385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1673e519524SHoward Hinnant#include <__config>
1683e519524SHoward Hinnant#include <bitset>
169bfbd73f8SArthur O'Dwyer#include <ios>
170bfbd73f8SArthur O'Dwyer#include <locale>
171bfbd73f8SArthur O'Dwyer#include <streambuf>
1727dad0bd6SMarshall Clow#include <version>
1733e519524SHoward Hinnant
174de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
175de4a57cbSLouis Dionne#  include <iterator>
176de4a57cbSLouis Dionne#endif
177de4a57cbSLouis Dionne
178073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1793e519524SHoward Hinnant#  pragma GCC system_header
180073458b1SHoward Hinnant#endif
1813e519524SHoward Hinnant
1823e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1833e519524SHoward Hinnant
1843e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
185e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_ostream
1863e519524SHoward Hinnant    : virtual public basic_ios<_CharT, _Traits>
1873e519524SHoward Hinnant{
1883e519524SHoward Hinnantpublic:
1893e519524SHoward Hinnant    // types (inherited from basic_ios (27.5.4)):
1903e519524SHoward Hinnant    typedef _CharT                         char_type;
1913e519524SHoward Hinnant    typedef _Traits                        traits_type;
1923e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1933e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1943e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1953e519524SHoward Hinnant
1963e519524SHoward Hinnant    // 27.7.2.2 Constructor/destructor:
1977833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
198f8f31c49SEric Fiselier    explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb)
199f8f31c49SEric Fiselier    { this->init(__sb); }
2003e519524SHoward Hinnant    virtual ~basic_ostream();
2013e519524SHoward Hinnantprotected:
202f8f31c49SEric Fiselier    inline _LIBCPP_INLINE_VISIBILITY
2033e519524SHoward Hinnant    basic_ostream(basic_ostream&& __rhs);
2043e519524SHoward Hinnant
2053e519524SHoward Hinnant    // 27.7.2.3 Assign/swap
206f8f31c49SEric Fiselier    inline _LIBCPP_INLINE_VISIBILITY
2073e519524SHoward Hinnant    basic_ostream& operator=(basic_ostream&& __rhs);
208a8d1182fSArthur O'Dwyer
2097833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
210f8f31c49SEric Fiselier    void swap(basic_ostream& __rhs)
211f8f31c49SEric Fiselier    { basic_ios<char_type, traits_type>::swap(__rhs); }
212f45b237cSMarshall Clow
21330d0c1abSMarshall Clow    basic_ostream           (const basic_ostream& __rhs) = delete;
21430d0c1abSMarshall Clow    basic_ostream& operator=(const basic_ostream& __rhs) = delete;
2153e519524SHoward Hinnant
216a8d1182fSArthur O'Dwyerpublic:
2173e519524SHoward Hinnant    // 27.7.2.4 Prefix/suffix:
218e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS sentry;
2193e519524SHoward Hinnant
2203e519524SHoward Hinnant    // 27.7.2.6 Formatted output:
2217833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
222f8f31c49SEric Fiselier    basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&))
223f8f31c49SEric Fiselier    { return __pf(*this); }
224f8f31c49SEric Fiselier
2257833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2263e519524SHoward Hinnant    basic_ostream& operator<<(basic_ios<char_type, traits_type>&
227f8f31c49SEric Fiselier                              (*__pf)(basic_ios<char_type,traits_type>&))
228f8f31c49SEric Fiselier    { __pf(*this); return *this; }
229f8f31c49SEric Fiselier
2307833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
231f8f31c49SEric Fiselier    basic_ostream& operator<<(ios_base& (*__pf)(ios_base&))
232f8f31c49SEric Fiselier    { __pf(*this); return *this; }
233f8f31c49SEric Fiselier
2343e519524SHoward Hinnant    basic_ostream& operator<<(bool __n);
2353e519524SHoward Hinnant    basic_ostream& operator<<(short __n);
2363e519524SHoward Hinnant    basic_ostream& operator<<(unsigned short __n);
2373e519524SHoward Hinnant    basic_ostream& operator<<(int __n);
2383e519524SHoward Hinnant    basic_ostream& operator<<(unsigned int __n);
2393e519524SHoward Hinnant    basic_ostream& operator<<(long __n);
2403e519524SHoward Hinnant    basic_ostream& operator<<(unsigned long __n);
2413e519524SHoward Hinnant    basic_ostream& operator<<(long long __n);
2423e519524SHoward Hinnant    basic_ostream& operator<<(unsigned long long __n);
2433e519524SHoward Hinnant    basic_ostream& operator<<(float __f);
2443e519524SHoward Hinnant    basic_ostream& operator<<(double __f);
2453e519524SHoward Hinnant    basic_ostream& operator<<(long double __f);
2463e519524SHoward Hinnant    basic_ostream& operator<<(const void* __p);
247f0d5a60fSNikolas Klauser
248f0d5a60fSNikolas Klauser#if _LIBCPP_STD_VER > 20
249f0d5a60fSNikolas Klauser    _LIBCPP_HIDE_FROM_ABI
250f0d5a60fSNikolas Klauser    basic_ostream& operator<<(const volatile void* __p) {
251f0d5a60fSNikolas Klauser        return operator<<(const_cast<const void*>(__p));
252f0d5a60fSNikolas Klauser    }
253f0d5a60fSNikolas Klauser#endif
254f0d5a60fSNikolas Klauser
2553e519524SHoward Hinnant    basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);
2563e519524SHoward Hinnant
25750cfb76eSJoe Loser#if _LIBCPP_STD_VER > 14
25850cfb76eSJoe Loser// LWG 2221 - nullptr. This is not backported to older standards modes.
25950cfb76eSJoe Loser// See https://reviews.llvm.org/D127033 for more info on the rationale.
2603c125fe8SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
2613c125fe8SMarshall Clow    basic_ostream& operator<<(nullptr_t)
2623c125fe8SMarshall Clow    { return *this << "nullptr"; }
26350cfb76eSJoe Loser#endif
2643c125fe8SMarshall Clow
2653e519524SHoward Hinnant    // 27.7.2.7 Unformatted output:
2663e519524SHoward Hinnant    basic_ostream& put(char_type __c);
2673e519524SHoward Hinnant    basic_ostream& write(const char_type* __s, streamsize __n);
2683e519524SHoward Hinnant    basic_ostream& flush();
2693e519524SHoward Hinnant
2703e519524SHoward Hinnant    // 27.7.2.5 seeks:
2717833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2723e519524SHoward Hinnant    pos_type tellp();
2737833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2743e519524SHoward Hinnant    basic_ostream& seekp(pos_type __pos);
2757833b88aSLouis Dionne    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
2763e519524SHoward Hinnant    basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
2773e519524SHoward Hinnant
2783e519524SHoward Hinnantprotected:
279dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY
2803e519524SHoward Hinnant    basic_ostream() {}  // extension, intentially does not initialize
2813e519524SHoward Hinnant};
2823e519524SHoward Hinnant
2833e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
284e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry
2853e519524SHoward Hinnant{
2863e519524SHoward Hinnant    bool __ok_;
2873e519524SHoward Hinnant    basic_ostream<_CharT, _Traits>& __os_;
2883e519524SHoward Hinnant
2893e519524SHoward Hinnantpublic:
2903e519524SHoward Hinnant    explicit sentry(basic_ostream<_CharT, _Traits>& __os);
2913e519524SHoward Hinnant    ~sentry();
292feb80aa9SNikolas Klauser    sentry(const sentry&) = delete;
293feb80aa9SNikolas Klauser    sentry& operator=(const sentry&) = delete;
2943e519524SHoward Hinnant
295dc7200b4SLouis Dionne    _LIBCPP_INLINE_VISIBILITY
296317e92a3SArthur O'Dwyer    explicit operator bool() const {return __ok_;}
2973e519524SHoward Hinnant};
2983e519524SHoward Hinnant
2993e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3003e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os)
3013e519524SHoward Hinnant    : __ok_(false),
3023e519524SHoward Hinnant      __os_(__os)
3033e519524SHoward Hinnant{
3043e519524SHoward Hinnant    if (__os.good())
3053e519524SHoward Hinnant    {
3063e519524SHoward Hinnant        if (__os.tie())
3073e519524SHoward Hinnant            __os.tie()->flush();
3083e519524SHoward Hinnant        __ok_ = true;
3093e519524SHoward Hinnant    }
3103e519524SHoward Hinnant}
3113e519524SHoward Hinnant
3123e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3133e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::sentry::~sentry()
3143e519524SHoward Hinnant{
3153e519524SHoward Hinnant    if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf)
3163e519524SHoward Hinnant                      && !uncaught_exception())
3173e519524SHoward Hinnant    {
3183e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3193e519524SHoward Hinnant        try
3203e519524SHoward Hinnant        {
321b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
3223e519524SHoward Hinnant            if (__os_.rdbuf()->pubsync() == -1)
3233e519524SHoward Hinnant                __os_.setstate(ios_base::badbit);
3243e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3253e519524SHoward Hinnant        }
3263e519524SHoward Hinnant        catch (...)
3273e519524SHoward Hinnant        {
3283e519524SHoward Hinnant        }
329b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
3303e519524SHoward Hinnant    }
3313e519524SHoward Hinnant}
3323e519524SHoward Hinnant
3333e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3343e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs)
3353e519524SHoward Hinnant{
3363e519524SHoward Hinnant    this->move(__rhs);
3373e519524SHoward Hinnant}
3383e519524SHoward Hinnant
3393e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3403e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
3413e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs)
3423e519524SHoward Hinnant{
3433e519524SHoward Hinnant    swap(__rhs);
3443e519524SHoward Hinnant    return *this;
3453e519524SHoward Hinnant}
3463e519524SHoward Hinnant
3473e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3483e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::~basic_ostream()
3493e519524SHoward Hinnant{
3503e519524SHoward Hinnant}
3513e519524SHoward Hinnant
3523e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3533e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
3543e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb)
3553e519524SHoward Hinnant{
3563e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3573e519524SHoward Hinnant    try
3583e519524SHoward Hinnant    {
359b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
3603e519524SHoward Hinnant        sentry __s(*this);
3613e519524SHoward Hinnant        if (__s)
3623e519524SHoward Hinnant        {
3633e519524SHoward Hinnant            if (__sb)
3643e519524SHoward Hinnant            {
3653e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3663e519524SHoward Hinnant                try
3673e519524SHoward Hinnant                {
368b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
369c003db1fSHoward Hinnant                    typedef istreambuf_iterator<_CharT, _Traits> _Ip;
370c003db1fSHoward Hinnant                    typedef ostreambuf_iterator<_CharT, _Traits> _Op;
371c003db1fSHoward Hinnant                    _Ip __i(__sb);
372c003db1fSHoward Hinnant                    _Ip __eof;
373c003db1fSHoward Hinnant                    _Op __o(*this);
3743e519524SHoward Hinnant                    size_t __c = 0;
3753e519524SHoward Hinnant                    for (; __i != __eof; ++__i, ++__o, ++__c)
3763e519524SHoward Hinnant                    {
3773e519524SHoward Hinnant                        *__o = *__i;
3783e519524SHoward Hinnant                        if (__o.failed())
3793e519524SHoward Hinnant                            break;
3803e519524SHoward Hinnant                    }
3813e519524SHoward Hinnant                    if (__c == 0)
3823e519524SHoward Hinnant                        this->setstate(ios_base::failbit);
3833e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3843e519524SHoward Hinnant                }
3853e519524SHoward Hinnant                catch (...)
3863e519524SHoward Hinnant                {
3873e519524SHoward Hinnant                    this->__set_failbit_and_consider_rethrow();
3883e519524SHoward Hinnant                }
389b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
3903e519524SHoward Hinnant            }
3913e519524SHoward Hinnant            else
3923e519524SHoward Hinnant                this->setstate(ios_base::badbit);
3933e519524SHoward Hinnant        }
3943e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3953e519524SHoward Hinnant    }
3963e519524SHoward Hinnant    catch (...)
3973e519524SHoward Hinnant    {
3983e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
3993e519524SHoward Hinnant    }
400b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4013e519524SHoward Hinnant    return *this;
4023e519524SHoward Hinnant}
4033e519524SHoward Hinnant
4043e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4053e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
4063e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(bool __n)
4073e519524SHoward Hinnant{
4083e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4093e519524SHoward Hinnant    try
4103e519524SHoward Hinnant    {
411b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4123e519524SHoward Hinnant        sentry __s(*this);
4133e519524SHoward Hinnant        if (__s)
4143e519524SHoward Hinnant        {
415c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
416c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
4173e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
4183e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
4193e519524SHoward Hinnant        }
4203e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4213e519524SHoward Hinnant    }
4223e519524SHoward Hinnant    catch (...)
4233e519524SHoward Hinnant    {
4243e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
4253e519524SHoward Hinnant    }
426b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4273e519524SHoward Hinnant    return *this;
4283e519524SHoward Hinnant}
4293e519524SHoward Hinnant
4303e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4313e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
4323e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(short __n)
4333e519524SHoward Hinnant{
4343e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4353e519524SHoward Hinnant    try
4363e519524SHoward Hinnant    {
437b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4383e519524SHoward Hinnant        sentry __s(*this);
4393e519524SHoward Hinnant        if (__s)
4403e519524SHoward Hinnant        {
4413e519524SHoward Hinnant            ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
442c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
443c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
4443e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(),
4453e519524SHoward Hinnant                        __flags == ios_base::oct || __flags == ios_base::hex ?
4463e519524SHoward Hinnant                        static_cast<long>(static_cast<unsigned short>(__n))  :
4473e519524SHoward Hinnant                        static_cast<long>(__n)).failed())
4483e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
4493e519524SHoward Hinnant        }
4503e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4513e519524SHoward Hinnant    }
4523e519524SHoward Hinnant    catch (...)
4533e519524SHoward Hinnant    {
4543e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
4553e519524SHoward Hinnant    }
456b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4573e519524SHoward Hinnant    return *this;
4583e519524SHoward Hinnant}
4593e519524SHoward Hinnant
4603e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4613e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
4623e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(unsigned short __n)
4633e519524SHoward Hinnant{
4643e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4653e519524SHoward Hinnant    try
4663e519524SHoward Hinnant    {
467b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4683e519524SHoward Hinnant        sentry __s(*this);
4693e519524SHoward Hinnant        if (__s)
4703e519524SHoward Hinnant        {
471c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
472c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
4733e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
4743e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
4753e519524SHoward Hinnant        }
4763e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4773e519524SHoward Hinnant    }
4783e519524SHoward Hinnant    catch (...)
4793e519524SHoward Hinnant    {
4803e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
4813e519524SHoward Hinnant    }
482b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4833e519524SHoward Hinnant    return *this;
4843e519524SHoward Hinnant}
4853e519524SHoward Hinnant
4863e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4873e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
4883e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(int __n)
4893e519524SHoward Hinnant{
4903e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4913e519524SHoward Hinnant    try
4923e519524SHoward Hinnant    {
493b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4943e519524SHoward Hinnant        sentry __s(*this);
4953e519524SHoward Hinnant        if (__s)
4963e519524SHoward Hinnant        {
4973e519524SHoward Hinnant            ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
498c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
499c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
5003e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(),
5013e519524SHoward Hinnant                        __flags == ios_base::oct || __flags == ios_base::hex ?
5023e519524SHoward Hinnant                        static_cast<long>(static_cast<unsigned int>(__n))  :
5033e519524SHoward Hinnant                        static_cast<long>(__n)).failed())
5043e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
5053e519524SHoward Hinnant        }
5063e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5073e519524SHoward Hinnant    }
5083e519524SHoward Hinnant    catch (...)
5093e519524SHoward Hinnant    {
5103e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
5113e519524SHoward Hinnant    }
512b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
5133e519524SHoward Hinnant    return *this;
5143e519524SHoward Hinnant}
5153e519524SHoward Hinnant
5163e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5173e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
5183e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(unsigned int __n)
5193e519524SHoward Hinnant{
5203e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5213e519524SHoward Hinnant    try
5223e519524SHoward Hinnant    {
523b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
5243e519524SHoward Hinnant        sentry __s(*this);
5253e519524SHoward Hinnant        if (__s)
5263e519524SHoward Hinnant        {
527c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
528c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
5293e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
5303e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
5313e519524SHoward Hinnant        }
5323e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5333e519524SHoward Hinnant    }
5343e519524SHoward Hinnant    catch (...)
5353e519524SHoward Hinnant    {
5363e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
5373e519524SHoward Hinnant    }
538b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
5393e519524SHoward Hinnant    return *this;
5403e519524SHoward Hinnant}
5413e519524SHoward Hinnant
5423e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5433e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
5443e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(long __n)
5453e519524SHoward Hinnant{
5463e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5473e519524SHoward Hinnant    try
5483e519524SHoward Hinnant    {
549b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
5503e519524SHoward Hinnant        sentry __s(*this);
5513e519524SHoward Hinnant        if (__s)
5523e519524SHoward Hinnant        {
553c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
554c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
5553e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
5563e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
5573e519524SHoward Hinnant        }
5583e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5593e519524SHoward Hinnant    }
5603e519524SHoward Hinnant    catch (...)
5613e519524SHoward Hinnant    {
5623e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
5633e519524SHoward Hinnant    }
564b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
5653e519524SHoward Hinnant    return *this;
5663e519524SHoward Hinnant}
5673e519524SHoward Hinnant
5683e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5693e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
5703e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(unsigned long __n)
5713e519524SHoward Hinnant{
5723e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5733e519524SHoward Hinnant    try
5743e519524SHoward Hinnant    {
575b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
5763e519524SHoward Hinnant        sentry __s(*this);
5773e519524SHoward Hinnant        if (__s)
5783e519524SHoward Hinnant        {
579c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
580c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
5813e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
5823e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
5833e519524SHoward Hinnant        }
5843e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5853e519524SHoward Hinnant    }
5863e519524SHoward Hinnant    catch (...)
5873e519524SHoward Hinnant    {
5883e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
5893e519524SHoward Hinnant    }
590b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
5913e519524SHoward Hinnant    return *this;
5923e519524SHoward Hinnant}
5933e519524SHoward Hinnant
5943e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5953e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
5963e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(long long __n)
5973e519524SHoward Hinnant{
5983e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5993e519524SHoward Hinnant    try
6003e519524SHoward Hinnant    {
601b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6023e519524SHoward Hinnant        sentry __s(*this);
6033e519524SHoward Hinnant        if (__s)
6043e519524SHoward Hinnant        {
605c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
606c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
6073e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
6083e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
6093e519524SHoward Hinnant        }
6103e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6113e519524SHoward Hinnant    }
6123e519524SHoward Hinnant    catch (...)
6133e519524SHoward Hinnant    {
6143e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
6153e519524SHoward Hinnant    }
616b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6173e519524SHoward Hinnant    return *this;
6183e519524SHoward Hinnant}
6193e519524SHoward Hinnant
6203e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
6213e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
6223e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n)
6233e519524SHoward Hinnant{
6243e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6253e519524SHoward Hinnant    try
6263e519524SHoward Hinnant    {
627b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6283e519524SHoward Hinnant        sentry __s(*this);
6293e519524SHoward Hinnant        if (__s)
6303e519524SHoward Hinnant        {
631c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
632c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
6333e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
6343e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
6353e519524SHoward Hinnant        }
6363e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6373e519524SHoward Hinnant    }
6383e519524SHoward Hinnant    catch (...)
6393e519524SHoward Hinnant    {
6403e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
6413e519524SHoward Hinnant    }
642b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6433e519524SHoward Hinnant    return *this;
6443e519524SHoward Hinnant}
6453e519524SHoward Hinnant
6463e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
6473e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
6483e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(float __n)
6493e519524SHoward Hinnant{
6503e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6513e519524SHoward Hinnant    try
6523e519524SHoward Hinnant    {
653b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6543e519524SHoward Hinnant        sentry __s(*this);
6553e519524SHoward Hinnant        if (__s)
6563e519524SHoward Hinnant        {
657c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
658c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
6593e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed())
6603e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
6613e519524SHoward Hinnant        }
6623e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6633e519524SHoward Hinnant    }
6643e519524SHoward Hinnant    catch (...)
6653e519524SHoward Hinnant    {
6663e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
6673e519524SHoward Hinnant    }
668b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6693e519524SHoward Hinnant    return *this;
6703e519524SHoward Hinnant}
6713e519524SHoward Hinnant
6723e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
6733e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
6743e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(double __n)
6753e519524SHoward Hinnant{
6763e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6773e519524SHoward Hinnant    try
6783e519524SHoward Hinnant    {
679b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6803e519524SHoward Hinnant        sentry __s(*this);
6813e519524SHoward Hinnant        if (__s)
6823e519524SHoward Hinnant        {
683c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
684c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
6853e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
6863e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
6873e519524SHoward Hinnant        }
6883e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6893e519524SHoward Hinnant    }
6903e519524SHoward Hinnant    catch (...)
6913e519524SHoward Hinnant    {
6923e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
6933e519524SHoward Hinnant    }
694b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
6953e519524SHoward Hinnant    return *this;
6963e519524SHoward Hinnant}
6973e519524SHoward Hinnant
6983e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
6993e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
7003e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(long double __n)
7013e519524SHoward Hinnant{
7023e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7033e519524SHoward Hinnant    try
7043e519524SHoward Hinnant    {
705b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7063e519524SHoward Hinnant        sentry __s(*this);
7073e519524SHoward Hinnant        if (__s)
7083e519524SHoward Hinnant        {
709c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
710c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
7113e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
7123e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
7133e519524SHoward Hinnant        }
7143e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7153e519524SHoward Hinnant    }
7163e519524SHoward Hinnant    catch (...)
7173e519524SHoward Hinnant    {
7183e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
7193e519524SHoward Hinnant    }
720b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7213e519524SHoward Hinnant    return *this;
7223e519524SHoward Hinnant}
7233e519524SHoward Hinnant
7243e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
7253e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
7263e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::operator<<(const void* __n)
7273e519524SHoward Hinnant{
7283e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7293e519524SHoward Hinnant    try
7303e519524SHoward Hinnant    {
731b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7323e519524SHoward Hinnant        sentry __s(*this);
7333e519524SHoward Hinnant        if (__s)
7343e519524SHoward Hinnant        {
735c003db1fSHoward Hinnant            typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
736c003db1fSHoward Hinnant            const _Fp& __f = use_facet<_Fp>(this->getloc());
7373e519524SHoward Hinnant            if (__f.put(*this, *this, this->fill(), __n).failed())
7383e519524SHoward Hinnant                this->setstate(ios_base::badbit | ios_base::failbit);
7393e519524SHoward Hinnant        }
7403e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7413e519524SHoward Hinnant    }
7423e519524SHoward Hinnant    catch (...)
7433e519524SHoward Hinnant    {
7443e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
7453e519524SHoward Hinnant    }
746b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7473e519524SHoward Hinnant    return *this;
7483e519524SHoward Hinnant}
7493e519524SHoward Hinnant
7503e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
7513e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
7526bc32ebfSMarshall Clow__put_character_sequence(basic_ostream<_CharT, _Traits>& __os,
7536bc32ebfSMarshall Clow                          const _CharT* __str, size_t __len)
7543e519524SHoward Hinnant{
7553e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7563e519524SHoward Hinnant    try
7573e519524SHoward Hinnant    {
758b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7593e519524SHoward Hinnant        typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
7603e519524SHoward Hinnant        if (__s)
7613e519524SHoward Hinnant        {
762c003db1fSHoward Hinnant            typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
763c003db1fSHoward Hinnant            if (__pad_and_output(_Ip(__os),
7646bc32ebfSMarshall Clow                                 __str,
7653e519524SHoward Hinnant                                 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
7666bc32ebfSMarshall Clow                                     __str + __len :
7676bc32ebfSMarshall Clow                                     __str,
7686bc32ebfSMarshall Clow                                 __str + __len,
7693e519524SHoward Hinnant                                 __os,
7703e519524SHoward Hinnant                                 __os.fill()).failed())
7713e519524SHoward Hinnant                __os.setstate(ios_base::badbit | ios_base::failbit);
7723e519524SHoward Hinnant        }
7733e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7743e519524SHoward Hinnant    }
7753e519524SHoward Hinnant    catch (...)
7763e519524SHoward Hinnant    {
7773e519524SHoward Hinnant        __os.__set_badbit_and_consider_rethrow();
7783e519524SHoward Hinnant    }
779b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7803e519524SHoward Hinnant    return __os;
7813e519524SHoward Hinnant}
7823e519524SHoward Hinnant
7838d6ac8f6SVolodymyr Sapsai
7846bc32ebfSMarshall Clowtemplate<class _CharT, class _Traits>
7856bc32ebfSMarshall Clowbasic_ostream<_CharT, _Traits>&
7866bc32ebfSMarshall Clowoperator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c)
7876bc32ebfSMarshall Clow{
7886bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, &__c, 1);
7896bc32ebfSMarshall Clow}
7906bc32ebfSMarshall Clow
7913e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
7923e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
7933e519524SHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
7943e519524SHoward Hinnant{
7953e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
7963e519524SHoward Hinnant    try
7973e519524SHoward Hinnant    {
798b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
7993e519524SHoward Hinnant        typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
8003e519524SHoward Hinnant        if (__s)
8013e519524SHoward Hinnant        {
8023e519524SHoward Hinnant            _CharT __c = __os.widen(__cn);
803c003db1fSHoward Hinnant            typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
804c003db1fSHoward Hinnant            if (__pad_and_output(_Ip(__os),
8053e519524SHoward Hinnant                                 &__c,
8063e519524SHoward Hinnant                                 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
8073e519524SHoward Hinnant                                     &__c + 1 :
8083e519524SHoward Hinnant                                     &__c,
8093e519524SHoward Hinnant                                 &__c + 1,
8103e519524SHoward Hinnant                                 __os,
8113e519524SHoward Hinnant                                 __os.fill()).failed())
8123e519524SHoward Hinnant                __os.setstate(ios_base::badbit | ios_base::failbit);
8133e519524SHoward Hinnant        }
8143e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8153e519524SHoward Hinnant    }
8163e519524SHoward Hinnant    catch (...)
8173e519524SHoward Hinnant    {
8183e519524SHoward Hinnant        __os.__set_badbit_and_consider_rethrow();
8193e519524SHoward Hinnant    }
820b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
8213e519524SHoward Hinnant    return __os;
8223e519524SHoward Hinnant}
8233e519524SHoward Hinnant
8243e519524SHoward Hinnanttemplate<class _Traits>
8253e519524SHoward Hinnantbasic_ostream<char, _Traits>&
8263e519524SHoward Hinnantoperator<<(basic_ostream<char, _Traits>& __os, char __c)
8273e519524SHoward Hinnant{
8286bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, &__c, 1);
8293e519524SHoward Hinnant}
8303e519524SHoward Hinnant
8313e519524SHoward Hinnanttemplate<class _Traits>
8323e519524SHoward Hinnantbasic_ostream<char, _Traits>&
8333e519524SHoward Hinnantoperator<<(basic_ostream<char, _Traits>& __os, signed char __c)
8343e519524SHoward Hinnant{
8356bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
8363e519524SHoward Hinnant}
8373e519524SHoward Hinnant
8383e519524SHoward Hinnanttemplate<class _Traits>
8393e519524SHoward Hinnantbasic_ostream<char, _Traits>&
8403e519524SHoward Hinnantoperator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)
8413e519524SHoward Hinnant{
8426bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
8433e519524SHoward Hinnant}
8443e519524SHoward Hinnant
8453e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
8463e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
8473e519524SHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str)
8483e519524SHoward Hinnant{
8496bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
8503e519524SHoward Hinnant}
8513e519524SHoward Hinnant
8523e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
8533e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
8543e519524SHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn)
8553e519524SHoward Hinnant{
8563e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8573e519524SHoward Hinnant    try
8583e519524SHoward Hinnant    {
859b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
8603e519524SHoward Hinnant        typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
8613e519524SHoward Hinnant        if (__s)
8623e519524SHoward Hinnant        {
863c003db1fSHoward Hinnant            typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
8643e519524SHoward Hinnant            size_t __len = char_traits<char>::length(__strn);
8653e519524SHoward Hinnant            const int __bs = 100;
8663e519524SHoward Hinnant            _CharT __wbb[__bs];
8673e519524SHoward Hinnant            _CharT* __wb = __wbb;
8683e519524SHoward Hinnant            unique_ptr<_CharT, void(*)(void*)> __h(0, free);
8693e519524SHoward Hinnant            if (__len > __bs)
8703e519524SHoward Hinnant            {
8713e519524SHoward Hinnant                __wb = (_CharT*)malloc(__len*sizeof(_CharT));
8723e519524SHoward Hinnant                if (__wb == 0)
8733e519524SHoward Hinnant                    __throw_bad_alloc();
8743e519524SHoward Hinnant                __h.reset(__wb);
8753e519524SHoward Hinnant            }
8763e519524SHoward Hinnant            for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p)
8773e519524SHoward Hinnant                *__p = __os.widen(*__strn);
878c003db1fSHoward Hinnant            if (__pad_and_output(_Ip(__os),
8793e519524SHoward Hinnant                                 __wb,
8803e519524SHoward Hinnant                                 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
8813e519524SHoward Hinnant                                     __wb + __len :
8823e519524SHoward Hinnant                                     __wb,
8833e519524SHoward Hinnant                                 __wb + __len,
8843e519524SHoward Hinnant                                 __os,
8853e519524SHoward Hinnant                                 __os.fill()).failed())
8863e519524SHoward Hinnant                __os.setstate(ios_base::badbit | ios_base::failbit);
8873e519524SHoward Hinnant        }
8883e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8893e519524SHoward Hinnant    }
8903e519524SHoward Hinnant    catch (...)
8913e519524SHoward Hinnant    {
8923e519524SHoward Hinnant        __os.__set_badbit_and_consider_rethrow();
8933e519524SHoward Hinnant    }
894b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
8953e519524SHoward Hinnant    return __os;
8963e519524SHoward Hinnant}
8973e519524SHoward Hinnant
8983e519524SHoward Hinnanttemplate<class _Traits>
8993e519524SHoward Hinnantbasic_ostream<char, _Traits>&
9003e519524SHoward Hinnantoperator<<(basic_ostream<char, _Traits>& __os, const char* __str)
9013e519524SHoward Hinnant{
9026bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
9033e519524SHoward Hinnant}
9043e519524SHoward Hinnant
9053e519524SHoward Hinnanttemplate<class _Traits>
9063e519524SHoward Hinnantbasic_ostream<char, _Traits>&
9073e519524SHoward Hinnantoperator<<(basic_ostream<char, _Traits>& __os, const signed char* __str)
9083e519524SHoward Hinnant{
9096bc32ebfSMarshall Clow    const char *__s = (const char *) __str;
9106bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
9113e519524SHoward Hinnant}
9123e519524SHoward Hinnant
9133e519524SHoward Hinnanttemplate<class _Traits>
9143e519524SHoward Hinnantbasic_ostream<char, _Traits>&
9153e519524SHoward Hinnantoperator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str)
9163e519524SHoward Hinnant{
9176bc32ebfSMarshall Clow    const char *__s = (const char *) __str;
9186bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
9193e519524SHoward Hinnant}
9203e519524SHoward Hinnant
9213e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
9223e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
9233e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::put(char_type __c)
9243e519524SHoward Hinnant{
9253e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9263e519524SHoward Hinnant    try
9273e519524SHoward Hinnant    {
928b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
9293e519524SHoward Hinnant        sentry __s(*this);
9303e519524SHoward Hinnant        if (__s)
9313e519524SHoward Hinnant        {
932c003db1fSHoward Hinnant            typedef ostreambuf_iterator<_CharT, _Traits> _Op;
933c003db1fSHoward Hinnant            _Op __o(*this);
9343e519524SHoward Hinnant            *__o = __c;
9353e519524SHoward Hinnant            if (__o.failed())
9363e519524SHoward Hinnant                this->setstate(ios_base::badbit);
9373e519524SHoward Hinnant        }
9383e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9393e519524SHoward Hinnant    }
9403e519524SHoward Hinnant    catch (...)
9413e519524SHoward Hinnant    {
9423e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
9433e519524SHoward Hinnant    }
944b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
9453e519524SHoward Hinnant    return *this;
9463e519524SHoward Hinnant}
9473e519524SHoward Hinnant
9483e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
9493e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
9503e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
9513e519524SHoward Hinnant{
9523e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9533e519524SHoward Hinnant    try
9543e519524SHoward Hinnant    {
955b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
9563e519524SHoward Hinnant        sentry __sen(*this);
9573e519524SHoward Hinnant        if (__sen && __n)
9583e519524SHoward Hinnant        {
9593d7eb2f8SHoward Hinnant            if (this->rdbuf()->sputn(__s, __n) != __n)
9603e519524SHoward Hinnant                this->setstate(ios_base::badbit);
9613e519524SHoward Hinnant        }
9623e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9633e519524SHoward Hinnant    }
9643e519524SHoward Hinnant    catch (...)
9653e519524SHoward Hinnant    {
9663e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
9673e519524SHoward Hinnant    }
968b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
9693e519524SHoward Hinnant    return *this;
9703e519524SHoward Hinnant}
9713e519524SHoward Hinnant
9723e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
9733e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
9743e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::flush()
9753e519524SHoward Hinnant{
9763e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9773e519524SHoward Hinnant    try
9783e519524SHoward Hinnant    {
979b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
9803e519524SHoward Hinnant        if (this->rdbuf())
9813e519524SHoward Hinnant        {
9823e519524SHoward Hinnant            sentry __s(*this);
9833e519524SHoward Hinnant            if (__s)
9843e519524SHoward Hinnant            {
9853e519524SHoward Hinnant                if (this->rdbuf()->pubsync() == -1)
9863e519524SHoward Hinnant                    this->setstate(ios_base::badbit);
9873e519524SHoward Hinnant            }
9883e519524SHoward Hinnant        }
9893e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9903e519524SHoward Hinnant    }
9913e519524SHoward Hinnant    catch (...)
9923e519524SHoward Hinnant    {
9933e519524SHoward Hinnant        this->__set_badbit_and_consider_rethrow();
9943e519524SHoward Hinnant    }
995b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
9963e519524SHoward Hinnant    return *this;
9973e519524SHoward Hinnant}
9983e519524SHoward Hinnant
9993e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
10003e519524SHoward Hinnanttypename basic_ostream<_CharT, _Traits>::pos_type
10013e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::tellp()
10023e519524SHoward Hinnant{
10033e519524SHoward Hinnant    if (this->fail())
10043e519524SHoward Hinnant        return pos_type(-1);
10053e519524SHoward Hinnant    return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
10063e519524SHoward Hinnant}
10073e519524SHoward Hinnant
10083e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
10093e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
10103e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
10113e519524SHoward Hinnant{
1012e1bedf4eSMarshall Clow    sentry __s(*this);
101399f5fc93SMarshall Clow    if (!this->fail())
10143e519524SHoward Hinnant    {
10153e519524SHoward Hinnant        if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
10163e519524SHoward Hinnant            this->setstate(ios_base::failbit);
10173e519524SHoward Hinnant    }
10183e519524SHoward Hinnant    return *this;
10193e519524SHoward Hinnant}
10203e519524SHoward Hinnant
10213e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
10223e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
10233e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir)
10243e519524SHoward Hinnant{
1025e1bedf4eSMarshall Clow    sentry __s(*this);
102699f5fc93SMarshall Clow    if (!this->fail())
1027e1bedf4eSMarshall Clow    {
1028e1bedf4eSMarshall Clow        if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
1029e1bedf4eSMarshall Clow            this->setstate(ios_base::failbit);
1030e1bedf4eSMarshall Clow    }
10313e519524SHoward Hinnant    return *this;
10323e519524SHoward Hinnant}
10333e519524SHoward Hinnant
10343e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
10352d3b8cc8SLouis Dionneinline
10363e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
10373e519524SHoward Hinnantendl(basic_ostream<_CharT, _Traits>& __os)
10383e519524SHoward Hinnant{
10393e519524SHoward Hinnant    __os.put(__os.widen('\n'));
10403e519524SHoward Hinnant    __os.flush();
10413e519524SHoward Hinnant    return __os;
10423e519524SHoward Hinnant}
10433e519524SHoward Hinnant
10443e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
10452d3b8cc8SLouis Dionneinline
10463e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
10473e519524SHoward Hinnantends(basic_ostream<_CharT, _Traits>& __os)
10483e519524SHoward Hinnant{
10493e519524SHoward Hinnant    __os.put(_CharT());
10503e519524SHoward Hinnant    return __os;
10513e519524SHoward Hinnant}
10523e519524SHoward Hinnant
10533e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
10542d3b8cc8SLouis Dionneinline
10553e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
10563e519524SHoward Hinnantflush(basic_ostream<_CharT, _Traits>& __os)
10573e519524SHoward Hinnant{
10583e519524SHoward Hinnant    __os.flush();
10593e519524SHoward Hinnant    return __os;
10603e519524SHoward Hinnant}
10613e519524SHoward Hinnant
1062c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp, class = void>
1063c90dee1eSLouis Dionnestruct __is_ostreamable : false_type { };
1064c90dee1eSLouis Dionne
10653e519524SHoward Hinnanttemplate <class _Stream, class _Tp>
1066c90dee1eSLouis Dionnestruct __is_ostreamable<_Stream, _Tp, decltype(
1067ab3fcc50SArthur O'Dwyer    declval<_Stream>() << declval<_Tp>(), void()
1068c90dee1eSLouis Dionne)> : true_type { };
1069c90dee1eSLouis Dionne
1070c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp, class = typename enable_if<
1071c90dee1eSLouis Dionne    _And<is_base_of<ios_base, _Stream>,
1072c90dee1eSLouis Dionne         __is_ostreamable<_Stream&, const _Tp&> >::value
1073c90dee1eSLouis Dionne>::type>
1074c90dee1eSLouis Dionne_LIBCPP_INLINE_VISIBILITY
1075c90dee1eSLouis Dionne_Stream&& operator<<(_Stream&& __os, const _Tp& __x)
10763e519524SHoward Hinnant{
10773e519524SHoward Hinnant    __os << __x;
1078c37917f3SHoward Hinnant    return _VSTD::move(__os);
10793e519524SHoward Hinnant}
10803e519524SHoward Hinnant
10813e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
10823e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
10833e519524SHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os,
10843e519524SHoward Hinnant           const basic_string<_CharT, _Traits, _Allocator>& __str)
10853e519524SHoward Hinnant{
10866bc32ebfSMarshall Clow    return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
10873e519524SHoward Hinnant}
10883e519524SHoward Hinnant
10893e519524SHoward Hinnanttemplate<class _CharT, class _Traits>
1090053d81ceSMarshall Clowbasic_ostream<_CharT, _Traits>&
1091053d81ceSMarshall Clowoperator<<(basic_ostream<_CharT, _Traits>& __os,
1092af4a29afSEric Fiselier           basic_string_view<_CharT, _Traits> __sv)
1093053d81ceSMarshall Clow{
1094053d81ceSMarshall Clow    return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size());
1095053d81ceSMarshall Clow}
1096053d81ceSMarshall Clow
1097053d81ceSMarshall Clowtemplate <class _CharT, class _Traits>
1098c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
10993e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
11003e519524SHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec)
11013e519524SHoward Hinnant{
11023e519524SHoward Hinnant    return __os << __ec.category().name() << ':' << __ec.value();
11033e519524SHoward Hinnant}
11043e519524SHoward Hinnant
1105c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp>
1106c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY
11073e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
1108c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p)
11093e519524SHoward Hinnant{
11103e519524SHoward Hinnant    return __os << __p.get();
11113e519524SHoward Hinnant}
11123e519524SHoward Hinnant
111348f36539SMarshall Clowtemplate<class _CharT, class _Traits, class _Yp, class _Dp>
111448f36539SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
111548f36539SMarshall Clowtypename enable_if
111648f36539SMarshall Clow<
1117a4122be5SMarshall Clow    is_same<void, typename __void_t<decltype((declval<basic_ostream<_CharT, _Traits>&>() << declval<typename unique_ptr<_Yp, _Dp>::pointer>()))>::type>::value,
111848f36539SMarshall Clow    basic_ostream<_CharT, _Traits>&
111948f36539SMarshall Clow>::type
112048f36539SMarshall Clowoperator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)
112148f36539SMarshall Clow{
112248f36539SMarshall Clow    return __os << __p.get();
112348f36539SMarshall Clow}
112448f36539SMarshall Clow
11253e519524SHoward Hinnanttemplate <class _CharT, class _Traits, size_t _Size>
11263e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
1127a9c7c14eSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)
11283e519524SHoward Hinnant{
11293e519524SHoward Hinnant    return __os << __x.template to_string<_CharT, _Traits>
11303e519524SHoward Hinnant                        (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'),
11313e519524SHoward Hinnant                         use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
11323e519524SHoward Hinnant}
11333e519524SHoward Hinnant
1134*309aed30SNikolas Klauser#if _LIBCPP_STD_VER > 17
1135*309aed30SNikolas Klauser
1136*309aed30SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1137*309aed30SNikolas Klausertemplate <class _Traits>
1138*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete;
1139*309aed30SNikolas Klauser
1140*309aed30SNikolas Klausertemplate <class _Traits>
1141*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete;
1142*309aed30SNikolas Klauser
1143*309aed30SNikolas Klausertemplate <class _Traits>
1144*309aed30SNikolas Klauserbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete;
1145*309aed30SNikolas Klauser
1146*309aed30SNikolas Klausertemplate <class _Traits>
1147*309aed30SNikolas Klauserbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete;
1148*309aed30SNikolas Klauser
1149*309aed30SNikolas Klausertemplate <class _Traits>
1150*309aed30SNikolas Klauserbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete;
1151*309aed30SNikolas Klauser
1152*309aed30SNikolas Klausertemplate <class _Traits>
1153*309aed30SNikolas Klauserbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete;
1154*309aed30SNikolas Klauser
1155*309aed30SNikolas Klauser#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
1156*309aed30SNikolas Klauser
1157*309aed30SNikolas Klauser#ifndef _LIBCPP_HAS_NO_CHAR8_T
1158*309aed30SNikolas Klausertemplate <class _Traits>
1159*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char8_t) = delete;
1160*309aed30SNikolas Klauser
1161*309aed30SNikolas Klausertemplate <class _Traits>
1162*309aed30SNikolas Klauserbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete;
1163*309aed30SNikolas Klauser
1164*309aed30SNikolas Klausertemplate <class _Traits>
1165*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete;
1166*309aed30SNikolas Klauser
1167*309aed30SNikolas Klausertemplate <class _Traits>
1168*309aed30SNikolas Klauserbasic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete;
1169*309aed30SNikolas Klauser#endif
1170*309aed30SNikolas Klauser
1171*309aed30SNikolas Klausertemplate <class _Traits>
1172*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char16_t) = delete;
1173*309aed30SNikolas Klauser
1174*309aed30SNikolas Klausertemplate <class _Traits>
1175*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char32_t) = delete;
1176*309aed30SNikolas Klauser
1177*309aed30SNikolas Klausertemplate <class _Traits>
1178*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete;
1179*309aed30SNikolas Klauser
1180*309aed30SNikolas Klausertemplate <class _Traits>
1181*309aed30SNikolas Klauserbasic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete;
1182*309aed30SNikolas Klauser
1183*309aed30SNikolas Klauser#endif // _LIBCPP_STD_VER > 17
1184*309aed30SNikolas Klauser
11852ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>;
1186f4c1258dSLouis Dionne#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
11872ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>;
1188f4c1258dSLouis Dionne#endif
11893e519524SHoward Hinnant
11903e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
11913e519524SHoward Hinnant
11923e519524SHoward Hinnant#endif // _LIBCPP_OSTREAM
1193