Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===-------------------------- ostream -----------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_OSTREAM
     12 #define _LIBCPP_OSTREAM
     13 
     14 /*
     15     ostream synopsis
     16 
     17 template <class charT, class traits = char_traits<charT> >
     18 class basic_ostream
     19     : virtual public basic_ios<charT,traits>
     20 {
     21 public:
     22     // types (inherited from basic_ios (27.5.4)):
     23     typedef charT                          char_type;
     24     typedef traits                         traits_type;
     25     typedef typename traits_type::int_type int_type;
     26     typedef typename traits_type::pos_type pos_type;
     27     typedef typename traits_type::off_type off_type;
     28 
     29     // 27.7.2.2 Constructor/destructor:
     30     explicit basic_ostream(basic_streambuf<char_type,traits>* sb);
     31     basic_ostream(basic_ostream&& rhs);
     32     virtual ~basic_ostream();
     33 
     34     // 27.7.2.3 Assign/swap
     35     basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14
     36     basic_ostream& operator=(basic_ostream&& rhs);
     37     void swap(basic_ostream& rhs);
     38 
     39     // 27.7.2.4 Prefix/suffix:
     40     class sentry;
     41 
     42     // 27.7.2.6 Formatted output:
     43     basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&));
     44     basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&));
     45     basic_ostream& operator<<(ios_base& (*pf)(ios_base&));
     46     basic_ostream& operator<<(bool n);
     47     basic_ostream& operator<<(short n);
     48     basic_ostream& operator<<(unsigned short n);
     49     basic_ostream& operator<<(int n);
     50     basic_ostream& operator<<(unsigned int n);
     51     basic_ostream& operator<<(long n);
     52     basic_ostream& operator<<(unsigned long n);
     53     basic_ostream& operator<<(long long n);
     54     basic_ostream& operator<<(unsigned long long n);
     55     basic_ostream& operator<<(float f);
     56     basic_ostream& operator<<(double f);
     57     basic_ostream& operator<<(long double f);
     58     basic_ostream& operator<<(const void* p);
     59     basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb);
     60 
     61     // 27.7.2.7 Unformatted output:
     62     basic_ostream& put(char_type c);
     63     basic_ostream& write(const char_type* s, streamsize n);
     64     basic_ostream& flush();
     65 
     66     // 27.7.2.5 seeks:
     67     pos_type tellp();
     68     basic_ostream& seekp(pos_type);
     69     basic_ostream& seekp(off_type, ios_base::seekdir);
     70 protected:
     71     basic_ostream(const basic_ostream& rhs) = delete;
     72     basic_ostream(basic_ostream&& rhs);
     73     // 27.7.3.3 Assign/swap
     74     basic_ostream& operator=(basic_ostream& rhs) = delete;
     75     basic_ostream& operator=(const basic_ostream&& rhs);
     76     void swap(basic_ostream& rhs);
     77 };
     78 
     79 // 27.7.2.6.4 character inserters
     80 
     81 template<class charT, class traits>
     82   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT);
     83 
     84 template<class charT, class traits>
     85   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char);
     86 
     87 template<class traits>
     88   basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char);
     89 
     90 // signed and unsigned
     91 
     92 template<class traits>
     93   basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char);
     94 
     95 template<class traits>
     96   basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char);
     97 
     98 // NTBS
     99 template<class charT, class traits>
    100   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
    101 
    102 template<class charT, class traits>
    103   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*);
    104 
    105 template<class traits>
    106   basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*);
    107 
    108 // signed and unsigned
    109 template<class traits>
    110 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*);
    111 
    112 template<class traits>
    113   basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*);
    114 
    115 // swap:
    116 template <class charT, class traits>
    117   void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);
    118 
    119 template <class charT, class traits>
    120   basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
    121 
    122 template <class charT, class traits>
    123   basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
    124 
    125 template <class charT, class traits>
    126   basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
    127 
    128 // rvalue stream insertion
    129 template <class charT, class traits, class T>
    130   basic_ostream<charT, traits>&
    131   operator<<(basic_ostream<charT, traits>&& os, const T& x);
    132 
    133 }  // std
    134 
    135 */
    136 
    137 #include <__config>
    138 #include <ios>
    139 #include <streambuf>
    140 #include <locale>
    141 #include <iterator>
    142 #include <bitset>
    143 #include <version>
    144 
    145 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    146 #pragma GCC system_header
    147 #endif
    148 
    149 _LIBCPP_BEGIN_NAMESPACE_STD
    150 
    151 template <class _CharT, class _Traits>
    152 class _LIBCPP_TEMPLATE_VIS basic_ostream
    153     : virtual public basic_ios<_CharT, _Traits>
    154 {
    155 public:
    156     // types (inherited from basic_ios (27.5.4)):
    157     typedef _CharT                         char_type;
    158     typedef _Traits                        traits_type;
    159     typedef typename traits_type::int_type int_type;
    160     typedef typename traits_type::pos_type pos_type;
    161     typedef typename traits_type::off_type off_type;
    162 
    163     // 27.7.2.2 Constructor/destructor:
    164     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    165     explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb)
    166     { this->init(__sb); }
    167     virtual ~basic_ostream();
    168 protected:
    169 #ifndef _LIBCPP_CXX03_LANG
    170     inline _LIBCPP_INLINE_VISIBILITY
    171     basic_ostream(basic_ostream&& __rhs);
    172 
    173     // 27.7.2.3 Assign/swap
    174     inline _LIBCPP_INLINE_VISIBILITY
    175     basic_ostream& operator=(basic_ostream&& __rhs);
    176 #endif
    177     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    178     void swap(basic_ostream& __rhs)
    179     { basic_ios<char_type, traits_type>::swap(__rhs); }
    180 
    181 #ifndef _LIBCPP_CXX03_LANG
    182     basic_ostream           (const basic_ostream& __rhs) = delete;
    183     basic_ostream& operator=(const basic_ostream& __rhs) = delete;
    184 #else
    185     basic_ostream           (const basic_ostream& __rhs); // not defined
    186     basic_ostream& operator=(const basic_ostream& __rhs); // not defined
    187 #endif
    188 public:
    189 
    190     // 27.7.2.4 Prefix/suffix:
    191     class _LIBCPP_TEMPLATE_VIS sentry;
    192 
    193     // 27.7.2.6 Formatted output:
    194     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    195     basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&))
    196     { return __pf(*this); }
    197 
    198     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    199     basic_ostream& operator<<(basic_ios<char_type, traits_type>&
    200                               (*__pf)(basic_ios<char_type,traits_type>&))
    201     { __pf(*this); return *this; }
    202 
    203     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    204     basic_ostream& operator<<(ios_base& (*__pf)(ios_base&))
    205     { __pf(*this); return *this; }
    206 
    207     basic_ostream& operator<<(bool __n);
    208     basic_ostream& operator<<(short __n);
    209     basic_ostream& operator<<(unsigned short __n);
    210     basic_ostream& operator<<(int __n);
    211     basic_ostream& operator<<(unsigned int __n);
    212     basic_ostream& operator<<(long __n);
    213     basic_ostream& operator<<(unsigned long __n);
    214     basic_ostream& operator<<(long long __n);
    215     basic_ostream& operator<<(unsigned long long __n);
    216     basic_ostream& operator<<(float __f);
    217     basic_ostream& operator<<(double __f);
    218     basic_ostream& operator<<(long double __f);
    219     basic_ostream& operator<<(const void* __p);
    220     basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);
    221 
    222     // 27.7.2.7 Unformatted output:
    223     basic_ostream& put(char_type __c);
    224     basic_ostream& write(const char_type* __s, streamsize __n);
    225     basic_ostream& flush();
    226 
    227     // 27.7.2.5 seeks:
    228     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    229     pos_type tellp();
    230     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    231     basic_ostream& seekp(pos_type __pos);
    232     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    233     basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
    234 
    235 protected:
    236     _LIBCPP_INLINE_VISIBILITY
    237     basic_ostream() {}  // extension, intentially does not initialize
    238 };
    239 
    240 template <class _CharT, class _Traits>
    241 class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry
    242 {
    243     bool __ok_;
    244     basic_ostream<_CharT, _Traits>& __os_;
    245 
    246     sentry(const sentry&); // = delete;
    247     sentry& operator=(const sentry&); // = delete;
    248 
    249 public:
    250     explicit sentry(basic_ostream<_CharT, _Traits>& __os);
    251     ~sentry();
    252 
    253     _LIBCPP_INLINE_VISIBILITY
    254         _LIBCPP_EXPLICIT
    255         operator bool() const {return __ok_;}
    256 };
    257 
    258 template <class _CharT, class _Traits>
    259 basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os)
    260     : __ok_(false),
    261       __os_(__os)
    262 {
    263     if (__os.good())
    264     {
    265         if (__os.tie())
    266             __os.tie()->flush();
    267         __ok_ = true;
    268     }
    269 }
    270 
    271 template <class _CharT, class _Traits>
    272 basic_ostream<_CharT, _Traits>::sentry::~sentry()
    273 {
    274     if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf)
    275                       && !uncaught_exception())
    276     {
    277 #ifndef _LIBCPP_NO_EXCEPTIONS
    278         try
    279         {
    280 #endif  // _LIBCPP_NO_EXCEPTIONS
    281             if (__os_.rdbuf()->pubsync() == -1)
    282                 __os_.setstate(ios_base::badbit);
    283 #ifndef _LIBCPP_NO_EXCEPTIONS
    284         }
    285         catch (...)
    286         {
    287         }
    288 #endif  // _LIBCPP_NO_EXCEPTIONS
    289     }
    290 }
    291 
    292 #ifndef _LIBCPP_CXX03_LANG
    293 
    294 template <class _CharT, class _Traits>
    295 basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs)
    296 {
    297     this->move(__rhs);
    298 }
    299 
    300 template <class _CharT, class _Traits>
    301 basic_ostream<_CharT, _Traits>&
    302 basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs)
    303 {
    304     swap(__rhs);
    305     return *this;
    306 }
    307 
    308 #endif  // _LIBCPP_CXX03_LANG
    309 
    310 template <class _CharT, class _Traits>
    311 basic_ostream<_CharT, _Traits>::~basic_ostream()
    312 {
    313 }
    314 
    315 template <class _CharT, class _Traits>
    316 basic_ostream<_CharT, _Traits>&
    317 basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb)
    318 {
    319 #ifndef _LIBCPP_NO_EXCEPTIONS
    320     try
    321     {
    322 #endif  // _LIBCPP_NO_EXCEPTIONS
    323         sentry __s(*this);
    324         if (__s)
    325         {
    326             if (__sb)
    327             {
    328 #ifndef _LIBCPP_NO_EXCEPTIONS
    329                 try
    330                 {
    331 #endif  // _LIBCPP_NO_EXCEPTIONS
    332                     typedef istreambuf_iterator<_CharT, _Traits> _Ip;
    333                     typedef ostreambuf_iterator<_CharT, _Traits> _Op;
    334                     _Ip __i(__sb);
    335                     _Ip __eof;
    336                     _Op __o(*this);
    337                     size_t __c = 0;
    338                     for (; __i != __eof; ++__i, ++__o, ++__c)
    339                     {
    340                         *__o = *__i;
    341                         if (__o.failed())
    342                             break;
    343                     }
    344                     if (__c == 0)
    345                         this->setstate(ios_base::failbit);
    346 #ifndef _LIBCPP_NO_EXCEPTIONS
    347                 }
    348                 catch (...)
    349                 {
    350                     this->__set_failbit_and_consider_rethrow();
    351                 }
    352 #endif  // _LIBCPP_NO_EXCEPTIONS
    353             }
    354             else
    355                 this->setstate(ios_base::badbit);
    356         }
    357 #ifndef _LIBCPP_NO_EXCEPTIONS
    358     }
    359     catch (...)
    360     {
    361         this->__set_badbit_and_consider_rethrow();
    362     }
    363 #endif  // _LIBCPP_NO_EXCEPTIONS
    364     return *this;
    365 }
    366 
    367 template <class _CharT, class _Traits>
    368 basic_ostream<_CharT, _Traits>&
    369 basic_ostream<_CharT, _Traits>::operator<<(bool __n)
    370 {
    371 #ifndef _LIBCPP_NO_EXCEPTIONS
    372     try
    373     {
    374 #endif  // _LIBCPP_NO_EXCEPTIONS
    375         sentry __s(*this);
    376         if (__s)
    377         {
    378             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    379             const _Fp& __f = use_facet<_Fp>(this->getloc());
    380             if (__f.put(*this, *this, this->fill(), __n).failed())
    381                 this->setstate(ios_base::badbit | ios_base::failbit);
    382         }
    383 #ifndef _LIBCPP_NO_EXCEPTIONS
    384     }
    385     catch (...)
    386     {
    387         this->__set_badbit_and_consider_rethrow();
    388     }
    389 #endif  // _LIBCPP_NO_EXCEPTIONS
    390     return *this;
    391 }
    392 
    393 template <class _CharT, class _Traits>
    394 basic_ostream<_CharT, _Traits>&
    395 basic_ostream<_CharT, _Traits>::operator<<(short __n)
    396 {
    397 #ifndef _LIBCPP_NO_EXCEPTIONS
    398     try
    399     {
    400 #endif  // _LIBCPP_NO_EXCEPTIONS
    401         sentry __s(*this);
    402         if (__s)
    403         {
    404             ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
    405             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    406             const _Fp& __f = use_facet<_Fp>(this->getloc());
    407             if (__f.put(*this, *this, this->fill(),
    408                         __flags == ios_base::oct || __flags == ios_base::hex ?
    409                         static_cast<long>(static_cast<unsigned short>(__n))  :
    410                         static_cast<long>(__n)).failed())
    411                 this->setstate(ios_base::badbit | ios_base::failbit);
    412         }
    413 #ifndef _LIBCPP_NO_EXCEPTIONS
    414     }
    415     catch (...)
    416     {
    417         this->__set_badbit_and_consider_rethrow();
    418     }
    419 #endif  // _LIBCPP_NO_EXCEPTIONS
    420     return *this;
    421 }
    422 
    423 template <class _CharT, class _Traits>
    424 basic_ostream<_CharT, _Traits>&
    425 basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n)
    426 {
    427 #ifndef _LIBCPP_NO_EXCEPTIONS
    428     try
    429     {
    430 #endif  // _LIBCPP_NO_EXCEPTIONS
    431         sentry __s(*this);
    432         if (__s)
    433         {
    434             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    435             const _Fp& __f = use_facet<_Fp>(this->getloc());
    436             if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
    437                 this->setstate(ios_base::badbit | ios_base::failbit);
    438         }
    439 #ifndef _LIBCPP_NO_EXCEPTIONS
    440     }
    441     catch (...)
    442     {
    443         this->__set_badbit_and_consider_rethrow();
    444     }
    445 #endif  // _LIBCPP_NO_EXCEPTIONS
    446     return *this;
    447 }
    448 
    449 template <class _CharT, class _Traits>
    450 basic_ostream<_CharT, _Traits>&
    451 basic_ostream<_CharT, _Traits>::operator<<(int __n)
    452 {
    453 #ifndef _LIBCPP_NO_EXCEPTIONS
    454     try
    455     {
    456 #endif  // _LIBCPP_NO_EXCEPTIONS
    457         sentry __s(*this);
    458         if (__s)
    459         {
    460             ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
    461             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    462             const _Fp& __f = use_facet<_Fp>(this->getloc());
    463             if (__f.put(*this, *this, this->fill(),
    464                         __flags == ios_base::oct || __flags == ios_base::hex ?
    465                         static_cast<long>(static_cast<unsigned int>(__n))  :
    466                         static_cast<long>(__n)).failed())
    467                 this->setstate(ios_base::badbit | ios_base::failbit);
    468         }
    469 #ifndef _LIBCPP_NO_EXCEPTIONS
    470     }
    471     catch (...)
    472     {
    473         this->__set_badbit_and_consider_rethrow();
    474     }
    475 #endif  // _LIBCPP_NO_EXCEPTIONS
    476     return *this;
    477 }
    478 
    479 template <class _CharT, class _Traits>
    480 basic_ostream<_CharT, _Traits>&
    481 basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n)
    482 {
    483 #ifndef _LIBCPP_NO_EXCEPTIONS
    484     try
    485     {
    486 #endif  // _LIBCPP_NO_EXCEPTIONS
    487         sentry __s(*this);
    488         if (__s)
    489         {
    490             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    491             const _Fp& __f = use_facet<_Fp>(this->getloc());
    492             if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
    493                 this->setstate(ios_base::badbit | ios_base::failbit);
    494         }
    495 #ifndef _LIBCPP_NO_EXCEPTIONS
    496     }
    497     catch (...)
    498     {
    499         this->__set_badbit_and_consider_rethrow();
    500     }
    501 #endif  // _LIBCPP_NO_EXCEPTIONS
    502     return *this;
    503 }
    504 
    505 template <class _CharT, class _Traits>
    506 basic_ostream<_CharT, _Traits>&
    507 basic_ostream<_CharT, _Traits>::operator<<(long __n)
    508 {
    509 #ifndef _LIBCPP_NO_EXCEPTIONS
    510     try
    511     {
    512 #endif  // _LIBCPP_NO_EXCEPTIONS
    513         sentry __s(*this);
    514         if (__s)
    515         {
    516             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    517             const _Fp& __f = use_facet<_Fp>(this->getloc());
    518             if (__f.put(*this, *this, this->fill(), __n).failed())
    519                 this->setstate(ios_base::badbit | ios_base::failbit);
    520         }
    521 #ifndef _LIBCPP_NO_EXCEPTIONS
    522     }
    523     catch (...)
    524     {
    525         this->__set_badbit_and_consider_rethrow();
    526     }
    527 #endif  // _LIBCPP_NO_EXCEPTIONS
    528     return *this;
    529 }
    530 
    531 template <class _CharT, class _Traits>
    532 basic_ostream<_CharT, _Traits>&
    533 basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n)
    534 {
    535 #ifndef _LIBCPP_NO_EXCEPTIONS
    536     try
    537     {
    538 #endif  // _LIBCPP_NO_EXCEPTIONS
    539         sentry __s(*this);
    540         if (__s)
    541         {
    542             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    543             const _Fp& __f = use_facet<_Fp>(this->getloc());
    544             if (__f.put(*this, *this, this->fill(), __n).failed())
    545                 this->setstate(ios_base::badbit | ios_base::failbit);
    546         }
    547 #ifndef _LIBCPP_NO_EXCEPTIONS
    548     }
    549     catch (...)
    550     {
    551         this->__set_badbit_and_consider_rethrow();
    552     }
    553 #endif  // _LIBCPP_NO_EXCEPTIONS
    554     return *this;
    555 }
    556 
    557 template <class _CharT, class _Traits>
    558 basic_ostream<_CharT, _Traits>&
    559 basic_ostream<_CharT, _Traits>::operator<<(long long __n)
    560 {
    561 #ifndef _LIBCPP_NO_EXCEPTIONS
    562     try
    563     {
    564 #endif  // _LIBCPP_NO_EXCEPTIONS
    565         sentry __s(*this);
    566         if (__s)
    567         {
    568             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    569             const _Fp& __f = use_facet<_Fp>(this->getloc());
    570             if (__f.put(*this, *this, this->fill(), __n).failed())
    571                 this->setstate(ios_base::badbit | ios_base::failbit);
    572         }
    573 #ifndef _LIBCPP_NO_EXCEPTIONS
    574     }
    575     catch (...)
    576     {
    577         this->__set_badbit_and_consider_rethrow();
    578     }
    579 #endif  // _LIBCPP_NO_EXCEPTIONS
    580     return *this;
    581 }
    582 
    583 template <class _CharT, class _Traits>
    584 basic_ostream<_CharT, _Traits>&
    585 basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n)
    586 {
    587 #ifndef _LIBCPP_NO_EXCEPTIONS
    588     try
    589     {
    590 #endif  // _LIBCPP_NO_EXCEPTIONS
    591         sentry __s(*this);
    592         if (__s)
    593         {
    594             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    595             const _Fp& __f = use_facet<_Fp>(this->getloc());
    596             if (__f.put(*this, *this, this->fill(), __n).failed())
    597                 this->setstate(ios_base::badbit | ios_base::failbit);
    598         }
    599 #ifndef _LIBCPP_NO_EXCEPTIONS
    600     }
    601     catch (...)
    602     {
    603         this->__set_badbit_and_consider_rethrow();
    604     }
    605 #endif  // _LIBCPP_NO_EXCEPTIONS
    606     return *this;
    607 }
    608 
    609 template <class _CharT, class _Traits>
    610 basic_ostream<_CharT, _Traits>&
    611 basic_ostream<_CharT, _Traits>::operator<<(float __n)
    612 {
    613 #ifndef _LIBCPP_NO_EXCEPTIONS
    614     try
    615     {
    616 #endif  // _LIBCPP_NO_EXCEPTIONS
    617         sentry __s(*this);
    618         if (__s)
    619         {
    620             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    621             const _Fp& __f = use_facet<_Fp>(this->getloc());
    622             if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed())
    623                 this->setstate(ios_base::badbit | ios_base::failbit);
    624         }
    625 #ifndef _LIBCPP_NO_EXCEPTIONS
    626     }
    627     catch (...)
    628     {
    629         this->__set_badbit_and_consider_rethrow();
    630     }
    631 #endif  // _LIBCPP_NO_EXCEPTIONS
    632     return *this;
    633 }
    634 
    635 template <class _CharT, class _Traits>
    636 basic_ostream<_CharT, _Traits>&
    637 basic_ostream<_CharT, _Traits>::operator<<(double __n)
    638 {
    639 #ifndef _LIBCPP_NO_EXCEPTIONS
    640     try
    641     {
    642 #endif  // _LIBCPP_NO_EXCEPTIONS
    643         sentry __s(*this);
    644         if (__s)
    645         {
    646             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    647             const _Fp& __f = use_facet<_Fp>(this->getloc());
    648             if (__f.put(*this, *this, this->fill(), __n).failed())
    649                 this->setstate(ios_base::badbit | ios_base::failbit);
    650         }
    651 #ifndef _LIBCPP_NO_EXCEPTIONS
    652     }
    653     catch (...)
    654     {
    655         this->__set_badbit_and_consider_rethrow();
    656     }
    657 #endif  // _LIBCPP_NO_EXCEPTIONS
    658     return *this;
    659 }
    660 
    661 template <class _CharT, class _Traits>
    662 basic_ostream<_CharT, _Traits>&
    663 basic_ostream<_CharT, _Traits>::operator<<(long double __n)
    664 {
    665 #ifndef _LIBCPP_NO_EXCEPTIONS
    666     try
    667     {
    668 #endif  // _LIBCPP_NO_EXCEPTIONS
    669         sentry __s(*this);
    670         if (__s)
    671         {
    672             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    673             const _Fp& __f = use_facet<_Fp>(this->getloc());
    674             if (__f.put(*this, *this, this->fill(), __n).failed())
    675                 this->setstate(ios_base::badbit | ios_base::failbit);
    676         }
    677 #ifndef _LIBCPP_NO_EXCEPTIONS
    678     }
    679     catch (...)
    680     {
    681         this->__set_badbit_and_consider_rethrow();
    682     }
    683 #endif  // _LIBCPP_NO_EXCEPTIONS
    684     return *this;
    685 }
    686 
    687 template <class _CharT, class _Traits>
    688 basic_ostream<_CharT, _Traits>&
    689 basic_ostream<_CharT, _Traits>::operator<<(const void* __n)
    690 {
    691 #ifndef _LIBCPP_NO_EXCEPTIONS
    692     try
    693     {
    694 #endif  // _LIBCPP_NO_EXCEPTIONS
    695         sentry __s(*this);
    696         if (__s)
    697         {
    698             typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
    699             const _Fp& __f = use_facet<_Fp>(this->getloc());
    700             if (__f.put(*this, *this, this->fill(), __n).failed())
    701                 this->setstate(ios_base::badbit | ios_base::failbit);
    702         }
    703 #ifndef _LIBCPP_NO_EXCEPTIONS
    704     }
    705     catch (...)
    706     {
    707         this->__set_badbit_and_consider_rethrow();
    708     }
    709 #endif  // _LIBCPP_NO_EXCEPTIONS
    710     return *this;
    711 }
    712 
    713 template<class _CharT, class _Traits>
    714 basic_ostream<_CharT, _Traits>&
    715 __put_character_sequence(basic_ostream<_CharT, _Traits>& __os,
    716                           const _CharT* __str, size_t __len)
    717 {
    718 #ifndef _LIBCPP_NO_EXCEPTIONS
    719     try
    720     {
    721 #endif  // _LIBCPP_NO_EXCEPTIONS
    722         typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
    723         if (__s)
    724         {
    725             typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
    726             if (__pad_and_output(_Ip(__os),
    727                                  __str,
    728                                  (__os.flags() & ios_base::adjustfield) == ios_base::left ?
    729                                      __str + __len :
    730                                      __str,
    731                                  __str + __len,
    732                                  __os,
    733                                  __os.fill()).failed())
    734                 __os.setstate(ios_base::badbit | ios_base::failbit);
    735         }
    736 #ifndef _LIBCPP_NO_EXCEPTIONS
    737     }
    738     catch (...)
    739     {
    740         __os.__set_badbit_and_consider_rethrow();
    741     }
    742 #endif  // _LIBCPP_NO_EXCEPTIONS
    743     return __os;
    744 }
    745 
    746 
    747 template<class _CharT, class _Traits>
    748 basic_ostream<_CharT, _Traits>&
    749 operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c)
    750 {
    751     return _VSTD::__put_character_sequence(__os, &__c, 1);
    752 }
    753 
    754 template<class _CharT, class _Traits>
    755 basic_ostream<_CharT, _Traits>&
    756 operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
    757 {
    758 #ifndef _LIBCPP_NO_EXCEPTIONS
    759     try
    760     {
    761 #endif  // _LIBCPP_NO_EXCEPTIONS
    762         typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
    763         if (__s)
    764         {
    765             _CharT __c = __os.widen(__cn);
    766             typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
    767             if (__pad_and_output(_Ip(__os),
    768                                  &__c,
    769                                  (__os.flags() & ios_base::adjustfield) == ios_base::left ?
    770                                      &__c + 1 :
    771                                      &__c,
    772                                  &__c + 1,
    773                                  __os,
    774                                  __os.fill()).failed())
    775                 __os.setstate(ios_base::badbit | ios_base::failbit);
    776         }
    777 #ifndef _LIBCPP_NO_EXCEPTIONS
    778     }
    779     catch (...)
    780     {
    781         __os.__set_badbit_and_consider_rethrow();
    782     }
    783 #endif  // _LIBCPP_NO_EXCEPTIONS
    784     return __os;
    785 }
    786 
    787 template<class _Traits>
    788 basic_ostream<char, _Traits>&
    789 operator<<(basic_ostream<char, _Traits>& __os, char __c)
    790 {
    791     return _VSTD::__put_character_sequence(__os, &__c, 1);
    792 }
    793 
    794 template<class _Traits>
    795 basic_ostream<char, _Traits>&
    796 operator<<(basic_ostream<char, _Traits>& __os, signed char __c)
    797 {
    798     return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
    799 }
    800 
    801 template<class _Traits>
    802 basic_ostream<char, _Traits>&
    803 operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)
    804 {
    805     return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
    806 }
    807 
    808 template<class _CharT, class _Traits>
    809 basic_ostream<_CharT, _Traits>&
    810 operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str)
    811 {
    812     return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
    813 }
    814 
    815 template<class _CharT, class _Traits>
    816 basic_ostream<_CharT, _Traits>&
    817 operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn)
    818 {
    819 #ifndef _LIBCPP_NO_EXCEPTIONS
    820     try
    821     {
    822 #endif  // _LIBCPP_NO_EXCEPTIONS
    823         typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
    824         if (__s)
    825         {
    826             typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
    827             size_t __len = char_traits<char>::length(__strn);
    828             const int __bs = 100;
    829             _CharT __wbb[__bs];
    830             _CharT* __wb = __wbb;
    831             unique_ptr<_CharT, void(*)(void*)> __h(0, free);
    832             if (__len > __bs)
    833             {
    834                 __wb = (_CharT*)malloc(__len*sizeof(_CharT));
    835                 if (__wb == 0)
    836                     __throw_bad_alloc();
    837                 __h.reset(__wb);
    838             }
    839             for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p)
    840                 *__p = __os.widen(*__strn);
    841             if (__pad_and_output(_Ip(__os),
    842                                  __wb,
    843                                  (__os.flags() & ios_base::adjustfield) == ios_base::left ?
    844                                      __wb + __len :
    845                                      __wb,
    846                                  __wb + __len,
    847                                  __os,
    848                                  __os.fill()).failed())
    849                 __os.setstate(ios_base::badbit | ios_base::failbit);
    850         }
    851 #ifndef _LIBCPP_NO_EXCEPTIONS
    852     }
    853     catch (...)
    854     {
    855         __os.__set_badbit_and_consider_rethrow();
    856     }
    857 #endif  // _LIBCPP_NO_EXCEPTIONS
    858     return __os;
    859 }
    860 
    861 template<class _Traits>
    862 basic_ostream<char, _Traits>&
    863 operator<<(basic_ostream<char, _Traits>& __os, const char* __str)
    864 {
    865     return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
    866 }
    867 
    868 template<class _Traits>
    869 basic_ostream<char, _Traits>&
    870 operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str)
    871 {
    872     const char *__s = (const char *) __str;
    873     return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
    874 }
    875 
    876 template<class _Traits>
    877 basic_ostream<char, _Traits>&
    878 operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str)
    879 {
    880     const char *__s = (const char *) __str;
    881     return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
    882 }
    883 
    884 template <class _CharT, class _Traits>
    885 basic_ostream<_CharT, _Traits>&
    886 basic_ostream<_CharT, _Traits>::put(char_type __c)
    887 {
    888 #ifndef _LIBCPP_NO_EXCEPTIONS
    889     try
    890     {
    891 #endif  // _LIBCPP_NO_EXCEPTIONS
    892         sentry __s(*this);
    893         if (__s)
    894         {
    895             typedef ostreambuf_iterator<_CharT, _Traits> _Op;
    896             _Op __o(*this);
    897             *__o = __c;
    898             if (__o.failed())
    899                 this->setstate(ios_base::badbit);
    900         }
    901 #ifndef _LIBCPP_NO_EXCEPTIONS
    902     }
    903     catch (...)
    904     {
    905         this->__set_badbit_and_consider_rethrow();
    906     }
    907 #endif  // _LIBCPP_NO_EXCEPTIONS
    908     return *this;
    909 }
    910 
    911 template <class _CharT, class _Traits>
    912 basic_ostream<_CharT, _Traits>&
    913 basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
    914 {
    915 #ifndef _LIBCPP_NO_EXCEPTIONS
    916     try
    917     {
    918 #endif  // _LIBCPP_NO_EXCEPTIONS
    919         sentry __sen(*this);
    920         if (__sen && __n)
    921         {
    922             if (this->rdbuf()->sputn(__s, __n) != __n)
    923                 this->setstate(ios_base::badbit);
    924         }
    925 #ifndef _LIBCPP_NO_EXCEPTIONS
    926     }
    927     catch (...)
    928     {
    929         this->__set_badbit_and_consider_rethrow();
    930     }
    931 #endif  // _LIBCPP_NO_EXCEPTIONS
    932     return *this;
    933 }
    934 
    935 template <class _CharT, class _Traits>
    936 basic_ostream<_CharT, _Traits>&
    937 basic_ostream<_CharT, _Traits>::flush()
    938 {
    939 #ifndef _LIBCPP_NO_EXCEPTIONS
    940     try
    941     {
    942 #endif  // _LIBCPP_NO_EXCEPTIONS
    943         if (this->rdbuf())
    944         {
    945             sentry __s(*this);
    946             if (__s)
    947             {
    948                 if (this->rdbuf()->pubsync() == -1)
    949                     this->setstate(ios_base::badbit);
    950             }
    951         }
    952 #ifndef _LIBCPP_NO_EXCEPTIONS
    953     }
    954     catch (...)
    955     {
    956         this->__set_badbit_and_consider_rethrow();
    957     }
    958 #endif  // _LIBCPP_NO_EXCEPTIONS
    959     return *this;
    960 }
    961 
    962 template <class _CharT, class _Traits>
    963 typename basic_ostream<_CharT, _Traits>::pos_type
    964 basic_ostream<_CharT, _Traits>::tellp()
    965 {
    966     if (this->fail())
    967         return pos_type(-1);
    968     return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
    969 }
    970 
    971 template <class _CharT, class _Traits>
    972 basic_ostream<_CharT, _Traits>&
    973 basic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
    974 {
    975     sentry __s(*this);
    976     if (!this->fail())
    977     {
    978         if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
    979             this->setstate(ios_base::failbit);
    980     }
    981     return *this;
    982 }
    983 
    984 template <class _CharT, class _Traits>
    985 basic_ostream<_CharT, _Traits>&
    986 basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir)
    987 {
    988     sentry __s(*this);
    989     if (!this->fail())
    990     {
    991         if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
    992             this->setstate(ios_base::failbit);
    993     }
    994     return *this;
    995 }
    996 
    997 template <class _CharT, class _Traits>
    998 inline _LIBCPP_INLINE_VISIBILITY
    999 basic_ostream<_CharT, _Traits>&
   1000 endl(basic_ostream<_CharT, _Traits>& __os)
   1001 {
   1002     __os.put(__os.widen('\n'));
   1003     __os.flush();
   1004     return __os;
   1005 }
   1006 
   1007 template <class _CharT, class _Traits>
   1008 inline _LIBCPP_INLINE_VISIBILITY
   1009 basic_ostream<_CharT, _Traits>&
   1010 ends(basic_ostream<_CharT, _Traits>& __os)
   1011 {
   1012     __os.put(_CharT());
   1013     return __os;
   1014 }
   1015 
   1016 template <class _CharT, class _Traits>
   1017 inline _LIBCPP_INLINE_VISIBILITY
   1018 basic_ostream<_CharT, _Traits>&
   1019 flush(basic_ostream<_CharT, _Traits>& __os)
   1020 {
   1021     __os.flush();
   1022     return __os;
   1023 }
   1024 
   1025 #ifndef _LIBCPP_CXX03_LANG
   1026 
   1027 template <class _Stream, class _Tp>
   1028 inline _LIBCPP_INLINE_VISIBILITY
   1029 typename enable_if
   1030 <
   1031     !is_lvalue_reference<_Stream>::value &&
   1032     is_base_of<ios_base, _Stream>::value,
   1033     _Stream&&
   1034 >::type
   1035 operator<<(_Stream&& __os, const _Tp& __x)
   1036 {
   1037     __os << __x;
   1038     return _VSTD::move(__os);
   1039 }
   1040 
   1041 #endif  // _LIBCPP_CXX03_LANG
   1042 
   1043 template<class _CharT, class _Traits, class _Allocator>
   1044 basic_ostream<_CharT, _Traits>&
   1045 operator<<(basic_ostream<_CharT, _Traits>& __os,
   1046            const basic_string<_CharT, _Traits, _Allocator>& __str)
   1047 {
   1048     return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
   1049 }
   1050 
   1051 template<class _CharT, class _Traits>
   1052 basic_ostream<_CharT, _Traits>&
   1053 operator<<(basic_ostream<_CharT, _Traits>& __os,
   1054            const basic_string_view<_CharT, _Traits> __sv)
   1055 {
   1056     return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size());
   1057 }
   1058 
   1059 template <class _CharT, class _Traits>
   1060 inline _LIBCPP_INLINE_VISIBILITY
   1061 basic_ostream<_CharT, _Traits>&
   1062 operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec)
   1063 {
   1064     return __os << __ec.category().name() << ':' << __ec.value();
   1065 }
   1066 
   1067 template<class _CharT, class _Traits, class _Yp>
   1068 inline _LIBCPP_INLINE_VISIBILITY
   1069 basic_ostream<_CharT, _Traits>&
   1070 operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p)
   1071 {
   1072     return __os << __p.get();
   1073 }
   1074 
   1075 template<class _CharT, class _Traits, class _Yp, class _Dp>
   1076 inline _LIBCPP_INLINE_VISIBILITY
   1077 typename enable_if
   1078 <
   1079     is_same<void, typename __void_t<decltype((declval<basic_ostream<_CharT, _Traits>&>() << declval<typename unique_ptr<_Yp, _Dp>::pointer>()))>::type>::value,
   1080     basic_ostream<_CharT, _Traits>&
   1081 >::type
   1082 operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)
   1083 {
   1084     return __os << __p.get();
   1085 }
   1086 
   1087 template <class _CharT, class _Traits, size_t _Size>
   1088 basic_ostream<_CharT, _Traits>&
   1089 operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)
   1090 {
   1091     return __os << __x.template to_string<_CharT, _Traits>
   1092                         (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'),
   1093                          use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
   1094 }
   1095 
   1096 #ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
   1097 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>)
   1098 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>)
   1099 #endif
   1100 
   1101 _LIBCPP_END_NAMESPACE_STD
   1102 
   1103 #endif  // _LIBCPP_OSTREAM
   1104