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