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