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