Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===--------------------------- istream ----------------------------------===//
      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_ISTREAM
     12 #define _LIBCPP_ISTREAM
     13 
     14 /*
     15     istream synopsis
     16 
     17 template <class charT, class traits = char_traits<charT> >
     18 class basic_istream
     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.1.1.1 Constructor/destructor:
     30     explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
     31     basic_istream(basic_istream&& rhs);
     32     virtual ~basic_istream();
     33 
     34     // 27.7.1.1.2 Assign/swap:
     35     basic_istream& operator=(basic_istream&& rhs);
     36     void swap(basic_istream& rhs);
     37 
     38     // 27.7.1.1.3 Prefix/suffix:
     39     class sentry;
     40 
     41     // 27.7.1.2 Formatted input:
     42     basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
     43     basic_istream& operator>>(basic_ios<char_type, traits_type>&
     44                               (*pf)(basic_ios<char_type, traits_type>&));
     45     basic_istream& operator>>(ios_base& (*pf)(ios_base&));
     46     basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
     47     basic_istream& operator>>(bool& n);
     48     basic_istream& operator>>(short& n);
     49     basic_istream& operator>>(unsigned short& n);
     50     basic_istream& operator>>(int& n);
     51     basic_istream& operator>>(unsigned int& n);
     52     basic_istream& operator>>(long& n);
     53     basic_istream& operator>>(unsigned long& n);
     54     basic_istream& operator>>(long long& n);
     55     basic_istream& operator>>(unsigned long long& n);
     56     basic_istream& operator>>(float& f);
     57     basic_istream& operator>>(double& f);
     58     basic_istream& operator>>(long double& f);
     59     basic_istream& operator>>(void*& p);
     60 
     61     // 27.7.1.3 Unformatted input:
     62     streamsize gcount() const;
     63     int_type get();
     64     basic_istream& get(char_type& c);
     65     basic_istream& get(char_type* s, streamsize n);
     66     basic_istream& get(char_type* s, streamsize n, char_type delim);
     67     basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
     68     basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
     69 
     70     basic_istream& getline(char_type* s, streamsize n);
     71     basic_istream& getline(char_type* s, streamsize n, char_type delim);
     72 
     73     basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
     74     int_type peek();
     75     basic_istream& read (char_type* s, streamsize n);
     76     streamsize readsome(char_type* s, streamsize n);
     77 
     78     basic_istream& putback(char_type c);
     79     basic_istream& unget();
     80     int sync();
     81 
     82     pos_type tellg();
     83     basic_istream& seekg(pos_type);
     84     basic_istream& seekg(off_type, ios_base::seekdir);
     85 protected:
     86     basic_istream(const basic_istream& rhs) = delete;
     87     basic_istream(basic_istream&& rhs);
     88     // 27.7.2.1.2 Assign/swap:
     89     basic_istream& operator=(const basic_istream& rhs) = delete;
     90     basic_istream& operator=(basic_istream&& rhs);
     91     void swap(basic_istream& rhs);
     92 };
     93 
     94 // 27.7.1.2.3 character extraction templates:
     95 template<class charT, class traits>
     96   basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
     97 
     98 template<class traits>
     99   basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
    100 
    101 template<class traits>
    102   basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
    103 
    104 template<class charT, class traits>
    105   basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
    106 
    107 template<class traits>
    108   basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
    109 
    110 template<class traits>
    111   basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
    112 
    113 template <class charT, class traits>
    114   void
    115   swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
    116 
    117 typedef basic_istream<char> istream;
    118 typedef basic_istream<wchar_t> wistream;
    119 
    120 template <class charT, class traits = char_traits<charT> >
    121 class basic_iostream :
    122     public basic_istream<charT,traits>,
    123     public basic_ostream<charT,traits>
    124 {
    125 public:
    126     // types:
    127     typedef charT                          char_type;
    128     typedef traits                         traits_type;
    129     typedef typename traits_type::int_type int_type;
    130     typedef typename traits_type::pos_type pos_type;
    131     typedef typename traits_type::off_type off_type;
    132 
    133     // constructor/destructor
    134     explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
    135     basic_iostream(basic_iostream&& rhs);
    136     virtual ~basic_iostream();
    137 
    138     // assign/swap
    139     basic_iostream& operator=(basic_iostream&& rhs);
    140     void swap(basic_iostream& rhs);
    141 };
    142 
    143 template <class charT, class traits>
    144   void
    145   swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
    146 
    147 typedef basic_iostream<char> iostream;
    148 typedef basic_iostream<wchar_t> wiostream;
    149 
    150 template <class charT, class traits>
    151   basic_istream<charT,traits>&
    152   ws(basic_istream<charT,traits>& is);
    153 
    154 template <class charT, class traits, class T>
    155   basic_istream<charT, traits>&
    156   operator>>(basic_istream<charT, traits>&& is, T& x);
    157 
    158 }  // std
    159 
    160 */
    161 
    162 #include <__config>
    163 #include <version>
    164 #include <ostream>
    165 
    166 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    167 #pragma GCC system_header
    168 #endif
    169 
    170 _LIBCPP_PUSH_MACROS
    171 #include <__undef_macros>
    172 
    173 
    174 _LIBCPP_BEGIN_NAMESPACE_STD
    175 
    176 template <class _CharT, class _Traits>
    177 class _LIBCPP_TEMPLATE_VIS basic_istream
    178     : virtual public basic_ios<_CharT, _Traits>
    179 {
    180     streamsize __gc_;
    181 public:
    182     // types (inherited from basic_ios (27.5.4)):
    183     typedef _CharT                         char_type;
    184     typedef _Traits                        traits_type;
    185     typedef typename traits_type::int_type int_type;
    186     typedef typename traits_type::pos_type pos_type;
    187     typedef typename traits_type::off_type off_type;
    188 
    189     // 27.7.1.1.1 Constructor/destructor:
    190     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    191     explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
    192     { this->init(__sb); }
    193     virtual ~basic_istream();
    194 protected:
    195 #ifndef _LIBCPP_CXX03_LANG
    196     inline _LIBCPP_INLINE_VISIBILITY
    197     basic_istream(basic_istream&& __rhs);
    198 
    199     // 27.7.1.1.2 Assign/swap:
    200     inline _LIBCPP_INLINE_VISIBILITY
    201     basic_istream& operator=(basic_istream&& __rhs);
    202 #endif
    203 
    204     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    205     void swap(basic_istream& __rhs) {
    206       _VSTD::swap(__gc_, __rhs.__gc_);
    207       basic_ios<char_type, traits_type>::swap(__rhs);
    208     }
    209 
    210 #ifndef _LIBCPP_CXX03_LANG
    211     basic_istream           (const basic_istream& __rhs) = delete;
    212     basic_istream& operator=(const basic_istream& __rhs) = delete;
    213 #endif
    214 public:
    215 
    216     // 27.7.1.1.3 Prefix/suffix:
    217     class _LIBCPP_TEMPLATE_VIS sentry;
    218 
    219     // 27.7.1.2 Formatted input:
    220     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    221     basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
    222     { return __pf(*this); }
    223 
    224     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    225     basic_istream& operator>>(basic_ios<char_type, traits_type>&
    226                               (*__pf)(basic_ios<char_type, traits_type>&))
    227     { __pf(*this); return *this; }
    228 
    229     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    230     basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
    231     { __pf(*this); return *this; }
    232 
    233     basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
    234     basic_istream& operator>>(bool& __n);
    235     basic_istream& operator>>(short& __n);
    236     basic_istream& operator>>(unsigned short& __n);
    237     basic_istream& operator>>(int& __n);
    238     basic_istream& operator>>(unsigned int& __n);
    239     basic_istream& operator>>(long& __n);
    240     basic_istream& operator>>(unsigned long& __n);
    241     basic_istream& operator>>(long long& __n);
    242     basic_istream& operator>>(unsigned long long& __n);
    243     basic_istream& operator>>(float& __f);
    244     basic_istream& operator>>(double& __f);
    245     basic_istream& operator>>(long double& __f);
    246     basic_istream& operator>>(void*& __p);
    247 
    248     // 27.7.1.3 Unformatted input:
    249     _LIBCPP_INLINE_VISIBILITY
    250     streamsize gcount() const {return __gc_;}
    251     int_type get();
    252 
    253     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    254     basic_istream& get(char_type& __c) {
    255       int_type __ch = get();
    256       if (__ch != traits_type::eof())
    257         __c = traits_type::to_char_type(__ch);
    258       return *this;
    259     }
    260 
    261     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    262     basic_istream& get(char_type* __s, streamsize __n)
    263     { return get(__s, __n, this->widen('\n')); }
    264 
    265     basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
    266 
    267     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    268     basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
    269     { return get(__sb, this->widen('\n')); }
    270 
    271     basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
    272 
    273     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
    274     basic_istream& getline(char_type* __s, streamsize __n)
    275     { return getline(__s, __n, this->widen('\n')); }
    276 
    277     basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
    278 
    279     basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
    280     int_type peek();
    281     basic_istream& read (char_type* __s, streamsize __n);
    282     streamsize readsome(char_type* __s, streamsize __n);
    283 
    284     basic_istream& putback(char_type __c);
    285     basic_istream& unget();
    286     int sync();
    287 
    288     pos_type tellg();
    289     basic_istream& seekg(pos_type __pos);
    290     basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
    291 };
    292 
    293 template <class _CharT, class _Traits>
    294 class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
    295 {
    296     bool __ok_;
    297 
    298     sentry(const sentry&); // = delete;
    299     sentry& operator=(const sentry&); // = delete;
    300 
    301 public:
    302     explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
    303 //    ~sentry() = default;
    304 
    305     _LIBCPP_INLINE_VISIBILITY
    306         _LIBCPP_EXPLICIT
    307         operator bool() const {return __ok_;}
    308 };
    309 
    310 template <class _CharT, class _Traits>
    311 basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
    312                                                bool __noskipws)
    313     : __ok_(false)
    314 {
    315     if (__is.good())
    316     {
    317         if (__is.tie())
    318             __is.tie()->flush();
    319         if (!__noskipws && (__is.flags() & ios_base::skipws))
    320         {
    321             typedef istreambuf_iterator<_CharT, _Traits> _Ip;
    322             const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
    323             _Ip __i(__is);
    324             _Ip __eof;
    325             for (; __i != __eof; ++__i)
    326                 if (!__ct.is(__ct.space, *__i))
    327                     break;
    328             if (__i == __eof)
    329                 __is.setstate(ios_base::failbit | ios_base::eofbit);
    330         }
    331         __ok_ = __is.good();
    332     }
    333     else
    334         __is.setstate(ios_base::failbit);
    335 }
    336 
    337 #ifndef _LIBCPP_CXX03_LANG
    338 
    339 template <class _CharT, class _Traits>
    340 basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
    341     : __gc_(__rhs.__gc_)
    342 {
    343     __rhs.__gc_ = 0;
    344     this->move(__rhs);
    345 }
    346 
    347 template <class _CharT, class _Traits>
    348 basic_istream<_CharT, _Traits>&
    349 basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
    350 {
    351     swap(__rhs);
    352     return *this;
    353 }
    354 
    355 #endif  // _LIBCPP_CXX03_LANG
    356 
    357 template <class _CharT, class _Traits>
    358 basic_istream<_CharT, _Traits>::~basic_istream()
    359 {
    360 }
    361 
    362 template <class _Tp, class _CharT, class _Traits>
    363 _LIBCPP_INLINE_VISIBILITY
    364 basic_istream<_CharT, _Traits>&
    365 __input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
    366 #ifndef _LIBCPP_NO_EXCEPTIONS
    367     try
    368     {
    369 #endif  // _LIBCPP_NO_EXCEPTIONS
    370         typename basic_istream<_CharT, _Traits>::sentry __s(__is);
    371         if (__s)
    372         {
    373             typedef istreambuf_iterator<_CharT, _Traits> _Ip;
    374             typedef num_get<_CharT, _Ip> _Fp;
    375             ios_base::iostate __err = ios_base::goodbit;
    376             use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __n);
    377             __is.setstate(__err);
    378         }
    379 #ifndef _LIBCPP_NO_EXCEPTIONS
    380     }
    381     catch (...)
    382     {
    383         __is.__set_badbit_and_consider_rethrow();
    384     }
    385 #endif  // _LIBCPP_NO_EXCEPTIONS
    386     return __is;
    387 }
    388 
    389 template <class _CharT, class _Traits>
    390 basic_istream<_CharT, _Traits>&
    391 basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
    392 {
    393     return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
    394 }
    395 
    396 template <class _CharT, class _Traits>
    397 basic_istream<_CharT, _Traits>&
    398 basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
    399 {
    400     return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
    401 }
    402 
    403 template <class _CharT, class _Traits>
    404 basic_istream<_CharT, _Traits>&
    405 basic_istream<_CharT, _Traits>::operator>>(long& __n)
    406 {
    407     return _VSTD::__input_arithmetic<long>(*this, __n);
    408 }
    409 
    410 template <class _CharT, class _Traits>
    411 basic_istream<_CharT, _Traits>&
    412 basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
    413 {
    414     return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
    415 }
    416 
    417 template <class _CharT, class _Traits>
    418 basic_istream<_CharT, _Traits>&
    419 basic_istream<_CharT, _Traits>::operator>>(long long& __n)
    420 {
    421     return _VSTD::__input_arithmetic<long long>(*this, __n);
    422 }
    423 
    424 template <class _CharT, class _Traits>
    425 basic_istream<_CharT, _Traits>&
    426 basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
    427 {
    428     return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
    429 }
    430 
    431 template <class _CharT, class _Traits>
    432 basic_istream<_CharT, _Traits>&
    433 basic_istream<_CharT, _Traits>::operator>>(float& __n)
    434 {
    435     return _VSTD::__input_arithmetic<float>(*this, __n);
    436 }
    437 
    438 template <class _CharT, class _Traits>
    439 basic_istream<_CharT, _Traits>&
    440 basic_istream<_CharT, _Traits>::operator>>(double& __n)
    441 {
    442     return _VSTD::__input_arithmetic<double>(*this, __n);
    443 }
    444 
    445 template <class _CharT, class _Traits>
    446 basic_istream<_CharT, _Traits>&
    447 basic_istream<_CharT, _Traits>::operator>>(long double& __n)
    448 {
    449     return _VSTD::__input_arithmetic<long double>(*this, __n);
    450 }
    451 
    452 template <class _CharT, class _Traits>
    453 basic_istream<_CharT, _Traits>&
    454 basic_istream<_CharT, _Traits>::operator>>(bool& __n)
    455 {
    456     return _VSTD::__input_arithmetic<bool>(*this, __n);
    457 }
    458 
    459 template <class _CharT, class _Traits>
    460 basic_istream<_CharT, _Traits>&
    461 basic_istream<_CharT, _Traits>::operator>>(void*& __n)
    462 {
    463     return _VSTD::__input_arithmetic<void*>(*this, __n);
    464 }
    465 
    466 template <class _Tp, class _CharT, class _Traits>
    467 _LIBCPP_INLINE_VISIBILITY
    468 basic_istream<_CharT, _Traits>&
    469 __input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
    470 #ifndef _LIBCPP_NO_EXCEPTIONS
    471     try
    472     {
    473 #endif  // _LIBCPP_NO_EXCEPTIONS
    474         typename basic_istream<_CharT, _Traits>::sentry __s(__is);
    475         if (__s)
    476         {
    477             typedef istreambuf_iterator<_CharT, _Traits> _Ip;
    478             typedef num_get<_CharT, _Ip> _Fp;
    479             ios_base::iostate __err = ios_base::goodbit;
    480             long __temp;
    481             use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __temp);
    482             if (__temp < numeric_limits<_Tp>::min())
    483             {
    484                 __err |= ios_base::failbit;
    485                 __n = numeric_limits<_Tp>::min();
    486             }
    487             else if (__temp > numeric_limits<_Tp>::max())
    488             {
    489                 __err |= ios_base::failbit;
    490                 __n = numeric_limits<_Tp>::max();
    491             }
    492             else
    493                 __n = static_cast<_Tp>(__temp);
    494             __is.setstate(__err);
    495         }
    496 #ifndef _LIBCPP_NO_EXCEPTIONS
    497     }
    498     catch (...)
    499     {
    500         __is.__set_badbit_and_consider_rethrow();
    501     }
    502 #endif  // _LIBCPP_NO_EXCEPTIONS
    503     return __is;
    504 }
    505 
    506 template <class _CharT, class _Traits>
    507 basic_istream<_CharT, _Traits>&
    508 basic_istream<_CharT, _Traits>::operator>>(short& __n)
    509 {
    510     return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
    511 }
    512 
    513 template <class _CharT, class _Traits>
    514 basic_istream<_CharT, _Traits>&
    515 basic_istream<_CharT, _Traits>::operator>>(int& __n)
    516 {
    517     return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
    518 }
    519 
    520 template<class _CharT, class _Traits>
    521 _LIBCPP_INLINE_VISIBILITY
    522 basic_istream<_CharT, _Traits>&
    523 __input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
    524 {
    525 #ifndef _LIBCPP_NO_EXCEPTIONS
    526     try
    527     {
    528 #endif  // _LIBCPP_NO_EXCEPTIONS
    529         typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
    530         if (__sen)
    531         {
    532             auto __s = __p;
    533             const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
    534             ios_base::iostate __err = ios_base::goodbit;
    535             while (__s != __p + (__n-1))
    536             {
    537                 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
    538                 if (_Traits::eq_int_type(__i, _Traits::eof()))
    539                 {
    540                    __err |= ios_base::eofbit;
    541                    break;
    542                 }
    543                 _CharT __ch = _Traits::to_char_type(__i);
    544                 if (__ct.is(__ct.space, __ch))
    545                     break;
    546                 *__s++ = __ch;
    547                  __is.rdbuf()->sbumpc();
    548             }
    549             *__s = _CharT();
    550             __is.width(0);
    551             if (__s == __p)
    552                __err |= ios_base::failbit;
    553             __is.setstate(__err);
    554         }
    555 #ifndef _LIBCPP_NO_EXCEPTIONS
    556     }
    557     catch (...)
    558     {
    559         __is.__set_badbit_and_consider_rethrow();
    560     }
    561 #endif  // _LIBCPP_NO_EXCEPTIONS
    562     return __is;
    563 }
    564 
    565 #if _LIBCPP_STD_VER > 17
    566 
    567 template<class _CharT, class _Traits, size_t _Np>
    568 inline _LIBCPP_INLINE_VISIBILITY
    569 basic_istream<_CharT, _Traits>&
    570 operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
    571 {
    572     auto __n = _Np;
    573     if (__is.width() > 0)
    574         __n = _VSTD::min(size_t(__is.width()), _Np);
    575     return _VSTD::__input_c_string(__is, __buf, __n);
    576 }
    577 
    578 template<class _Traits, size_t _Np>
    579 inline _LIBCPP_INLINE_VISIBILITY
    580 basic_istream<char, _Traits>&
    581 operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
    582 {
    583     return __is >> (char(&)[_Np])__buf;
    584 }
    585 
    586 template<class _Traits, size_t _Np>
    587 inline _LIBCPP_INLINE_VISIBILITY
    588 basic_istream<char, _Traits>&
    589 operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
    590 {
    591     return __is >> (char(&)[_Np])__buf;
    592 }
    593 
    594 #else
    595 
    596 template<class _CharT, class _Traits>
    597 inline _LIBCPP_INLINE_VISIBILITY
    598 basic_istream<_CharT, _Traits>&
    599 operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
    600 {
    601     streamsize __n = __is.width();
    602     if (__n <= 0)
    603         __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
    604     return _VSTD::__input_c_string(__is, __s, size_t(__n));
    605 }
    606 
    607 template<class _Traits>
    608 inline _LIBCPP_INLINE_VISIBILITY
    609 basic_istream<char, _Traits>&
    610 operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
    611 {
    612     return __is >> (char*)__s;
    613 }
    614 
    615 template<class _Traits>
    616 inline _LIBCPP_INLINE_VISIBILITY
    617 basic_istream<char, _Traits>&
    618 operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
    619 {
    620     return __is >> (char*)__s;
    621 }
    622 
    623 #endif  // _LIBCPP_STD_VER > 17
    624 
    625 template<class _CharT, class _Traits>
    626 basic_istream<_CharT, _Traits>&
    627 operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
    628 {
    629 #ifndef _LIBCPP_NO_EXCEPTIONS
    630     try
    631     {
    632 #endif  // _LIBCPP_NO_EXCEPTIONS
    633         typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
    634         if (__sen)
    635         {
    636             typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
    637             if (_Traits::eq_int_type(__i, _Traits::eof()))
    638                 __is.setstate(ios_base::eofbit | ios_base::failbit);
    639             else
    640                 __c = _Traits::to_char_type(__i);
    641         }
    642 #ifndef _LIBCPP_NO_EXCEPTIONS
    643     }
    644     catch (...)
    645     {
    646         __is.__set_badbit_and_consider_rethrow();
    647     }
    648 #endif  // _LIBCPP_NO_EXCEPTIONS
    649     return __is;
    650 }
    651 
    652 template<class _Traits>
    653 inline _LIBCPP_INLINE_VISIBILITY
    654 basic_istream<char, _Traits>&
    655 operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
    656 {
    657     return __is >> (char&)__c;
    658 }
    659 
    660 template<class _Traits>
    661 inline _LIBCPP_INLINE_VISIBILITY
    662 basic_istream<char, _Traits>&
    663 operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
    664 {
    665     return __is >> (char&)__c;
    666 }
    667 
    668 template<class _CharT, class _Traits>
    669 basic_istream<_CharT, _Traits>&
    670 basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
    671 {
    672     __gc_ = 0;
    673 #ifndef _LIBCPP_NO_EXCEPTIONS
    674     try
    675     {
    676 #endif  // _LIBCPP_NO_EXCEPTIONS
    677         sentry __s(*this, true);
    678         if (__s)
    679         {
    680             if (__sb)
    681             {
    682 #ifndef _LIBCPP_NO_EXCEPTIONS
    683                 try
    684                 {
    685 #endif  // _LIBCPP_NO_EXCEPTIONS
    686                     ios_base::iostate __err = ios_base::goodbit;
    687                     while (true)
    688                     {
    689                         typename traits_type::int_type __i = this->rdbuf()->sgetc();
    690                         if (traits_type::eq_int_type(__i, _Traits::eof()))
    691                         {
    692                            __err |= ios_base::eofbit;
    693                            break;
    694                         }
    695                         if (traits_type::eq_int_type(
    696                                 __sb->sputc(traits_type::to_char_type(__i)),
    697                                 traits_type::eof()))
    698                             break;
    699                         ++__gc_;
    700                         this->rdbuf()->sbumpc();
    701                     }
    702                     if (__gc_ == 0)
    703                        __err |= ios_base::failbit;
    704                     this->setstate(__err);
    705 #ifndef _LIBCPP_NO_EXCEPTIONS
    706                 }
    707                 catch (...)
    708                 {
    709                     if (__gc_ == 0)
    710                         this->__set_failbit_and_consider_rethrow();
    711                 }
    712 #endif  // _LIBCPP_NO_EXCEPTIONS
    713             }
    714             else
    715                 this->setstate(ios_base::failbit);
    716         }
    717 #ifndef _LIBCPP_NO_EXCEPTIONS
    718     }
    719     catch (...)
    720     {
    721         this->__set_badbit_and_consider_rethrow();
    722     }
    723 #endif  // _LIBCPP_NO_EXCEPTIONS
    724     return *this;
    725 }
    726 
    727 template<class _CharT, class _Traits>
    728 typename basic_istream<_CharT, _Traits>::int_type
    729 basic_istream<_CharT, _Traits>::get()
    730 {
    731     __gc_ = 0;
    732     int_type __r = traits_type::eof();
    733 #ifndef _LIBCPP_NO_EXCEPTIONS
    734     try
    735     {
    736 #endif  // _LIBCPP_NO_EXCEPTIONS
    737         sentry __s(*this, true);
    738         if (__s)
    739         {
    740             __r = this->rdbuf()->sbumpc();
    741             if (traits_type::eq_int_type(__r, traits_type::eof()))
    742                this->setstate(ios_base::failbit | ios_base::eofbit);
    743             else
    744                 __gc_ = 1;
    745         }
    746 #ifndef _LIBCPP_NO_EXCEPTIONS
    747     }
    748     catch (...)
    749     {
    750         this->__set_badbit_and_consider_rethrow();
    751     }
    752 #endif  // _LIBCPP_NO_EXCEPTIONS
    753     return __r;
    754 }
    755 
    756 template<class _CharT, class _Traits>
    757 basic_istream<_CharT, _Traits>&
    758 basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
    759 {
    760     __gc_ = 0;
    761 #ifndef _LIBCPP_NO_EXCEPTIONS
    762     try
    763     {
    764 #endif  // _LIBCPP_NO_EXCEPTIONS
    765         sentry __sen(*this, true);
    766         if (__sen)
    767         {
    768             if (__n > 0)
    769             {
    770                 ios_base::iostate __err = ios_base::goodbit;
    771                 while (__gc_ < __n-1)
    772                 {
    773                     int_type __i = this->rdbuf()->sgetc();
    774                     if (traits_type::eq_int_type(__i, traits_type::eof()))
    775                     {
    776                        __err |= ios_base::eofbit;
    777                        break;
    778                     }
    779                     char_type __ch = traits_type::to_char_type(__i);
    780                     if (traits_type::eq(__ch, __dlm))
    781                         break;
    782                     *__s++ = __ch;
    783                     ++__gc_;
    784                      this->rdbuf()->sbumpc();
    785                 }
    786                 if (__gc_ == 0)
    787                    __err |= ios_base::failbit;
    788                 this->setstate(__err);
    789             }
    790             else
    791                 this->setstate(ios_base::failbit);
    792         }
    793         if (__n > 0)
    794             *__s = char_type();
    795 #ifndef _LIBCPP_NO_EXCEPTIONS
    796     }
    797     catch (...)
    798     {
    799         if (__n > 0)
    800             *__s = char_type();
    801         this->__set_badbit_and_consider_rethrow();
    802     }
    803 #endif  // _LIBCPP_NO_EXCEPTIONS
    804     return *this;
    805 }
    806 
    807 template<class _CharT, class _Traits>
    808 basic_istream<_CharT, _Traits>&
    809 basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
    810                                     char_type __dlm)
    811 {
    812     __gc_ = 0;
    813 #ifndef _LIBCPP_NO_EXCEPTIONS
    814     try
    815     {
    816 #endif  // _LIBCPP_NO_EXCEPTIONS
    817         sentry __sen(*this, true);
    818         if (__sen)
    819         {
    820             ios_base::iostate __err = ios_base::goodbit;
    821 #ifndef _LIBCPP_NO_EXCEPTIONS
    822             try
    823             {
    824 #endif  // _LIBCPP_NO_EXCEPTIONS
    825                 while (true)
    826                 {
    827                     typename traits_type::int_type __i = this->rdbuf()->sgetc();
    828                     if (traits_type::eq_int_type(__i, traits_type::eof()))
    829                     {
    830                        __err |= ios_base::eofbit;
    831                        break;
    832                     }
    833                     char_type __ch = traits_type::to_char_type(__i);
    834                     if (traits_type::eq(__ch, __dlm))
    835                         break;
    836                     if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
    837                         break;
    838                     ++__gc_;
    839                     this->rdbuf()->sbumpc();
    840                 }
    841 #ifndef _LIBCPP_NO_EXCEPTIONS
    842             }
    843             catch (...)
    844             {
    845             }
    846 #endif  // _LIBCPP_NO_EXCEPTIONS
    847             if (__gc_ == 0)
    848                __err |= ios_base::failbit;
    849             this->setstate(__err);
    850         }
    851 #ifndef _LIBCPP_NO_EXCEPTIONS
    852     }
    853     catch (...)
    854     {
    855         this->__set_badbit_and_consider_rethrow();
    856     }
    857 #endif  // _LIBCPP_NO_EXCEPTIONS
    858     return *this;
    859 }
    860 
    861 template<class _CharT, class _Traits>
    862 basic_istream<_CharT, _Traits>&
    863 basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
    864 {
    865     __gc_ = 0;
    866 #ifndef _LIBCPP_NO_EXCEPTIONS
    867     try
    868     {
    869 #endif  // _LIBCPP_NO_EXCEPTIONS
    870         sentry __sen(*this, true);
    871         if (__sen)
    872         {
    873             ios_base::iostate __err = ios_base::goodbit;
    874             while (true)
    875             {
    876                 typename traits_type::int_type __i = this->rdbuf()->sgetc();
    877                 if (traits_type::eq_int_type(__i, traits_type::eof()))
    878                 {
    879                    __err |= ios_base::eofbit;
    880                    break;
    881                 }
    882                 char_type __ch = traits_type::to_char_type(__i);
    883                 if (traits_type::eq(__ch, __dlm))
    884                 {
    885                     this->rdbuf()->sbumpc();
    886                     ++__gc_;
    887                     break;
    888                 }
    889                 if (__gc_ >= __n-1)
    890                 {
    891                     __err |= ios_base::failbit;
    892                     break;
    893                 }
    894                 *__s++ = __ch;
    895                 this->rdbuf()->sbumpc();
    896                 ++__gc_;
    897             }
    898             if (__gc_ == 0)
    899                __err |= ios_base::failbit;
    900             this->setstate(__err);
    901         }
    902         if (__n > 0)
    903             *__s = char_type();
    904 #ifndef _LIBCPP_NO_EXCEPTIONS
    905     }
    906     catch (...)
    907     {
    908         if (__n > 0)
    909             *__s = char_type();
    910         this->__set_badbit_and_consider_rethrow();
    911     }
    912 #endif  // _LIBCPP_NO_EXCEPTIONS
    913     return *this;
    914 }
    915 
    916 template<class _CharT, class _Traits>
    917 basic_istream<_CharT, _Traits>&
    918 basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
    919 {
    920     __gc_ = 0;
    921 #ifndef _LIBCPP_NO_EXCEPTIONS
    922     try
    923     {
    924 #endif  // _LIBCPP_NO_EXCEPTIONS
    925         sentry __sen(*this, true);
    926         if (__sen)
    927         {
    928             ios_base::iostate __err = ios_base::goodbit;
    929             if (__n == numeric_limits<streamsize>::max())
    930             {
    931                 while (true)
    932                 {
    933                     typename traits_type::int_type __i = this->rdbuf()->sbumpc();
    934                     if (traits_type::eq_int_type(__i, traits_type::eof()))
    935                     {
    936                        __err |= ios_base::eofbit;
    937                        break;
    938                     }
    939                     ++__gc_;
    940                     if (traits_type::eq_int_type(__i, __dlm))
    941                         break;
    942                 }
    943             }
    944             else
    945             {
    946                 while (__gc_ < __n)
    947                 {
    948                     typename traits_type::int_type __i = this->rdbuf()->sbumpc();
    949                     if (traits_type::eq_int_type(__i, traits_type::eof()))
    950                     {
    951                        __err |= ios_base::eofbit;
    952                        break;
    953                     }
    954                     ++__gc_;
    955                     if (traits_type::eq_int_type(__i, __dlm))
    956                         break;
    957                 }
    958             }
    959             this->setstate(__err);
    960         }
    961 #ifndef _LIBCPP_NO_EXCEPTIONS
    962     }
    963     catch (...)
    964     {
    965         this->__set_badbit_and_consider_rethrow();
    966     }
    967 #endif  // _LIBCPP_NO_EXCEPTIONS
    968     return *this;
    969 }
    970 
    971 template<class _CharT, class _Traits>
    972 typename basic_istream<_CharT, _Traits>::int_type
    973 basic_istream<_CharT, _Traits>::peek()
    974 {
    975     __gc_ = 0;
    976     int_type __r = traits_type::eof();
    977 #ifndef _LIBCPP_NO_EXCEPTIONS
    978     try
    979     {
    980 #endif  // _LIBCPP_NO_EXCEPTIONS
    981         sentry __sen(*this, true);
    982         if (__sen)
    983         {
    984             __r = this->rdbuf()->sgetc();
    985             if (traits_type::eq_int_type(__r, traits_type::eof()))
    986                 this->setstate(ios_base::eofbit);
    987         }
    988 #ifndef _LIBCPP_NO_EXCEPTIONS
    989     }
    990     catch (...)
    991     {
    992         this->__set_badbit_and_consider_rethrow();
    993     }
    994 #endif  // _LIBCPP_NO_EXCEPTIONS
    995     return __r;
    996 }
    997 
    998 template<class _CharT, class _Traits>
    999 basic_istream<_CharT, _Traits>&
   1000 basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
   1001 {
   1002     __gc_ = 0;
   1003 #ifndef _LIBCPP_NO_EXCEPTIONS
   1004     try
   1005     {
   1006 #endif  // _LIBCPP_NO_EXCEPTIONS
   1007         sentry __sen(*this, true);
   1008         if (__sen)
   1009         {
   1010             __gc_ = this->rdbuf()->sgetn(__s, __n);
   1011             if (__gc_ != __n)
   1012                 this->setstate(ios_base::failbit | ios_base::eofbit);
   1013         }
   1014         else
   1015             this->setstate(ios_base::failbit);
   1016 #ifndef _LIBCPP_NO_EXCEPTIONS
   1017     }
   1018     catch (...)
   1019     {
   1020         this->__set_badbit_and_consider_rethrow();
   1021     }
   1022 #endif  // _LIBCPP_NO_EXCEPTIONS
   1023     return *this;
   1024 }
   1025 
   1026 template<class _CharT, class _Traits>
   1027 streamsize
   1028 basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
   1029 {
   1030     __gc_ = 0;
   1031 #ifndef _LIBCPP_NO_EXCEPTIONS
   1032     try
   1033     {
   1034 #endif  // _LIBCPP_NO_EXCEPTIONS
   1035         sentry __sen(*this, true);
   1036         if (__sen)
   1037         {
   1038             streamsize __c = this->rdbuf()->in_avail();
   1039             switch (__c)
   1040             {
   1041             case -1:
   1042                 this->setstate(ios_base::eofbit);
   1043                 break;
   1044             case 0:
   1045                 break;
   1046             default:
   1047                 read(__s, _VSTD::min(__c, __n));
   1048                 break;
   1049             }
   1050         }
   1051         else
   1052             this->setstate(ios_base::failbit);
   1053 #ifndef _LIBCPP_NO_EXCEPTIONS
   1054     }
   1055     catch (...)
   1056     {
   1057         this->__set_badbit_and_consider_rethrow();
   1058     }
   1059 #endif  // _LIBCPP_NO_EXCEPTIONS
   1060     return __gc_;
   1061 }
   1062 
   1063 template<class _CharT, class _Traits>
   1064 basic_istream<_CharT, _Traits>&
   1065 basic_istream<_CharT, _Traits>::putback(char_type __c)
   1066 {
   1067     __gc_ = 0;
   1068 #ifndef _LIBCPP_NO_EXCEPTIONS
   1069     try
   1070     {
   1071 #endif  // _LIBCPP_NO_EXCEPTIONS
   1072         this->clear(this->rdstate() & ~ios_base::eofbit);
   1073         sentry __sen(*this, true);
   1074         if (__sen)
   1075         {
   1076             if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
   1077                 this->setstate(ios_base::badbit);
   1078         }
   1079         else
   1080             this->setstate(ios_base::failbit);
   1081 #ifndef _LIBCPP_NO_EXCEPTIONS
   1082     }
   1083     catch (...)
   1084     {
   1085         this->__set_badbit_and_consider_rethrow();
   1086     }
   1087 #endif  // _LIBCPP_NO_EXCEPTIONS
   1088     return *this;
   1089 }
   1090 
   1091 template<class _CharT, class _Traits>
   1092 basic_istream<_CharT, _Traits>&
   1093 basic_istream<_CharT, _Traits>::unget()
   1094 {
   1095     __gc_ = 0;
   1096 #ifndef _LIBCPP_NO_EXCEPTIONS
   1097     try
   1098     {
   1099 #endif  // _LIBCPP_NO_EXCEPTIONS
   1100         this->clear(this->rdstate() & ~ios_base::eofbit);
   1101         sentry __sen(*this, true);
   1102         if (__sen)
   1103         {
   1104             if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
   1105                 this->setstate(ios_base::badbit);
   1106         }
   1107         else
   1108             this->setstate(ios_base::failbit);
   1109 #ifndef _LIBCPP_NO_EXCEPTIONS
   1110     }
   1111     catch (...)
   1112     {
   1113         this->__set_badbit_and_consider_rethrow();
   1114     }
   1115 #endif  // _LIBCPP_NO_EXCEPTIONS
   1116     return *this;
   1117 }
   1118 
   1119 template<class _CharT, class _Traits>
   1120 int
   1121 basic_istream<_CharT, _Traits>::sync()
   1122 {
   1123     int __r = 0;
   1124 #ifndef _LIBCPP_NO_EXCEPTIONS
   1125     try
   1126     {
   1127 #endif  // _LIBCPP_NO_EXCEPTIONS
   1128         sentry __sen(*this, true);
   1129         if (__sen)
   1130         {
   1131             if (this->rdbuf() == 0)
   1132                 return -1;
   1133             if (this->rdbuf()->pubsync() == -1)
   1134             {
   1135                 this->setstate(ios_base::badbit);
   1136                 return -1;
   1137             }
   1138         }
   1139 #ifndef _LIBCPP_NO_EXCEPTIONS
   1140     }
   1141     catch (...)
   1142     {
   1143         this->__set_badbit_and_consider_rethrow();
   1144     }
   1145 #endif  // _LIBCPP_NO_EXCEPTIONS
   1146     return __r;
   1147 }
   1148 
   1149 template<class _CharT, class _Traits>
   1150 typename basic_istream<_CharT, _Traits>::pos_type
   1151 basic_istream<_CharT, _Traits>::tellg()
   1152 {
   1153     pos_type __r(-1);
   1154 #ifndef _LIBCPP_NO_EXCEPTIONS
   1155     try
   1156     {
   1157 #endif  // _LIBCPP_NO_EXCEPTIONS
   1158         sentry __sen(*this, true);
   1159         if (__sen)
   1160             __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
   1161 #ifndef _LIBCPP_NO_EXCEPTIONS
   1162     }
   1163     catch (...)
   1164     {
   1165         this->__set_badbit_and_consider_rethrow();
   1166     }
   1167 #endif  // _LIBCPP_NO_EXCEPTIONS
   1168     return __r;
   1169 }
   1170 
   1171 template<class _CharT, class _Traits>
   1172 basic_istream<_CharT, _Traits>&
   1173 basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
   1174 {
   1175 #ifndef _LIBCPP_NO_EXCEPTIONS
   1176     try
   1177     {
   1178 #endif  // _LIBCPP_NO_EXCEPTIONS
   1179         this->clear(this->rdstate() & ~ios_base::eofbit);
   1180         sentry __sen(*this, true);
   1181         if (__sen)
   1182         {
   1183             if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
   1184                 this->setstate(ios_base::failbit);
   1185         }
   1186 #ifndef _LIBCPP_NO_EXCEPTIONS
   1187     }
   1188     catch (...)
   1189     {
   1190         this->__set_badbit_and_consider_rethrow();
   1191     }
   1192 #endif  // _LIBCPP_NO_EXCEPTIONS
   1193     return *this;
   1194 }
   1195 
   1196 template<class _CharT, class _Traits>
   1197 basic_istream<_CharT, _Traits>&
   1198 basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
   1199 {
   1200 #ifndef _LIBCPP_NO_EXCEPTIONS
   1201     try
   1202     {
   1203 #endif  // _LIBCPP_NO_EXCEPTIONS
   1204         this->clear(this->rdstate() & ~ios_base::eofbit);
   1205         sentry __sen(*this, true);
   1206         if (__sen)
   1207         {
   1208             if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
   1209                 this->setstate(ios_base::failbit);
   1210         }
   1211 #ifndef _LIBCPP_NO_EXCEPTIONS
   1212     }
   1213     catch (...)
   1214     {
   1215         this->__set_badbit_and_consider_rethrow();
   1216     }
   1217 #endif  // _LIBCPP_NO_EXCEPTIONS
   1218     return *this;
   1219 }
   1220 
   1221 template <class _CharT, class _Traits>
   1222 basic_istream<_CharT, _Traits>&
   1223 ws(basic_istream<_CharT, _Traits>& __is)
   1224 {
   1225 #ifndef _LIBCPP_NO_EXCEPTIONS
   1226     try
   1227     {
   1228 #endif  // _LIBCPP_NO_EXCEPTIONS
   1229         typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
   1230         if (__sen)
   1231         {
   1232             const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
   1233             while (true)
   1234             {
   1235                 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
   1236                 if (_Traits::eq_int_type(__i, _Traits::eof()))
   1237                 {
   1238                    __is.setstate(ios_base::eofbit);
   1239                    break;
   1240                 }
   1241                 if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
   1242                     break;
   1243                 __is.rdbuf()->sbumpc();
   1244             }
   1245         }
   1246 #ifndef _LIBCPP_NO_EXCEPTIONS
   1247     }
   1248     catch (...)
   1249     {
   1250         __is.__set_badbit_and_consider_rethrow();
   1251     }
   1252 #endif  // _LIBCPP_NO_EXCEPTIONS
   1253     return __is;
   1254 }
   1255 
   1256 #ifndef _LIBCPP_CXX03_LANG
   1257 
   1258 template <class _CharT, class _Traits, class _Tp>
   1259 inline _LIBCPP_INLINE_VISIBILITY
   1260 basic_istream<_CharT, _Traits>&
   1261 operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
   1262 {
   1263     __is >> _VSTD::forward<_Tp>(__x);
   1264     return __is;
   1265 }
   1266 
   1267 #endif  // _LIBCPP_CXX03_LANG
   1268 
   1269 template <class _CharT, class _Traits>
   1270 class _LIBCPP_TEMPLATE_VIS basic_iostream
   1271     : public basic_istream<_CharT, _Traits>,
   1272       public basic_ostream<_CharT, _Traits>
   1273 {
   1274 public:
   1275     // types:
   1276     typedef _CharT                         char_type;
   1277     typedef _Traits                        traits_type;
   1278     typedef typename traits_type::int_type int_type;
   1279     typedef typename traits_type::pos_type pos_type;
   1280     typedef typename traits_type::off_type off_type;
   1281 
   1282     // constructor/destructor
   1283     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
   1284     explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
   1285       : basic_istream<_CharT, _Traits>(__sb)
   1286     {}
   1287 
   1288     virtual ~basic_iostream();
   1289 protected:
   1290 #ifndef _LIBCPP_CXX03_LANG
   1291     inline _LIBCPP_INLINE_VISIBILITY
   1292     basic_iostream(basic_iostream&& __rhs);
   1293 
   1294     // assign/swap
   1295     inline _LIBCPP_INLINE_VISIBILITY
   1296     basic_iostream& operator=(basic_iostream&& __rhs);
   1297 #endif
   1298     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
   1299     void swap(basic_iostream& __rhs)
   1300     { basic_istream<char_type, traits_type>::swap(__rhs); }
   1301 public:
   1302 };
   1303 
   1304 #ifndef _LIBCPP_CXX03_LANG
   1305 
   1306 template <class _CharT, class _Traits>
   1307 basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
   1308     : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
   1309 {
   1310 }
   1311 
   1312 template <class _CharT, class _Traits>
   1313 basic_iostream<_CharT, _Traits>&
   1314 basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
   1315 {
   1316     swap(__rhs);
   1317     return *this;
   1318 }
   1319 
   1320 #endif  // _LIBCPP_CXX03_LANG
   1321 
   1322 template <class _CharT, class _Traits>
   1323 basic_iostream<_CharT, _Traits>::~basic_iostream()
   1324 {
   1325 }
   1326 
   1327 template<class _CharT, class _Traits, class _Allocator>
   1328 basic_istream<_CharT, _Traits>&
   1329 operator>>(basic_istream<_CharT, _Traits>& __is,
   1330            basic_string<_CharT, _Traits, _Allocator>& __str)
   1331 {
   1332 #ifndef _LIBCPP_NO_EXCEPTIONS
   1333     try
   1334     {
   1335 #endif  // _LIBCPP_NO_EXCEPTIONS
   1336         typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
   1337         if (__sen)
   1338         {
   1339             __str.clear();
   1340             streamsize __n = __is.width();
   1341             if (__n <= 0)
   1342                 __n = __str.max_size();
   1343             if (__n <= 0)
   1344                 __n = numeric_limits<streamsize>::max();
   1345             streamsize __c = 0;
   1346             const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
   1347             ios_base::iostate __err = ios_base::goodbit;
   1348             while (__c < __n)
   1349             {
   1350                 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
   1351                 if (_Traits::eq_int_type(__i, _Traits::eof()))
   1352                 {
   1353                    __err |= ios_base::eofbit;
   1354                    break;
   1355                 }
   1356                 _CharT __ch = _Traits::to_char_type(__i);
   1357                 if (__ct.is(__ct.space, __ch))
   1358                     break;
   1359                 __str.push_back(__ch);
   1360                 ++__c;
   1361                  __is.rdbuf()->sbumpc();
   1362             }
   1363             __is.width(0);
   1364             if (__c == 0)
   1365                __err |= ios_base::failbit;
   1366             __is.setstate(__err);
   1367         }
   1368         else
   1369             __is.setstate(ios_base::failbit);
   1370 #ifndef _LIBCPP_NO_EXCEPTIONS
   1371     }
   1372     catch (...)
   1373     {
   1374         __is.__set_badbit_and_consider_rethrow();
   1375     }
   1376 #endif  // _LIBCPP_NO_EXCEPTIONS
   1377     return __is;
   1378 }
   1379 
   1380 template<class _CharT, class _Traits, class _Allocator>
   1381 basic_istream<_CharT, _Traits>&
   1382 getline(basic_istream<_CharT, _Traits>& __is,
   1383         basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
   1384 {
   1385 #ifndef _LIBCPP_NO_EXCEPTIONS
   1386     try
   1387     {
   1388 #endif  // _LIBCPP_NO_EXCEPTIONS
   1389         typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
   1390         if (__sen)
   1391         {
   1392             __str.clear();
   1393             ios_base::iostate __err = ios_base::goodbit;
   1394             streamsize __extr = 0;
   1395             while (true)
   1396             {
   1397                 typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
   1398                 if (_Traits::eq_int_type(__i, _Traits::eof()))
   1399                 {
   1400                    __err |= ios_base::eofbit;
   1401                    break;
   1402                 }
   1403                 ++__extr;
   1404                 _CharT __ch = _Traits::to_char_type(__i);
   1405                 if (_Traits::eq(__ch, __dlm))
   1406                     break;
   1407                 __str.push_back(__ch);
   1408                 if (__str.size() == __str.max_size())
   1409                 {
   1410                     __err |= ios_base::failbit;
   1411                     break;
   1412                 }
   1413             }
   1414             if (__extr == 0)
   1415                __err |= ios_base::failbit;
   1416             __is.setstate(__err);
   1417         }
   1418 #ifndef _LIBCPP_NO_EXCEPTIONS
   1419     }
   1420     catch (...)
   1421     {
   1422         __is.__set_badbit_and_consider_rethrow();
   1423     }
   1424 #endif  // _LIBCPP_NO_EXCEPTIONS
   1425     return __is;
   1426 }
   1427 
   1428 template<class _CharT, class _Traits, class _Allocator>
   1429 inline _LIBCPP_INLINE_VISIBILITY
   1430 basic_istream<_CharT, _Traits>&
   1431 getline(basic_istream<_CharT, _Traits>& __is,
   1432         basic_string<_CharT, _Traits, _Allocator>& __str)
   1433 {
   1434     return getline(__is, __str, __is.widen('\n'));
   1435 }
   1436 
   1437 #ifndef _LIBCPP_CXX03_LANG
   1438 
   1439 template<class _CharT, class _Traits, class _Allocator>
   1440 inline _LIBCPP_INLINE_VISIBILITY
   1441 basic_istream<_CharT, _Traits>&
   1442 getline(basic_istream<_CharT, _Traits>&& __is,
   1443         basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
   1444 {
   1445     return getline(__is, __str, __dlm);
   1446 }
   1447 
   1448 template<class _CharT, class _Traits, class _Allocator>
   1449 inline _LIBCPP_INLINE_VISIBILITY
   1450 basic_istream<_CharT, _Traits>&
   1451 getline(basic_istream<_CharT, _Traits>&& __is,
   1452         basic_string<_CharT, _Traits, _Allocator>& __str)
   1453 {
   1454     return getline(__is, __str, __is.widen('\n'));
   1455 }
   1456 
   1457 #endif  // _LIBCPP_CXX03_LANG
   1458 
   1459 template <class _CharT, class _Traits, size_t _Size>
   1460 basic_istream<_CharT, _Traits>&
   1461 operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
   1462 {
   1463 #ifndef _LIBCPP_NO_EXCEPTIONS
   1464     try
   1465     {
   1466 #endif  // _LIBCPP_NO_EXCEPTIONS
   1467         typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
   1468         if (__sen)
   1469         {
   1470             basic_string<_CharT, _Traits> __str;
   1471             const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
   1472             size_t __c = 0;
   1473             ios_base::iostate __err = ios_base::goodbit;
   1474             _CharT __zero = __ct.widen('0');
   1475             _CharT __one = __ct.widen('1');
   1476             while (__c < _Size)
   1477             {
   1478                 typename _Traits::int_type __i = __is.rdbuf()->sgetc();
   1479                 if (_Traits::eq_int_type(__i, _Traits::eof()))
   1480                 {
   1481                    __err |= ios_base::eofbit;
   1482                    break;
   1483                 }
   1484                 _CharT __ch = _Traits::to_char_type(__i);
   1485                 if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
   1486                     break;
   1487                 __str.push_back(__ch);
   1488                 ++__c;
   1489                  __is.rdbuf()->sbumpc();
   1490             }
   1491             __x = bitset<_Size>(__str);
   1492             if (__c == 0)
   1493                __err |= ios_base::failbit;
   1494             __is.setstate(__err);
   1495         }
   1496         else
   1497             __is.setstate(ios_base::failbit);
   1498 #ifndef _LIBCPP_NO_EXCEPTIONS
   1499     }
   1500     catch (...)
   1501     {
   1502         __is.__set_badbit_and_consider_rethrow();
   1503     }
   1504 #endif  // _LIBCPP_NO_EXCEPTIONS
   1505     return __is;
   1506 }
   1507 
   1508 #ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
   1509 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
   1510 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
   1511 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
   1512 #endif
   1513 
   1514 _LIBCPP_END_NAMESPACE_STD
   1515 
   1516 _LIBCPP_POP_MACROS
   1517 
   1518 #endif  // _LIBCPP_ISTREAM
   1519