LCOV - code coverage report
Current view: top level - v1 - istream (source / functions) Coverage Total Hit
Test: vrml_testfiles.info Lines: 77.8 % 36 28
Test Date: 2024-03-08 16:12:17 Functions: 100.0 % 4 4

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

Generated by: LCOV version 2.0-1