1*0fca6ea1SDimitry Andric //===---------------------------------------------------------------------===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===---------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric 9*0fca6ea1SDimitry Andric #ifndef _LIBCPP___OSTREAM_BASIC_OSTREAM_H 10*0fca6ea1SDimitry Andric #define _LIBCPP___OSTREAM_BASIC_OSTREAM_H 11*0fca6ea1SDimitry Andric 12*0fca6ea1SDimitry Andric #include <__config> 13*0fca6ea1SDimitry Andric #include <__exception/operations.h> 14*0fca6ea1SDimitry Andric #include <__memory/shared_ptr.h> 15*0fca6ea1SDimitry Andric #include <__memory/unique_ptr.h> 16*0fca6ea1SDimitry Andric #include <__system_error/error_code.h> 17*0fca6ea1SDimitry Andric #include <__type_traits/conjunction.h> 18*0fca6ea1SDimitry Andric #include <__type_traits/enable_if.h> 19*0fca6ea1SDimitry Andric #include <__type_traits/is_base_of.h> 20*0fca6ea1SDimitry Andric #include <__type_traits/void_t.h> 21*0fca6ea1SDimitry Andric #include <__utility/declval.h> 22*0fca6ea1SDimitry Andric #include <bitset> 23*0fca6ea1SDimitry Andric #include <cstddef> 24*0fca6ea1SDimitry Andric #include <ios> 25*0fca6ea1SDimitry Andric #include <locale> 26*0fca6ea1SDimitry Andric #include <new> // for __throw_bad_alloc 27*0fca6ea1SDimitry Andric #include <streambuf> 28*0fca6ea1SDimitry Andric #include <string_view> 29*0fca6ea1SDimitry Andric 30*0fca6ea1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 31*0fca6ea1SDimitry Andric # pragma GCC system_header 32*0fca6ea1SDimitry Andric #endif 33*0fca6ea1SDimitry Andric 34*0fca6ea1SDimitry Andric _LIBCPP_PUSH_MACROS 35*0fca6ea1SDimitry Andric #include <__undef_macros> 36*0fca6ea1SDimitry Andric 37*0fca6ea1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 38*0fca6ea1SDimitry Andric 39*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 40*0fca6ea1SDimitry Andric class _LIBCPP_TEMPLATE_VIS basic_ostream : virtual public basic_ios<_CharT, _Traits> { 41*0fca6ea1SDimitry Andric public: 42*0fca6ea1SDimitry Andric // types (inherited from basic_ios (27.5.4)): 43*0fca6ea1SDimitry Andric typedef _CharT char_type; 44*0fca6ea1SDimitry Andric typedef _Traits traits_type; 45*0fca6ea1SDimitry Andric typedef typename traits_type::int_type int_type; 46*0fca6ea1SDimitry Andric typedef typename traits_type::pos_type pos_type; 47*0fca6ea1SDimitry Andric typedef typename traits_type::off_type off_type; 48*0fca6ea1SDimitry Andric 49*0fca6ea1SDimitry Andric // 27.7.2.2 Constructor/destructor: 50*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb) { 51*0fca6ea1SDimitry Andric this->init(__sb); 52*0fca6ea1SDimitry Andric } 53*0fca6ea1SDimitry Andric ~basic_ostream() override; 54*0fca6ea1SDimitry Andric 55*0fca6ea1SDimitry Andric basic_ostream(const basic_ostream& __rhs) = delete; 56*0fca6ea1SDimitry Andric basic_ostream& operator=(const basic_ostream& __rhs) = delete; 57*0fca6ea1SDimitry Andric 58*0fca6ea1SDimitry Andric protected: 59*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream(basic_ostream&& __rhs); 60*0fca6ea1SDimitry Andric 61*0fca6ea1SDimitry Andric // 27.7.2.3 Assign/swap 62*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream& operator=(basic_ostream&& __rhs); 63*0fca6ea1SDimitry Andric 64*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_ostream& __rhs) { 65*0fca6ea1SDimitry Andric basic_ios<char_type, traits_type>::swap(__rhs); 66*0fca6ea1SDimitry Andric } 67*0fca6ea1SDimitry Andric 68*0fca6ea1SDimitry Andric public: 69*0fca6ea1SDimitry Andric // 27.7.2.4 Prefix/suffix: 70*0fca6ea1SDimitry Andric class _LIBCPP_TEMPLATE_VIS sentry; 71*0fca6ea1SDimitry Andric 72*0fca6ea1SDimitry Andric // 27.7.2.6 Formatted output: 73*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)) { 74*0fca6ea1SDimitry Andric return __pf(*this); 75*0fca6ea1SDimitry Andric } 76*0fca6ea1SDimitry Andric 77*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& 78*0fca6ea1SDimitry Andric operator<<(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) { 79*0fca6ea1SDimitry Andric __pf(*this); 80*0fca6ea1SDimitry Andric return *this; 81*0fca6ea1SDimitry Andric } 82*0fca6ea1SDimitry Andric 83*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&)) { 84*0fca6ea1SDimitry Andric __pf(*this); 85*0fca6ea1SDimitry Andric return *this; 86*0fca6ea1SDimitry Andric } 87*0fca6ea1SDimitry Andric 88*0fca6ea1SDimitry Andric basic_ostream& operator<<(bool __n); 89*0fca6ea1SDimitry Andric basic_ostream& operator<<(short __n); 90*0fca6ea1SDimitry Andric basic_ostream& operator<<(unsigned short __n); 91*0fca6ea1SDimitry Andric basic_ostream& operator<<(int __n); 92*0fca6ea1SDimitry Andric basic_ostream& operator<<(unsigned int __n); 93*0fca6ea1SDimitry Andric basic_ostream& operator<<(long __n); 94*0fca6ea1SDimitry Andric basic_ostream& operator<<(unsigned long __n); 95*0fca6ea1SDimitry Andric basic_ostream& operator<<(long long __n); 96*0fca6ea1SDimitry Andric basic_ostream& operator<<(unsigned long long __n); 97*0fca6ea1SDimitry Andric basic_ostream& operator<<(float __f); 98*0fca6ea1SDimitry Andric basic_ostream& operator<<(double __f); 99*0fca6ea1SDimitry Andric basic_ostream& operator<<(long double __f); 100*0fca6ea1SDimitry Andric basic_ostream& operator<<(const void* __p); 101*0fca6ea1SDimitry Andric 102*0fca6ea1SDimitry Andric #if _LIBCPP_STD_VER >= 23 103*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(const volatile void* __p) { 104*0fca6ea1SDimitry Andric return operator<<(const_cast<const void*>(__p)); 105*0fca6ea1SDimitry Andric } 106*0fca6ea1SDimitry Andric #endif 107*0fca6ea1SDimitry Andric 108*0fca6ea1SDimitry Andric basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb); 109*0fca6ea1SDimitry Andric 110*0fca6ea1SDimitry Andric #if _LIBCPP_STD_VER >= 17 111*0fca6ea1SDimitry Andric // LWG 2221 - nullptr. This is not backported to older standards modes. 112*0fca6ea1SDimitry Andric // See https://reviews.llvm.org/D127033 for more info on the rationale. 113*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream& operator<<(nullptr_t) { return *this << "nullptr"; } 114*0fca6ea1SDimitry Andric #endif 115*0fca6ea1SDimitry Andric 116*0fca6ea1SDimitry Andric // 27.7.2.7 Unformatted output: 117*0fca6ea1SDimitry Andric basic_ostream& put(char_type __c); 118*0fca6ea1SDimitry Andric basic_ostream& write(const char_type* __s, streamsize __n); 119*0fca6ea1SDimitry Andric basic_ostream& flush(); 120*0fca6ea1SDimitry Andric 121*0fca6ea1SDimitry Andric // 27.7.2.5 seeks: 122*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 pos_type tellp(); 123*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(pos_type __pos); 124*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir); 125*0fca6ea1SDimitry Andric 126*0fca6ea1SDimitry Andric protected: 127*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream() {} // extension, intentially does not initialize 128*0fca6ea1SDimitry Andric }; 129*0fca6ea1SDimitry Andric 130*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 131*0fca6ea1SDimitry Andric class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry { 132*0fca6ea1SDimitry Andric bool __ok_; 133*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& __os_; 134*0fca6ea1SDimitry Andric 135*0fca6ea1SDimitry Andric public: 136*0fca6ea1SDimitry Andric explicit sentry(basic_ostream<_CharT, _Traits>& __os); 137*0fca6ea1SDimitry Andric ~sentry(); 138*0fca6ea1SDimitry Andric sentry(const sentry&) = delete; 139*0fca6ea1SDimitry Andric sentry& operator=(const sentry&) = delete; 140*0fca6ea1SDimitry Andric 141*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; } 142*0fca6ea1SDimitry Andric }; 143*0fca6ea1SDimitry Andric 144*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 145*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) : __ok_(false), __os_(__os) { 146*0fca6ea1SDimitry Andric if (__os.good()) { 147*0fca6ea1SDimitry Andric if (__os.tie()) 148*0fca6ea1SDimitry Andric __os.tie()->flush(); 149*0fca6ea1SDimitry Andric __ok_ = true; 150*0fca6ea1SDimitry Andric } 151*0fca6ea1SDimitry Andric } 152*0fca6ea1SDimitry Andric 153*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 154*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::sentry::~sentry() { 155*0fca6ea1SDimitry Andric if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) && !uncaught_exception()) { 156*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 157*0fca6ea1SDimitry Andric try { 158*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 159*0fca6ea1SDimitry Andric if (__os_.rdbuf()->pubsync() == -1) 160*0fca6ea1SDimitry Andric __os_.setstate(ios_base::badbit); 161*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 162*0fca6ea1SDimitry Andric } catch (...) { 163*0fca6ea1SDimitry Andric } 164*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 165*0fca6ea1SDimitry Andric } 166*0fca6ea1SDimitry Andric } 167*0fca6ea1SDimitry Andric 168*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 169*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) { 170*0fca6ea1SDimitry Andric this->move(__rhs); 171*0fca6ea1SDimitry Andric } 172*0fca6ea1SDimitry Andric 173*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 174*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs) { 175*0fca6ea1SDimitry Andric swap(__rhs); 176*0fca6ea1SDimitry Andric return *this; 177*0fca6ea1SDimitry Andric } 178*0fca6ea1SDimitry Andric 179*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 180*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::~basic_ostream() {} 181*0fca6ea1SDimitry Andric 182*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 183*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& 184*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) { 185*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 186*0fca6ea1SDimitry Andric try { 187*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 188*0fca6ea1SDimitry Andric sentry __s(*this); 189*0fca6ea1SDimitry Andric if (__s) { 190*0fca6ea1SDimitry Andric if (__sb) { 191*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 192*0fca6ea1SDimitry Andric try { 193*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 194*0fca6ea1SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 195*0fca6ea1SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 196*0fca6ea1SDimitry Andric _Ip __i(__sb); 197*0fca6ea1SDimitry Andric _Ip __eof; 198*0fca6ea1SDimitry Andric _Op __o(*this); 199*0fca6ea1SDimitry Andric size_t __c = 0; 200*0fca6ea1SDimitry Andric for (; __i != __eof; ++__i, ++__o, ++__c) { 201*0fca6ea1SDimitry Andric *__o = *__i; 202*0fca6ea1SDimitry Andric if (__o.failed()) 203*0fca6ea1SDimitry Andric break; 204*0fca6ea1SDimitry Andric } 205*0fca6ea1SDimitry Andric if (__c == 0) 206*0fca6ea1SDimitry Andric this->setstate(ios_base::failbit); 207*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 208*0fca6ea1SDimitry Andric } catch (...) { 209*0fca6ea1SDimitry Andric this->__set_failbit_and_consider_rethrow(); 210*0fca6ea1SDimitry Andric } 211*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 212*0fca6ea1SDimitry Andric } else 213*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit); 214*0fca6ea1SDimitry Andric } 215*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 216*0fca6ea1SDimitry Andric } catch (...) { 217*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 218*0fca6ea1SDimitry Andric } 219*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 220*0fca6ea1SDimitry Andric return *this; 221*0fca6ea1SDimitry Andric } 222*0fca6ea1SDimitry Andric 223*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 224*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(bool __n) { 225*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 226*0fca6ea1SDimitry Andric try { 227*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 228*0fca6ea1SDimitry Andric sentry __s(*this); 229*0fca6ea1SDimitry Andric if (__s) { 230*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 231*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 232*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 233*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 234*0fca6ea1SDimitry Andric } 235*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 236*0fca6ea1SDimitry Andric } catch (...) { 237*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 238*0fca6ea1SDimitry Andric } 239*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 240*0fca6ea1SDimitry Andric return *this; 241*0fca6ea1SDimitry Andric } 242*0fca6ea1SDimitry Andric 243*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 244*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(short __n) { 245*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 246*0fca6ea1SDimitry Andric try { 247*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 248*0fca6ea1SDimitry Andric sentry __s(*this); 249*0fca6ea1SDimitry Andric if (__s) { 250*0fca6ea1SDimitry Andric ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; 251*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 252*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 253*0fca6ea1SDimitry Andric if (__f.put(*this, 254*0fca6ea1SDimitry Andric *this, 255*0fca6ea1SDimitry Andric this->fill(), 256*0fca6ea1SDimitry Andric __flags == ios_base::oct || __flags == ios_base::hex 257*0fca6ea1SDimitry Andric ? static_cast<long>(static_cast<unsigned short>(__n)) 258*0fca6ea1SDimitry Andric : static_cast<long>(__n)) 259*0fca6ea1SDimitry Andric .failed()) 260*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 261*0fca6ea1SDimitry Andric } 262*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 263*0fca6ea1SDimitry Andric } catch (...) { 264*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 265*0fca6ea1SDimitry Andric } 266*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 267*0fca6ea1SDimitry Andric return *this; 268*0fca6ea1SDimitry Andric } 269*0fca6ea1SDimitry Andric 270*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 271*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) { 272*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 273*0fca6ea1SDimitry Andric try { 274*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 275*0fca6ea1SDimitry Andric sentry __s(*this); 276*0fca6ea1SDimitry Andric if (__s) { 277*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 278*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 279*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) 280*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 281*0fca6ea1SDimitry Andric } 282*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 283*0fca6ea1SDimitry Andric } catch (...) { 284*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 285*0fca6ea1SDimitry Andric } 286*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 287*0fca6ea1SDimitry Andric return *this; 288*0fca6ea1SDimitry Andric } 289*0fca6ea1SDimitry Andric 290*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 291*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(int __n) { 292*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 293*0fca6ea1SDimitry Andric try { 294*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 295*0fca6ea1SDimitry Andric sentry __s(*this); 296*0fca6ea1SDimitry Andric if (__s) { 297*0fca6ea1SDimitry Andric ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; 298*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 299*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 300*0fca6ea1SDimitry Andric if (__f.put(*this, 301*0fca6ea1SDimitry Andric *this, 302*0fca6ea1SDimitry Andric this->fill(), 303*0fca6ea1SDimitry Andric __flags == ios_base::oct || __flags == ios_base::hex 304*0fca6ea1SDimitry Andric ? static_cast<long>(static_cast<unsigned int>(__n)) 305*0fca6ea1SDimitry Andric : static_cast<long>(__n)) 306*0fca6ea1SDimitry Andric .failed()) 307*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 308*0fca6ea1SDimitry Andric } 309*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 310*0fca6ea1SDimitry Andric } catch (...) { 311*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 312*0fca6ea1SDimitry Andric } 313*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 314*0fca6ea1SDimitry Andric return *this; 315*0fca6ea1SDimitry Andric } 316*0fca6ea1SDimitry Andric 317*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 318*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) { 319*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 320*0fca6ea1SDimitry Andric try { 321*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 322*0fca6ea1SDimitry Andric sentry __s(*this); 323*0fca6ea1SDimitry Andric if (__s) { 324*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 325*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 326*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) 327*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 328*0fca6ea1SDimitry Andric } 329*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 330*0fca6ea1SDimitry Andric } catch (...) { 331*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 332*0fca6ea1SDimitry Andric } 333*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 334*0fca6ea1SDimitry Andric return *this; 335*0fca6ea1SDimitry Andric } 336*0fca6ea1SDimitry Andric 337*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 338*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long __n) { 339*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 340*0fca6ea1SDimitry Andric try { 341*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 342*0fca6ea1SDimitry Andric sentry __s(*this); 343*0fca6ea1SDimitry Andric if (__s) { 344*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 345*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 346*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 347*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 348*0fca6ea1SDimitry Andric } 349*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 350*0fca6ea1SDimitry Andric } catch (...) { 351*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 352*0fca6ea1SDimitry Andric } 353*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 354*0fca6ea1SDimitry Andric return *this; 355*0fca6ea1SDimitry Andric } 356*0fca6ea1SDimitry Andric 357*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 358*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) { 359*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 360*0fca6ea1SDimitry Andric try { 361*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 362*0fca6ea1SDimitry Andric sentry __s(*this); 363*0fca6ea1SDimitry Andric if (__s) { 364*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 365*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 366*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 367*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 368*0fca6ea1SDimitry Andric } 369*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 370*0fca6ea1SDimitry Andric } catch (...) { 371*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 372*0fca6ea1SDimitry Andric } 373*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 374*0fca6ea1SDimitry Andric return *this; 375*0fca6ea1SDimitry Andric } 376*0fca6ea1SDimitry Andric 377*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 378*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long long __n) { 379*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 380*0fca6ea1SDimitry Andric try { 381*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 382*0fca6ea1SDimitry Andric sentry __s(*this); 383*0fca6ea1SDimitry Andric if (__s) { 384*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 385*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 386*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 387*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 388*0fca6ea1SDimitry Andric } 389*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 390*0fca6ea1SDimitry Andric } catch (...) { 391*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 392*0fca6ea1SDimitry Andric } 393*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 394*0fca6ea1SDimitry Andric return *this; 395*0fca6ea1SDimitry Andric } 396*0fca6ea1SDimitry Andric 397*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 398*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) { 399*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 400*0fca6ea1SDimitry Andric try { 401*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 402*0fca6ea1SDimitry Andric sentry __s(*this); 403*0fca6ea1SDimitry Andric if (__s) { 404*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 405*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 406*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 407*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 408*0fca6ea1SDimitry Andric } 409*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 410*0fca6ea1SDimitry Andric } catch (...) { 411*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 412*0fca6ea1SDimitry Andric } 413*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 414*0fca6ea1SDimitry Andric return *this; 415*0fca6ea1SDimitry Andric } 416*0fca6ea1SDimitry Andric 417*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 418*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(float __n) { 419*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 420*0fca6ea1SDimitry Andric try { 421*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 422*0fca6ea1SDimitry Andric sentry __s(*this); 423*0fca6ea1SDimitry Andric if (__s) { 424*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 425*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 426*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed()) 427*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 428*0fca6ea1SDimitry Andric } 429*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 430*0fca6ea1SDimitry Andric } catch (...) { 431*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 432*0fca6ea1SDimitry Andric } 433*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 434*0fca6ea1SDimitry Andric return *this; 435*0fca6ea1SDimitry Andric } 436*0fca6ea1SDimitry Andric 437*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 438*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(double __n) { 439*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 440*0fca6ea1SDimitry Andric try { 441*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 442*0fca6ea1SDimitry Andric sentry __s(*this); 443*0fca6ea1SDimitry Andric if (__s) { 444*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 445*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 446*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 447*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 448*0fca6ea1SDimitry Andric } 449*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 450*0fca6ea1SDimitry Andric } catch (...) { 451*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 452*0fca6ea1SDimitry Andric } 453*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 454*0fca6ea1SDimitry Andric return *this; 455*0fca6ea1SDimitry Andric } 456*0fca6ea1SDimitry Andric 457*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 458*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long double __n) { 459*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 460*0fca6ea1SDimitry Andric try { 461*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 462*0fca6ea1SDimitry Andric sentry __s(*this); 463*0fca6ea1SDimitry Andric if (__s) { 464*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 465*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 466*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 467*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 468*0fca6ea1SDimitry Andric } 469*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 470*0fca6ea1SDimitry Andric } catch (...) { 471*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 472*0fca6ea1SDimitry Andric } 473*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 474*0fca6ea1SDimitry Andric return *this; 475*0fca6ea1SDimitry Andric } 476*0fca6ea1SDimitry Andric 477*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 478*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(const void* __n) { 479*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 480*0fca6ea1SDimitry Andric try { 481*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 482*0fca6ea1SDimitry Andric sentry __s(*this); 483*0fca6ea1SDimitry Andric if (__s) { 484*0fca6ea1SDimitry Andric typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 485*0fca6ea1SDimitry Andric const _Fp& __f = std::use_facet<_Fp>(this->getloc()); 486*0fca6ea1SDimitry Andric if (__f.put(*this, *this, this->fill(), __n).failed()) 487*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit | ios_base::failbit); 488*0fca6ea1SDimitry Andric } 489*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 490*0fca6ea1SDimitry Andric } catch (...) { 491*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 492*0fca6ea1SDimitry Andric } 493*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 494*0fca6ea1SDimitry Andric return *this; 495*0fca6ea1SDimitry Andric } 496*0fca6ea1SDimitry Andric 497*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 498*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 499*0fca6ea1SDimitry Andric __put_character_sequence(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str, size_t __len) { 500*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 501*0fca6ea1SDimitry Andric try { 502*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 503*0fca6ea1SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 504*0fca6ea1SDimitry Andric if (__s) { 505*0fca6ea1SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 506*0fca6ea1SDimitry Andric if (std::__pad_and_output( 507*0fca6ea1SDimitry Andric _Ip(__os), 508*0fca6ea1SDimitry Andric __str, 509*0fca6ea1SDimitry Andric (__os.flags() & ios_base::adjustfield) == ios_base::left ? __str + __len : __str, 510*0fca6ea1SDimitry Andric __str + __len, 511*0fca6ea1SDimitry Andric __os, 512*0fca6ea1SDimitry Andric __os.fill()) 513*0fca6ea1SDimitry Andric .failed()) 514*0fca6ea1SDimitry Andric __os.setstate(ios_base::badbit | ios_base::failbit); 515*0fca6ea1SDimitry Andric } 516*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 517*0fca6ea1SDimitry Andric } catch (...) { 518*0fca6ea1SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 519*0fca6ea1SDimitry Andric } 520*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 521*0fca6ea1SDimitry Andric return __os; 522*0fca6ea1SDimitry Andric } 523*0fca6ea1SDimitry Andric 524*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 525*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) { 526*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, &__c, 1); 527*0fca6ea1SDimitry Andric } 528*0fca6ea1SDimitry Andric 529*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 530*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) { 531*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 532*0fca6ea1SDimitry Andric try { 533*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 534*0fca6ea1SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 535*0fca6ea1SDimitry Andric if (__s) { 536*0fca6ea1SDimitry Andric _CharT __c = __os.widen(__cn); 537*0fca6ea1SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 538*0fca6ea1SDimitry Andric if (std::__pad_and_output( 539*0fca6ea1SDimitry Andric _Ip(__os), 540*0fca6ea1SDimitry Andric &__c, 541*0fca6ea1SDimitry Andric (__os.flags() & ios_base::adjustfield) == ios_base::left ? &__c + 1 : &__c, 542*0fca6ea1SDimitry Andric &__c + 1, 543*0fca6ea1SDimitry Andric __os, 544*0fca6ea1SDimitry Andric __os.fill()) 545*0fca6ea1SDimitry Andric .failed()) 546*0fca6ea1SDimitry Andric __os.setstate(ios_base::badbit | ios_base::failbit); 547*0fca6ea1SDimitry Andric } 548*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 549*0fca6ea1SDimitry Andric } catch (...) { 550*0fca6ea1SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 551*0fca6ea1SDimitry Andric } 552*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 553*0fca6ea1SDimitry Andric return __os; 554*0fca6ea1SDimitry Andric } 555*0fca6ea1SDimitry Andric 556*0fca6ea1SDimitry Andric template <class _Traits> 557*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, char __c) { 558*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, &__c, 1); 559*0fca6ea1SDimitry Andric } 560*0fca6ea1SDimitry Andric 561*0fca6ea1SDimitry Andric template <class _Traits> 562*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, signed char __c) { 563*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, (char*)&__c, 1); 564*0fca6ea1SDimitry Andric } 565*0fca6ea1SDimitry Andric 566*0fca6ea1SDimitry Andric template <class _Traits> 567*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) { 568*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, (char*)&__c, 1); 569*0fca6ea1SDimitry Andric } 570*0fca6ea1SDimitry Andric 571*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 572*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 573*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) { 574*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, __str, _Traits::length(__str)); 575*0fca6ea1SDimitry Andric } 576*0fca6ea1SDimitry Andric 577*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 578*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 579*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) { 580*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 581*0fca6ea1SDimitry Andric try { 582*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 583*0fca6ea1SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 584*0fca6ea1SDimitry Andric if (__s) { 585*0fca6ea1SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 586*0fca6ea1SDimitry Andric size_t __len = char_traits<char>::length(__strn); 587*0fca6ea1SDimitry Andric const int __bs = 100; 588*0fca6ea1SDimitry Andric _CharT __wbb[__bs]; 589*0fca6ea1SDimitry Andric _CharT* __wb = __wbb; 590*0fca6ea1SDimitry Andric unique_ptr<_CharT, void (*)(void*)> __h(0, free); 591*0fca6ea1SDimitry Andric if (__len > __bs) { 592*0fca6ea1SDimitry Andric __wb = (_CharT*)malloc(__len * sizeof(_CharT)); 593*0fca6ea1SDimitry Andric if (__wb == 0) 594*0fca6ea1SDimitry Andric __throw_bad_alloc(); 595*0fca6ea1SDimitry Andric __h.reset(__wb); 596*0fca6ea1SDimitry Andric } 597*0fca6ea1SDimitry Andric for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p) 598*0fca6ea1SDimitry Andric *__p = __os.widen(*__strn); 599*0fca6ea1SDimitry Andric if (std::__pad_and_output( 600*0fca6ea1SDimitry Andric _Ip(__os), 601*0fca6ea1SDimitry Andric __wb, 602*0fca6ea1SDimitry Andric (__os.flags() & ios_base::adjustfield) == ios_base::left ? __wb + __len : __wb, 603*0fca6ea1SDimitry Andric __wb + __len, 604*0fca6ea1SDimitry Andric __os, 605*0fca6ea1SDimitry Andric __os.fill()) 606*0fca6ea1SDimitry Andric .failed()) 607*0fca6ea1SDimitry Andric __os.setstate(ios_base::badbit | ios_base::failbit); 608*0fca6ea1SDimitry Andric } 609*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 610*0fca6ea1SDimitry Andric } catch (...) { 611*0fca6ea1SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 612*0fca6ea1SDimitry Andric } 613*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 614*0fca6ea1SDimitry Andric return __os; 615*0fca6ea1SDimitry Andric } 616*0fca6ea1SDimitry Andric 617*0fca6ea1SDimitry Andric template <class _Traits> 618*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& __os, const char* __str) { 619*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, __str, _Traits::length(__str)); 620*0fca6ea1SDimitry Andric } 621*0fca6ea1SDimitry Andric 622*0fca6ea1SDimitry Andric template <class _Traits> 623*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& 624*0fca6ea1SDimitry Andric operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) { 625*0fca6ea1SDimitry Andric const char* __s = (const char*)__str; 626*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, __s, _Traits::length(__s)); 627*0fca6ea1SDimitry Andric } 628*0fca6ea1SDimitry Andric 629*0fca6ea1SDimitry Andric template <class _Traits> 630*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<char, _Traits>& 631*0fca6ea1SDimitry Andric operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) { 632*0fca6ea1SDimitry Andric const char* __s = (const char*)__str; 633*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, __s, _Traits::length(__s)); 634*0fca6ea1SDimitry Andric } 635*0fca6ea1SDimitry Andric 636*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 637*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::put(char_type __c) { 638*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 639*0fca6ea1SDimitry Andric try { 640*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 641*0fca6ea1SDimitry Andric sentry __s(*this); 642*0fca6ea1SDimitry Andric if (__s) { 643*0fca6ea1SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 644*0fca6ea1SDimitry Andric _Op __o(*this); 645*0fca6ea1SDimitry Andric *__o = __c; 646*0fca6ea1SDimitry Andric if (__o.failed()) 647*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit); 648*0fca6ea1SDimitry Andric } 649*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 650*0fca6ea1SDimitry Andric } catch (...) { 651*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 652*0fca6ea1SDimitry Andric } 653*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 654*0fca6ea1SDimitry Andric return *this; 655*0fca6ea1SDimitry Andric } 656*0fca6ea1SDimitry Andric 657*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 658*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) { 659*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 660*0fca6ea1SDimitry Andric try { 661*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 662*0fca6ea1SDimitry Andric sentry __sen(*this); 663*0fca6ea1SDimitry Andric if (__sen && __n) { 664*0fca6ea1SDimitry Andric if (this->rdbuf()->sputn(__s, __n) != __n) 665*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit); 666*0fca6ea1SDimitry Andric } 667*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 668*0fca6ea1SDimitry Andric } catch (...) { 669*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 670*0fca6ea1SDimitry Andric } 671*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 672*0fca6ea1SDimitry Andric return *this; 673*0fca6ea1SDimitry Andric } 674*0fca6ea1SDimitry Andric 675*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 676*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::flush() { 677*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 678*0fca6ea1SDimitry Andric try { 679*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 680*0fca6ea1SDimitry Andric if (this->rdbuf()) { 681*0fca6ea1SDimitry Andric sentry __s(*this); 682*0fca6ea1SDimitry Andric if (__s) { 683*0fca6ea1SDimitry Andric if (this->rdbuf()->pubsync() == -1) 684*0fca6ea1SDimitry Andric this->setstate(ios_base::badbit); 685*0fca6ea1SDimitry Andric } 686*0fca6ea1SDimitry Andric } 687*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_EXCEPTIONS 688*0fca6ea1SDimitry Andric } catch (...) { 689*0fca6ea1SDimitry Andric this->__set_badbit_and_consider_rethrow(); 690*0fca6ea1SDimitry Andric } 691*0fca6ea1SDimitry Andric #endif // _LIBCPP_HAS_NO_EXCEPTIONS 692*0fca6ea1SDimitry Andric return *this; 693*0fca6ea1SDimitry Andric } 694*0fca6ea1SDimitry Andric 695*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 696*0fca6ea1SDimitry Andric typename basic_ostream<_CharT, _Traits>::pos_type basic_ostream<_CharT, _Traits>::tellp() { 697*0fca6ea1SDimitry Andric if (this->fail()) 698*0fca6ea1SDimitry Andric return pos_type(-1); 699*0fca6ea1SDimitry Andric return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); 700*0fca6ea1SDimitry Andric } 701*0fca6ea1SDimitry Andric 702*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 703*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) { 704*0fca6ea1SDimitry Andric sentry __s(*this); 705*0fca6ea1SDimitry Andric if (!this->fail()) { 706*0fca6ea1SDimitry Andric if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1)) 707*0fca6ea1SDimitry Andric this->setstate(ios_base::failbit); 708*0fca6ea1SDimitry Andric } 709*0fca6ea1SDimitry Andric return *this; 710*0fca6ea1SDimitry Andric } 711*0fca6ea1SDimitry Andric 712*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 713*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) { 714*0fca6ea1SDimitry Andric sentry __s(*this); 715*0fca6ea1SDimitry Andric if (!this->fail()) { 716*0fca6ea1SDimitry Andric if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1)) 717*0fca6ea1SDimitry Andric this->setstate(ios_base::failbit); 718*0fca6ea1SDimitry Andric } 719*0fca6ea1SDimitry Andric return *this; 720*0fca6ea1SDimitry Andric } 721*0fca6ea1SDimitry Andric 722*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 723*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os) { 724*0fca6ea1SDimitry Andric __os.put(__os.widen('\n')); 725*0fca6ea1SDimitry Andric __os.flush(); 726*0fca6ea1SDimitry Andric return __os; 727*0fca6ea1SDimitry Andric } 728*0fca6ea1SDimitry Andric 729*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 730*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& ends(basic_ostream<_CharT, _Traits>& __os) { 731*0fca6ea1SDimitry Andric __os.put(_CharT()); 732*0fca6ea1SDimitry Andric return __os; 733*0fca6ea1SDimitry Andric } 734*0fca6ea1SDimitry Andric 735*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 736*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI inline basic_ostream<_CharT, _Traits>& flush(basic_ostream<_CharT, _Traits>& __os) { 737*0fca6ea1SDimitry Andric __os.flush(); 738*0fca6ea1SDimitry Andric return __os; 739*0fca6ea1SDimitry Andric } 740*0fca6ea1SDimitry Andric 741*0fca6ea1SDimitry Andric template <class _Stream, class _Tp, class = void> 742*0fca6ea1SDimitry Andric struct __is_ostreamable : false_type {}; 743*0fca6ea1SDimitry Andric 744*0fca6ea1SDimitry Andric template <class _Stream, class _Tp> 745*0fca6ea1SDimitry Andric struct __is_ostreamable<_Stream, _Tp, decltype(std::declval<_Stream>() << std::declval<_Tp>(), void())> : true_type {}; 746*0fca6ea1SDimitry Andric 747*0fca6ea1SDimitry Andric template <class _Stream, 748*0fca6ea1SDimitry Andric class _Tp, 749*0fca6ea1SDimitry Andric __enable_if_t<_And<is_base_of<ios_base, _Stream>, __is_ostreamable<_Stream&, const _Tp&> >::value, int> = 0> 750*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI _Stream&& operator<<(_Stream&& __os, const _Tp& __x) { 751*0fca6ea1SDimitry Andric __os << __x; 752*0fca6ea1SDimitry Andric return std::move(__os); 753*0fca6ea1SDimitry Andric } 754*0fca6ea1SDimitry Andric 755*0fca6ea1SDimitry Andric template <class _CharT, class _Traits, class _Allocator> 756*0fca6ea1SDimitry Andric basic_ostream<_CharT, _Traits>& 757*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const basic_string<_CharT, _Traits, _Allocator>& __str) { 758*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, __str.data(), __str.size()); 759*0fca6ea1SDimitry Andric } 760*0fca6ea1SDimitry Andric 761*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 762*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 763*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, basic_string_view<_CharT, _Traits> __sv) { 764*0fca6ea1SDimitry Andric return std::__put_character_sequence(__os, __sv.data(), __sv.size()); 765*0fca6ea1SDimitry Andric } 766*0fca6ea1SDimitry Andric 767*0fca6ea1SDimitry Andric template <class _CharT, class _Traits> 768*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 769*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) { 770*0fca6ea1SDimitry Andric return __os << __ec.category().name() << ':' << __ec.value(); 771*0fca6ea1SDimitry Andric } 772*0fca6ea1SDimitry Andric 773*0fca6ea1SDimitry Andric template <class _CharT, class _Traits, class _Yp> 774*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 775*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) { 776*0fca6ea1SDimitry Andric return __os << __p.get(); 777*0fca6ea1SDimitry Andric } 778*0fca6ea1SDimitry Andric 779*0fca6ea1SDimitry Andric template < 780*0fca6ea1SDimitry Andric class _CharT, 781*0fca6ea1SDimitry Andric class _Traits, 782*0fca6ea1SDimitry Andric class _Yp, 783*0fca6ea1SDimitry Andric class _Dp, 784*0fca6ea1SDimitry Andric __enable_if_t<is_same<void, 785*0fca6ea1SDimitry Andric __void_t<decltype((std::declval<basic_ostream<_CharT, _Traits>&>() 786*0fca6ea1SDimitry Andric << std::declval<typename unique_ptr<_Yp, _Dp>::pointer>()))> >::value, 787*0fca6ea1SDimitry Andric int> = 0> 788*0fca6ea1SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 789*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p) { 790*0fca6ea1SDimitry Andric return __os << __p.get(); 791*0fca6ea1SDimitry Andric } 792*0fca6ea1SDimitry Andric 793*0fca6ea1SDimitry Andric template <class _CharT, class _Traits, size_t _Size> 794*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 795*0fca6ea1SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) { 796*0fca6ea1SDimitry Andric return __os << __x.template to_string<_CharT, _Traits>(std::use_facet<ctype<_CharT> >(__os.getloc()).widen('0'), 797*0fca6ea1SDimitry Andric std::use_facet<ctype<_CharT> >(__os.getloc()).widen('1')); 798*0fca6ea1SDimitry Andric } 799*0fca6ea1SDimitry Andric 800*0fca6ea1SDimitry Andric #if _LIBCPP_STD_VER >= 20 801*0fca6ea1SDimitry Andric 802*0fca6ea1SDimitry Andric # ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 803*0fca6ea1SDimitry Andric template <class _Traits> 804*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete; 805*0fca6ea1SDimitry Andric 806*0fca6ea1SDimitry Andric template <class _Traits> 807*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete; 808*0fca6ea1SDimitry Andric 809*0fca6ea1SDimitry Andric template <class _Traits> 810*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete; 811*0fca6ea1SDimitry Andric 812*0fca6ea1SDimitry Andric template <class _Traits> 813*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete; 814*0fca6ea1SDimitry Andric 815*0fca6ea1SDimitry Andric template <class _Traits> 816*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete; 817*0fca6ea1SDimitry Andric 818*0fca6ea1SDimitry Andric template <class _Traits> 819*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete; 820*0fca6ea1SDimitry Andric 821*0fca6ea1SDimitry Andric # endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS 822*0fca6ea1SDimitry Andric 823*0fca6ea1SDimitry Andric # ifndef _LIBCPP_HAS_NO_CHAR8_T 824*0fca6ea1SDimitry Andric template <class _Traits> 825*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char8_t) = delete; 826*0fca6ea1SDimitry Andric 827*0fca6ea1SDimitry Andric template <class _Traits> 828*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete; 829*0fca6ea1SDimitry Andric 830*0fca6ea1SDimitry Andric template <class _Traits> 831*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete; 832*0fca6ea1SDimitry Andric 833*0fca6ea1SDimitry Andric template <class _Traits> 834*0fca6ea1SDimitry Andric basic_ostream<wchar_t, _Traits>& operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete; 835*0fca6ea1SDimitry Andric # endif 836*0fca6ea1SDimitry Andric 837*0fca6ea1SDimitry Andric template <class _Traits> 838*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char16_t) = delete; 839*0fca6ea1SDimitry Andric 840*0fca6ea1SDimitry Andric template <class _Traits> 841*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, char32_t) = delete; 842*0fca6ea1SDimitry Andric 843*0fca6ea1SDimitry Andric template <class _Traits> 844*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete; 845*0fca6ea1SDimitry Andric 846*0fca6ea1SDimitry Andric template <class _Traits> 847*0fca6ea1SDimitry Andric basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete; 848*0fca6ea1SDimitry Andric 849*0fca6ea1SDimitry Andric #endif // _LIBCPP_STD_VER >= 20 850*0fca6ea1SDimitry Andric 851*0fca6ea1SDimitry Andric extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>; 852*0fca6ea1SDimitry Andric #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 853*0fca6ea1SDimitry Andric extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>; 854*0fca6ea1SDimitry Andric #endif 855*0fca6ea1SDimitry Andric 856*0fca6ea1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 857*0fca6ea1SDimitry Andric 858*0fca6ea1SDimitry Andric _LIBCPP_POP_MACROS 859*0fca6ea1SDimitry Andric 860*0fca6ea1SDimitry Andric #endif // _LIBCPP___OSTREAM_BASIC_OSTREAM_H 861