13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 33e519524SHoward Hinnant// 457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_ISTREAM 113e519524SHoward Hinnant#define _LIBCPP_ISTREAM 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant istream synopsis 153e519524SHoward Hinnant 163e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> > 173e519524SHoward Hinnantclass basic_istream 183e519524SHoward Hinnant : virtual public basic_ios<charT,traits> 193e519524SHoward Hinnant{ 203e519524SHoward Hinnantpublic: 213e519524SHoward Hinnant // types (inherited from basic_ios (27.5.4)): 223e519524SHoward Hinnant typedef charT char_type; 233e519524SHoward Hinnant typedef traits traits_type; 243e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 253e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 263e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 273e519524SHoward Hinnant 283e519524SHoward Hinnant // 27.7.1.1.1 Constructor/destructor: 293e519524SHoward Hinnant explicit basic_istream(basic_streambuf<char_type, traits_type>* sb); 303e519524SHoward Hinnant basic_istream(basic_istream&& rhs); 313e519524SHoward Hinnant virtual ~basic_istream(); 323e519524SHoward Hinnant 333e519524SHoward Hinnant // 27.7.1.1.2 Assign/swap: 343e519524SHoward Hinnant basic_istream& operator=(basic_istream&& rhs); 353e519524SHoward Hinnant void swap(basic_istream& rhs); 363e519524SHoward Hinnant 373e519524SHoward Hinnant // 27.7.1.1.3 Prefix/suffix: 383e519524SHoward Hinnant class sentry; 393e519524SHoward Hinnant 403e519524SHoward Hinnant // 27.7.1.2 Formatted input: 413e519524SHoward Hinnant basic_istream& operator>>(basic_istream& (*pf)(basic_istream&)); 423e519524SHoward Hinnant basic_istream& operator>>(basic_ios<char_type, traits_type>& 433e519524SHoward Hinnant (*pf)(basic_ios<char_type, traits_type>&)); 443e519524SHoward Hinnant basic_istream& operator>>(ios_base& (*pf)(ios_base&)); 453e519524SHoward Hinnant basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb); 463e519524SHoward Hinnant basic_istream& operator>>(bool& n); 473e519524SHoward Hinnant basic_istream& operator>>(short& n); 483e519524SHoward Hinnant basic_istream& operator>>(unsigned short& n); 493e519524SHoward Hinnant basic_istream& operator>>(int& n); 503e519524SHoward Hinnant basic_istream& operator>>(unsigned int& n); 513e519524SHoward Hinnant basic_istream& operator>>(long& n); 523e519524SHoward Hinnant basic_istream& operator>>(unsigned long& n); 533e519524SHoward Hinnant basic_istream& operator>>(long long& n); 543e519524SHoward Hinnant basic_istream& operator>>(unsigned long long& n); 553e519524SHoward Hinnant basic_istream& operator>>(float& f); 563e519524SHoward Hinnant basic_istream& operator>>(double& f); 573e519524SHoward Hinnant basic_istream& operator>>(long double& f); 583e519524SHoward Hinnant basic_istream& operator>>(void*& p); 593e519524SHoward Hinnant 603e519524SHoward Hinnant // 27.7.1.3 Unformatted input: 613e519524SHoward Hinnant streamsize gcount() const; 623e519524SHoward Hinnant int_type get(); 633e519524SHoward Hinnant basic_istream& get(char_type& c); 643e519524SHoward Hinnant basic_istream& get(char_type* s, streamsize n); 653e519524SHoward Hinnant basic_istream& get(char_type* s, streamsize n, char_type delim); 663e519524SHoward Hinnant basic_istream& get(basic_streambuf<char_type,traits_type>& sb); 673e519524SHoward Hinnant basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim); 683e519524SHoward Hinnant 693e519524SHoward Hinnant basic_istream& getline(char_type* s, streamsize n); 703e519524SHoward Hinnant basic_istream& getline(char_type* s, streamsize n, char_type delim); 713e519524SHoward Hinnant 723e519524SHoward Hinnant basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof()); 733e519524SHoward Hinnant int_type peek(); 743e519524SHoward Hinnant basic_istream& read (char_type* s, streamsize n); 753e519524SHoward Hinnant streamsize readsome(char_type* s, streamsize n); 763e519524SHoward Hinnant 773e519524SHoward Hinnant basic_istream& putback(char_type c); 783e519524SHoward Hinnant basic_istream& unget(); 793e519524SHoward Hinnant int sync(); 803e519524SHoward Hinnant 813e519524SHoward Hinnant pos_type tellg(); 823e519524SHoward Hinnant basic_istream& seekg(pos_type); 833e519524SHoward Hinnant basic_istream& seekg(off_type, ios_base::seekdir); 84f45b237cSMarshall Clowprotected: 85f45b237cSMarshall Clow basic_istream(const basic_istream& rhs) = delete; 86f45b237cSMarshall Clow basic_istream(basic_istream&& rhs); 87f45b237cSMarshall Clow // 27.7.2.1.2 Assign/swap: 88f45b237cSMarshall Clow basic_istream& operator=(const basic_istream& rhs) = delete; 89f45b237cSMarshall Clow basic_istream& operator=(basic_istream&& rhs); 90f45b237cSMarshall Clow void swap(basic_istream& rhs); 913e519524SHoward Hinnant}; 923e519524SHoward Hinnant 933e519524SHoward Hinnant// 27.7.1.2.3 character extraction templates: 943e519524SHoward Hinnanttemplate<class charT, class traits> 953e519524SHoward Hinnant basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); 963e519524SHoward Hinnant 973e519524SHoward Hinnanttemplate<class traits> 983e519524SHoward Hinnant basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&); 993e519524SHoward Hinnant 1003e519524SHoward Hinnanttemplate<class traits> 1013e519524SHoward Hinnant basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&); 1023e519524SHoward Hinnant 1033e519524SHoward Hinnanttemplate<class charT, class traits> 1043e519524SHoward Hinnant basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*); 1053e519524SHoward Hinnant 1063e519524SHoward Hinnanttemplate<class traits> 1073e519524SHoward Hinnant basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*); 1083e519524SHoward Hinnant 1093e519524SHoward Hinnanttemplate<class traits> 1103e519524SHoward Hinnant basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*); 1113e519524SHoward Hinnant 1123e519524SHoward Hinnanttemplate <class charT, class traits> 1133e519524SHoward Hinnant void 1143e519524SHoward Hinnant swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y); 1153e519524SHoward Hinnant 1163e519524SHoward Hinnanttypedef basic_istream<char> istream; 1173e519524SHoward Hinnanttypedef basic_istream<wchar_t> wistream; 1183e519524SHoward Hinnant 1193e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> > 1203e519524SHoward Hinnantclass basic_iostream : 1213e519524SHoward Hinnant public basic_istream<charT,traits>, 1223e519524SHoward Hinnant public basic_ostream<charT,traits> 1233e519524SHoward Hinnant{ 1243e519524SHoward Hinnantpublic: 1253e519524SHoward Hinnant // types: 1263e519524SHoward Hinnant typedef charT char_type; 1273e519524SHoward Hinnant typedef traits traits_type; 1283e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 1293e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 1303e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 1313e519524SHoward Hinnant 1323e519524SHoward Hinnant // constructor/destructor 1333e519524SHoward Hinnant explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb); 1343e519524SHoward Hinnant basic_iostream(basic_iostream&& rhs); 1353e519524SHoward Hinnant virtual ~basic_iostream(); 1363e519524SHoward Hinnant 1373e519524SHoward Hinnant // assign/swap 1383e519524SHoward Hinnant basic_iostream& operator=(basic_iostream&& rhs); 1393e519524SHoward Hinnant void swap(basic_iostream& rhs); 1403e519524SHoward Hinnant}; 1413e519524SHoward Hinnant 1423e519524SHoward Hinnanttemplate <class charT, class traits> 1433e519524SHoward Hinnant void 1443e519524SHoward Hinnant swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y); 1453e519524SHoward Hinnant 1463e519524SHoward Hinnanttypedef basic_iostream<char> iostream; 1473e519524SHoward Hinnanttypedef basic_iostream<wchar_t> wiostream; 1483e519524SHoward Hinnant 1493e519524SHoward Hinnanttemplate <class charT, class traits> 1503e519524SHoward Hinnant basic_istream<charT,traits>& 1513e519524SHoward Hinnant ws(basic_istream<charT,traits>& is); 1523e519524SHoward Hinnant 153c90dee1eSLouis Dionne// rvalue stream extraction 154c90dee1eSLouis Dionnetemplate <class Stream, class T> 155c90dee1eSLouis Dionne Stream&& operator>>(Stream&& is, T&& x); 1563e519524SHoward Hinnant 1573e519524SHoward Hinnant} // std 1583e519524SHoward Hinnant 1593e519524SHoward Hinnant*/ 1603e519524SHoward Hinnant 161385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 1623e519524SHoward Hinnant#include <__config> 163*3cd4531bSNikolas Klauser#include <__iterator/istreambuf_iterator.h> 1646adbc83eSChristopher Di Bella#include <__utility/forward.h> 1653e519524SHoward Hinnant#include <ostream> 166bfbd73f8SArthur O'Dwyer#include <version> 1673e519524SHoward Hinnant 168073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1693e519524SHoward Hinnant# pragma GCC system_header 170073458b1SHoward Hinnant#endif 1713e519524SHoward Hinnant 172a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS 173a016efb1SEric Fiselier#include <__undef_macros> 174a016efb1SEric Fiselier 175a016efb1SEric Fiselier 1763e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1773e519524SHoward Hinnant 1783e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 179e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_istream 1803e519524SHoward Hinnant : virtual public basic_ios<_CharT, _Traits> 1813e519524SHoward Hinnant{ 1823e519524SHoward Hinnant streamsize __gc_; 1833e519524SHoward Hinnantpublic: 1843e519524SHoward Hinnant // types (inherited from basic_ios (27.5.4)): 1853e519524SHoward Hinnant typedef _CharT char_type; 1863e519524SHoward Hinnant typedef _Traits traits_type; 1873e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 1883e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 1893e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 1903e519524SHoward Hinnant 1913e519524SHoward Hinnant // 27.7.1.1.1 Constructor/destructor: 1927833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 193f8f31c49SEric Fiselier explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0) 194f8f31c49SEric Fiselier { this->init(__sb); } 1953e519524SHoward Hinnant virtual ~basic_istream(); 1963e519524SHoward Hinnantprotected: 197f8f31c49SEric Fiselier inline _LIBCPP_INLINE_VISIBILITY 1983e519524SHoward Hinnant basic_istream(basic_istream&& __rhs); 199f0aca21eSEric Fiselier 2003e519524SHoward Hinnant // 27.7.1.1.2 Assign/swap: 201f8f31c49SEric Fiselier inline _LIBCPP_INLINE_VISIBILITY 2023e519524SHoward Hinnant basic_istream& operator=(basic_istream&& __rhs); 203f8f31c49SEric Fiselier 2047833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 205f8f31c49SEric Fiselier void swap(basic_istream& __rhs) { 206f8f31c49SEric Fiselier _VSTD::swap(__gc_, __rhs.__gc_); 207f8f31c49SEric Fiselier basic_ios<char_type, traits_type>::swap(__rhs); 208f8f31c49SEric Fiselier } 209f45b237cSMarshall Clow 21030d0c1abSMarshall Clow basic_istream (const basic_istream& __rhs) = delete; 21130d0c1abSMarshall Clow basic_istream& operator=(const basic_istream& __rhs) = delete; 2123e519524SHoward Hinnantpublic: 2133e519524SHoward Hinnant 2143e519524SHoward Hinnant // 27.7.1.1.3 Prefix/suffix: 215e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS sentry; 2163e519524SHoward Hinnant 2173e519524SHoward Hinnant // 27.7.1.2 Formatted input: 2187833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 219f8f31c49SEric Fiselier basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)) 220f8f31c49SEric Fiselier { return __pf(*this); } 221f8f31c49SEric Fiselier 2227833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2233e519524SHoward Hinnant basic_istream& operator>>(basic_ios<char_type, traits_type>& 224f8f31c49SEric Fiselier (*__pf)(basic_ios<char_type, traits_type>&)) 225f8f31c49SEric Fiselier { __pf(*this); return *this; } 226f8f31c49SEric Fiselier 2277833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 228f8f31c49SEric Fiselier basic_istream& operator>>(ios_base& (*__pf)(ios_base&)) 229f8f31c49SEric Fiselier { __pf(*this); return *this; } 230f8f31c49SEric Fiselier 2313e519524SHoward Hinnant basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb); 2323e519524SHoward Hinnant basic_istream& operator>>(bool& __n); 2333e519524SHoward Hinnant basic_istream& operator>>(short& __n); 2343e519524SHoward Hinnant basic_istream& operator>>(unsigned short& __n); 2353e519524SHoward Hinnant basic_istream& operator>>(int& __n); 2363e519524SHoward Hinnant basic_istream& operator>>(unsigned int& __n); 2373e519524SHoward Hinnant basic_istream& operator>>(long& __n); 2383e519524SHoward Hinnant basic_istream& operator>>(unsigned long& __n); 2393e519524SHoward Hinnant basic_istream& operator>>(long long& __n); 2403e519524SHoward Hinnant basic_istream& operator>>(unsigned long long& __n); 2413e519524SHoward Hinnant basic_istream& operator>>(float& __f); 2423e519524SHoward Hinnant basic_istream& operator>>(double& __f); 2433e519524SHoward Hinnant basic_istream& operator>>(long double& __f); 2443e519524SHoward Hinnant basic_istream& operator>>(void*& __p); 2453e519524SHoward Hinnant 2463e519524SHoward Hinnant // 27.7.1.3 Unformatted input: 2473030b2f1SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2483e519524SHoward Hinnant streamsize gcount() const {return __gc_;} 2493e519524SHoward Hinnant int_type get(); 250f8f31c49SEric Fiselier 2517833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 252f8f31c49SEric Fiselier basic_istream& get(char_type& __c) { 253f8f31c49SEric Fiselier int_type __ch = get(); 254f8f31c49SEric Fiselier if (__ch != traits_type::eof()) 255f8f31c49SEric Fiselier __c = traits_type::to_char_type(__ch); 256f8f31c49SEric Fiselier return *this; 257f8f31c49SEric Fiselier } 258f8f31c49SEric Fiselier 2597833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 260f8f31c49SEric Fiselier basic_istream& get(char_type* __s, streamsize __n) 261f8f31c49SEric Fiselier { return get(__s, __n, this->widen('\n')); } 262f8f31c49SEric Fiselier 2633e519524SHoward Hinnant basic_istream& get(char_type* __s, streamsize __n, char_type __dlm); 264f8f31c49SEric Fiselier 2657833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 266f8f31c49SEric Fiselier basic_istream& get(basic_streambuf<char_type, traits_type>& __sb) 267f8f31c49SEric Fiselier { return get(__sb, this->widen('\n')); } 268f8f31c49SEric Fiselier 2693e519524SHoward Hinnant basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm); 2703e519524SHoward Hinnant 2717833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 272f8f31c49SEric Fiselier basic_istream& getline(char_type* __s, streamsize __n) 273f8f31c49SEric Fiselier { return getline(__s, __n, this->widen('\n')); } 274f8f31c49SEric Fiselier 2753e519524SHoward Hinnant basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm); 2763e519524SHoward Hinnant 2773e519524SHoward Hinnant basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof()); 2783e519524SHoward Hinnant int_type peek(); 2793e519524SHoward Hinnant basic_istream& read (char_type* __s, streamsize __n); 2803e519524SHoward Hinnant streamsize readsome(char_type* __s, streamsize __n); 2813e519524SHoward Hinnant 2823e519524SHoward Hinnant basic_istream& putback(char_type __c); 2833e519524SHoward Hinnant basic_istream& unget(); 2843e519524SHoward Hinnant int sync(); 2853e519524SHoward Hinnant 2863e519524SHoward Hinnant pos_type tellg(); 2873e519524SHoward Hinnant basic_istream& seekg(pos_type __pos); 2883e519524SHoward Hinnant basic_istream& seekg(off_type __off, ios_base::seekdir __dir); 2893e519524SHoward Hinnant}; 2903e519524SHoward Hinnant 2913e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 292e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry 2933e519524SHoward Hinnant{ 2943e519524SHoward Hinnant bool __ok_; 2953e519524SHoward Hinnant 2963e519524SHoward Hinnantpublic: 2973e519524SHoward Hinnant explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); 2983e519524SHoward Hinnant// ~sentry() = default; 2993e519524SHoward Hinnant 3003030b2f1SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 301317e92a3SArthur O'Dwyer explicit operator bool() const {return __ok_;} 302feb80aa9SNikolas Klauser 303feb80aa9SNikolas Klauser sentry(const sentry&) = delete; 304feb80aa9SNikolas Klauser sentry& operator=(const sentry&) = delete; 3053e519524SHoward Hinnant}; 3063e519524SHoward Hinnant 3073e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3083e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, 3093e519524SHoward Hinnant bool __noskipws) 3103e519524SHoward Hinnant : __ok_(false) 3113e519524SHoward Hinnant{ 3123e519524SHoward Hinnant if (__is.good()) 3133e519524SHoward Hinnant { 3143e519524SHoward Hinnant if (__is.tie()) 3153e519524SHoward Hinnant __is.tie()->flush(); 3163e519524SHoward Hinnant if (!__noskipws && (__is.flags() & ios_base::skipws)) 3173e519524SHoward Hinnant { 318c003db1fSHoward Hinnant typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3193e519524SHoward Hinnant const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); 320c003db1fSHoward Hinnant _Ip __i(__is); 321c003db1fSHoward Hinnant _Ip __eof; 3223e519524SHoward Hinnant for (; __i != __eof; ++__i) 3233e519524SHoward Hinnant if (!__ct.is(__ct.space, *__i)) 3243e519524SHoward Hinnant break; 3253e519524SHoward Hinnant if (__i == __eof) 3263e519524SHoward Hinnant __is.setstate(ios_base::failbit | ios_base::eofbit); 3273e519524SHoward Hinnant } 3283e519524SHoward Hinnant __ok_ = __is.good(); 3293e519524SHoward Hinnant } 3303e519524SHoward Hinnant else 3313e519524SHoward Hinnant __is.setstate(ios_base::failbit); 3323e519524SHoward Hinnant} 3333e519524SHoward Hinnant 3343e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3353e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs) 3363e519524SHoward Hinnant : __gc_(__rhs.__gc_) 3373e519524SHoward Hinnant{ 3383e519524SHoward Hinnant __rhs.__gc_ = 0; 3393e519524SHoward Hinnant this->move(__rhs); 3403e519524SHoward Hinnant} 3413e519524SHoward Hinnant 3423e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3433e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 3443e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs) 3453e519524SHoward Hinnant{ 3463e519524SHoward Hinnant swap(__rhs); 3473e519524SHoward Hinnant return *this; 3483e519524SHoward Hinnant} 3493e519524SHoward Hinnant 3503e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3513e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::~basic_istream() 3523e519524SHoward Hinnant{ 3533e519524SHoward Hinnant} 3543e519524SHoward Hinnant 3558b6a5bf9SLouis Dionnetemplate <class _Tp, class _CharT, class _Traits> 3568b6a5bf9SLouis Dionne_LIBCPP_INLINE_VISIBILITY 3573e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 3588b6a5bf9SLouis Dionne__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 359396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 360396145d0SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __s(__is); 361396145d0SLouis Dionne if (__s) 362396145d0SLouis Dionne { 3633e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3643e519524SHoward Hinnant try 3653e519524SHoward Hinnant { 366b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 3678b6a5bf9SLouis Dionne typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3688b6a5bf9SLouis Dionne typedef num_get<_CharT, _Ip> _Fp; 369396145d0SLouis Dionne use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n); 3703e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3713e519524SHoward Hinnant } 3723e519524SHoward Hinnant catch (...) 3733e519524SHoward Hinnant { 374396145d0SLouis Dionne __state |= ios_base::badbit; 375396145d0SLouis Dionne __is.__setstate_nothrow(__state); 376396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 377396145d0SLouis Dionne { 378396145d0SLouis Dionne throw; 3793e519524SHoward Hinnant } 380396145d0SLouis Dionne } 381396145d0SLouis Dionne#endif 382396145d0SLouis Dionne __is.setstate(__state); 383396145d0SLouis Dionne } 3848b6a5bf9SLouis Dionne return __is; 3858b6a5bf9SLouis Dionne} 3868b6a5bf9SLouis Dionne 3878b6a5bf9SLouis Dionnetemplate <class _CharT, class _Traits> 3888b6a5bf9SLouis Dionnebasic_istream<_CharT, _Traits>& 3898b6a5bf9SLouis Dionnebasic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) 3908b6a5bf9SLouis Dionne{ 3918b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<unsigned short>(*this, __n); 3923e519524SHoward Hinnant} 3933e519524SHoward Hinnant 3943e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 3953e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 3963e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) 3973e519524SHoward Hinnant{ 3988b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<unsigned int>(*this, __n); 3993e519524SHoward Hinnant} 4003e519524SHoward Hinnant 4013e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4023e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4033e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(long& __n) 4043e519524SHoward Hinnant{ 4058b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<long>(*this, __n); 4063e519524SHoward Hinnant} 4073e519524SHoward Hinnant 4083e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4093e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4103e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) 4113e519524SHoward Hinnant{ 4128b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<unsigned long>(*this, __n); 4133e519524SHoward Hinnant} 4143e519524SHoward Hinnant 4153e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4163e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4173e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(long long& __n) 4183e519524SHoward Hinnant{ 4198b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<long long>(*this, __n); 4203e519524SHoward Hinnant} 4213e519524SHoward Hinnant 4223e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4233e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4243e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) 4253e519524SHoward Hinnant{ 4268b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<unsigned long long>(*this, __n); 4273e519524SHoward Hinnant} 4283e519524SHoward Hinnant 4293e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4303e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4313e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(float& __n) 4323e519524SHoward Hinnant{ 4338b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<float>(*this, __n); 4343e519524SHoward Hinnant} 4353e519524SHoward Hinnant 4363e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4373e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4383e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(double& __n) 4393e519524SHoward Hinnant{ 4408b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<double>(*this, __n); 4413e519524SHoward Hinnant} 4423e519524SHoward Hinnant 4433e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4443e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4453e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(long double& __n) 4463e519524SHoward Hinnant{ 4478b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<long double>(*this, __n); 4483e519524SHoward Hinnant} 4493e519524SHoward Hinnant 4503e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4513e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4523e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(bool& __n) 4533e519524SHoward Hinnant{ 4548b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<bool>(*this, __n); 4553e519524SHoward Hinnant} 4563e519524SHoward Hinnant 4573e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 4583e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 4593e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(void*& __n) 4603e519524SHoward Hinnant{ 4618b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic<void*>(*this, __n); 4628b6a5bf9SLouis Dionne} 4638b6a5bf9SLouis Dionne 4648b6a5bf9SLouis Dionnetemplate <class _Tp, class _CharT, class _Traits> 4658b6a5bf9SLouis Dionne_LIBCPP_INLINE_VISIBILITY 4668b6a5bf9SLouis Dionnebasic_istream<_CharT, _Traits>& 4678b6a5bf9SLouis Dionne__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 468396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 469396145d0SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __s(__is); 470396145d0SLouis Dionne if (__s) 471396145d0SLouis Dionne { 4723e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 4733e519524SHoward Hinnant try 4743e519524SHoward Hinnant { 475b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 4768b6a5bf9SLouis Dionne typedef istreambuf_iterator<_CharT, _Traits> _Ip; 4778b6a5bf9SLouis Dionne typedef num_get<_CharT, _Ip> _Fp; 4788b6a5bf9SLouis Dionne long __temp; 479396145d0SLouis Dionne use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp); 4808b6a5bf9SLouis Dionne if (__temp < numeric_limits<_Tp>::min()) 4818b6a5bf9SLouis Dionne { 482396145d0SLouis Dionne __state |= ios_base::failbit; 4838b6a5bf9SLouis Dionne __n = numeric_limits<_Tp>::min(); 4848b6a5bf9SLouis Dionne } 4858b6a5bf9SLouis Dionne else if (__temp > numeric_limits<_Tp>::max()) 4868b6a5bf9SLouis Dionne { 487396145d0SLouis Dionne __state |= ios_base::failbit; 4888b6a5bf9SLouis Dionne __n = numeric_limits<_Tp>::max(); 4898b6a5bf9SLouis Dionne } 4908b6a5bf9SLouis Dionne else 491396145d0SLouis Dionne { 4928b6a5bf9SLouis Dionne __n = static_cast<_Tp>(__temp); 4933e519524SHoward Hinnant } 4943e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 4953e519524SHoward Hinnant } 4963e519524SHoward Hinnant catch (...) 4973e519524SHoward Hinnant { 498396145d0SLouis Dionne __state |= ios_base::badbit; 499396145d0SLouis Dionne __is.__setstate_nothrow(__state); 500396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 501396145d0SLouis Dionne { 502396145d0SLouis Dionne throw; 503396145d0SLouis Dionne } 5043e519524SHoward Hinnant } 505b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 506396145d0SLouis Dionne __is.setstate(__state); 507396145d0SLouis Dionne } 5088b6a5bf9SLouis Dionne return __is; 5093e519524SHoward Hinnant} 5103e519524SHoward Hinnant 5113e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 5123e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 5133e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(short& __n) 5143e519524SHoward Hinnant{ 5158b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n); 5163e519524SHoward Hinnant} 5173e519524SHoward Hinnant 5183e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 5193e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 5203e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(int& __n) 5213e519524SHoward Hinnant{ 5228b6a5bf9SLouis Dionne return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n); 5233e519524SHoward Hinnant} 5243e519524SHoward Hinnant 5253e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 526147b25b4SZhihao Yuan_LIBCPP_INLINE_VISIBILITY 5273e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 528147b25b4SZhihao Yuan__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n) 5293e519524SHoward Hinnant{ 530396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 53138b7e748SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 53238b7e748SLouis Dionne if (__sen) 53338b7e748SLouis Dionne { 534396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS 535396145d0SLouis Dionne try 536396145d0SLouis Dionne { 537396145d0SLouis Dionne#endif 5386cd81263SLouis Dionne _CharT* __s = __p; 5393e519524SHoward Hinnant const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); 540147b25b4SZhihao Yuan while (__s != __p + (__n-1)) 5413e519524SHoward Hinnant { 54200d8c245SHoward Hinnant typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 54300d8c245SHoward Hinnant if (_Traits::eq_int_type(__i, _Traits::eof())) 54400d8c245SHoward Hinnant { 545396145d0SLouis Dionne __state |= ios_base::eofbit; 54600d8c245SHoward Hinnant break; 54700d8c245SHoward Hinnant } 54800d8c245SHoward Hinnant _CharT __ch = _Traits::to_char_type(__i); 5493e519524SHoward Hinnant if (__ct.is(__ct.space, __ch)) 5503e519524SHoward Hinnant break; 55100d8c245SHoward Hinnant *__s++ = __ch; 55200d8c245SHoward Hinnant __is.rdbuf()->sbumpc(); 5533e519524SHoward Hinnant } 5543e519524SHoward Hinnant *__s = _CharT(); 5553e519524SHoward Hinnant __is.width(0); 556147b25b4SZhihao Yuan if (__s == __p) 557396145d0SLouis Dionne __state |= ios_base::failbit; 5583e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 5593e519524SHoward Hinnant } 5603e519524SHoward Hinnant catch (...) 5613e519524SHoward Hinnant { 562396145d0SLouis Dionne __state |= ios_base::badbit; 563396145d0SLouis Dionne __is.__setstate_nothrow(__state); 564396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 565396145d0SLouis Dionne { 566396145d0SLouis Dionne throw; 5673e519524SHoward Hinnant } 568396145d0SLouis Dionne } 569396145d0SLouis Dionne#endif 570396145d0SLouis Dionne __is.setstate(__state); 571396145d0SLouis Dionne } 5723e519524SHoward Hinnant return __is; 5733e519524SHoward Hinnant} 5743e519524SHoward Hinnant 575147b25b4SZhihao Yuan#if _LIBCPP_STD_VER > 17 576147b25b4SZhihao Yuan 577147b25b4SZhihao Yuantemplate<class _CharT, class _Traits, size_t _Np> 578147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY 579147b25b4SZhihao Yuanbasic_istream<_CharT, _Traits>& 580147b25b4SZhihao Yuanoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np]) 581147b25b4SZhihao Yuan{ 5826cd81263SLouis Dionne size_t __n = _Np; 583147b25b4SZhihao Yuan if (__is.width() > 0) 584147b25b4SZhihao Yuan __n = _VSTD::min(size_t(__is.width()), _Np); 585147b25b4SZhihao Yuan return _VSTD::__input_c_string(__is, __buf, __n); 586147b25b4SZhihao Yuan} 587147b25b4SZhihao Yuan 588147b25b4SZhihao Yuantemplate<class _Traits, size_t _Np> 589147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY 590147b25b4SZhihao Yuanbasic_istream<char, _Traits>& 591147b25b4SZhihao Yuanoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np]) 592147b25b4SZhihao Yuan{ 593147b25b4SZhihao Yuan return __is >> (char(&)[_Np])__buf; 594147b25b4SZhihao Yuan} 595147b25b4SZhihao Yuan 596147b25b4SZhihao Yuantemplate<class _Traits, size_t _Np> 597147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY 598147b25b4SZhihao Yuanbasic_istream<char, _Traits>& 599147b25b4SZhihao Yuanoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np]) 600147b25b4SZhihao Yuan{ 601147b25b4SZhihao Yuan return __is >> (char(&)[_Np])__buf; 602147b25b4SZhihao Yuan} 603147b25b4SZhihao Yuan 604147b25b4SZhihao Yuan#else 605147b25b4SZhihao Yuan 606147b25b4SZhihao Yuantemplate<class _CharT, class _Traits> 607147b25b4SZhihao Yuaninline _LIBCPP_INLINE_VISIBILITY 608147b25b4SZhihao Yuanbasic_istream<_CharT, _Traits>& 609147b25b4SZhihao Yuanoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s) 610147b25b4SZhihao Yuan{ 611147b25b4SZhihao Yuan streamsize __n = __is.width(); 612147b25b4SZhihao Yuan if (__n <= 0) 613147b25b4SZhihao Yuan __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1; 614147b25b4SZhihao Yuan return _VSTD::__input_c_string(__is, __s, size_t(__n)); 615147b25b4SZhihao Yuan} 616147b25b4SZhihao Yuan 6173e519524SHoward Hinnanttemplate<class _Traits> 618c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 6193e519524SHoward Hinnantbasic_istream<char, _Traits>& 6203e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s) 6213e519524SHoward Hinnant{ 6223e519524SHoward Hinnant return __is >> (char*)__s; 6233e519524SHoward Hinnant} 6243e519524SHoward Hinnant 6253e519524SHoward Hinnanttemplate<class _Traits> 626c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 6273e519524SHoward Hinnantbasic_istream<char, _Traits>& 6283e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, signed char* __s) 6293e519524SHoward Hinnant{ 6303e519524SHoward Hinnant return __is >> (char*)__s; 6313e519524SHoward Hinnant} 6323e519524SHoward Hinnant 633147b25b4SZhihao Yuan#endif // _LIBCPP_STD_VER > 17 634147b25b4SZhihao Yuan 6353e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 6363e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 6373e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c) 6383e519524SHoward Hinnant{ 639396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 64038b7e748SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 64138b7e748SLouis Dionne if (__sen) 64238b7e748SLouis Dionne { 643396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS 644396145d0SLouis Dionne try 645396145d0SLouis Dionne { 646396145d0SLouis Dionne#endif 64773736effSHoward Hinnant typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 64873736effSHoward Hinnant if (_Traits::eq_int_type(__i, _Traits::eof())) 649396145d0SLouis Dionne __state |= ios_base::eofbit | ios_base::failbit; 65073736effSHoward Hinnant else 65173736effSHoward Hinnant __c = _Traits::to_char_type(__i); 6523e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 6533e519524SHoward Hinnant } 6543e519524SHoward Hinnant catch (...) 6553e519524SHoward Hinnant { 656396145d0SLouis Dionne __state |= ios_base::badbit; 657396145d0SLouis Dionne __is.__setstate_nothrow(__state); 658396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 659396145d0SLouis Dionne { 660396145d0SLouis Dionne throw; 6613e519524SHoward Hinnant } 662396145d0SLouis Dionne } 663396145d0SLouis Dionne#endif 664396145d0SLouis Dionne __is.setstate(__state); 665396145d0SLouis Dionne } 6663e519524SHoward Hinnant return __is; 6673e519524SHoward Hinnant} 6683e519524SHoward Hinnant 6693e519524SHoward Hinnanttemplate<class _Traits> 670c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 6713e519524SHoward Hinnantbasic_istream<char, _Traits>& 6723e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c) 6733e519524SHoward Hinnant{ 6743e519524SHoward Hinnant return __is >> (char&)__c; 6753e519524SHoward Hinnant} 6763e519524SHoward Hinnant 6773e519524SHoward Hinnanttemplate<class _Traits> 678c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 6793e519524SHoward Hinnantbasic_istream<char, _Traits>& 6803e519524SHoward Hinnantoperator>>(basic_istream<char, _Traits>& __is, signed char& __c) 6813e519524SHoward Hinnant{ 6823e519524SHoward Hinnant return __is >> (char&)__c; 6833e519524SHoward Hinnant} 6843e519524SHoward Hinnant 6853e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 6863e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 6873e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb) 6883e519524SHoward Hinnant{ 689396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 6903e519524SHoward Hinnant __gc_ = 0; 6913e519524SHoward Hinnant sentry __s(*this, true); 6923e519524SHoward Hinnant if (__s) 6933e519524SHoward Hinnant { 6943e519524SHoward Hinnant if (__sb) 6953e519524SHoward Hinnant { 6963e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 6973e519524SHoward Hinnant try 6983e519524SHoward Hinnant { 699b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 70000d8c245SHoward Hinnant while (true) 7013e519524SHoward Hinnant { 70200d8c245SHoward Hinnant typename traits_type::int_type __i = this->rdbuf()->sgetc(); 70300d8c245SHoward Hinnant if (traits_type::eq_int_type(__i, _Traits::eof())) 70400d8c245SHoward Hinnant { 705396145d0SLouis Dionne __state |= ios_base::eofbit; 7063e519524SHoward Hinnant break; 7073e519524SHoward Hinnant } 70800d8c245SHoward Hinnant if (traits_type::eq_int_type( 70900d8c245SHoward Hinnant __sb->sputc(traits_type::to_char_type(__i)), 71000d8c245SHoward Hinnant traits_type::eof())) 71100d8c245SHoward Hinnant break; 71200d8c245SHoward Hinnant ++__gc_; 71300d8c245SHoward Hinnant this->rdbuf()->sbumpc(); 71400d8c245SHoward Hinnant } 71500d8c245SHoward Hinnant if (__gc_ == 0) 716396145d0SLouis Dionne __state |= ios_base::failbit; 7173e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 7183e519524SHoward Hinnant } 7193e519524SHoward Hinnant catch (...) 7203e519524SHoward Hinnant { 721396145d0SLouis Dionne __state |= ios_base::badbit; 72200d8c245SHoward Hinnant if (__gc_ == 0) 723396145d0SLouis Dionne __state |= ios_base::failbit; 724396145d0SLouis Dionne 725396145d0SLouis Dionne this->__setstate_nothrow(__state); 726396145d0SLouis Dionne if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit) 727396145d0SLouis Dionne { 728396145d0SLouis Dionne throw; 729396145d0SLouis Dionne } 7303e519524SHoward Hinnant } 731b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 7323e519524SHoward Hinnant } 7333e519524SHoward Hinnant else 7343e519524SHoward Hinnant { 735396145d0SLouis Dionne __state |= ios_base::failbit; 7363e519524SHoward Hinnant } 737396145d0SLouis Dionne this->setstate(__state); 738396145d0SLouis Dionne } 7393e519524SHoward Hinnant return *this; 7403e519524SHoward Hinnant} 7413e519524SHoward Hinnant 7423e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 7433e519524SHoward Hinnanttypename basic_istream<_CharT, _Traits>::int_type 7443e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::get() 7453e519524SHoward Hinnant{ 746396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 7473e519524SHoward Hinnant __gc_ = 0; 7483e519524SHoward Hinnant int_type __r = traits_type::eof(); 74938b7e748SLouis Dionne sentry __s(*this, true); 75038b7e748SLouis Dionne if (__s) 75138b7e748SLouis Dionne { 752396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS 753396145d0SLouis Dionne try 754396145d0SLouis Dionne { 755396145d0SLouis Dionne#endif 75600d8c245SHoward Hinnant __r = this->rdbuf()->sbumpc(); 75700d8c245SHoward Hinnant if (traits_type::eq_int_type(__r, traits_type::eof())) 758396145d0SLouis Dionne __state |= ios_base::failbit | ios_base::eofbit; 7593e519524SHoward Hinnant else 76000d8c245SHoward Hinnant __gc_ = 1; 7613e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 7623e519524SHoward Hinnant } 7633e519524SHoward Hinnant catch (...) 7643e519524SHoward Hinnant { 765396145d0SLouis Dionne this->__setstate_nothrow(this->rdstate() | ios_base::badbit); 766396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 767396145d0SLouis Dionne { 768396145d0SLouis Dionne throw; 7693e519524SHoward Hinnant } 770396145d0SLouis Dionne } 771396145d0SLouis Dionne#endif 772396145d0SLouis Dionne this->setstate(__state); 773396145d0SLouis Dionne } 7743e519524SHoward Hinnant return __r; 7753e519524SHoward Hinnant} 7763e519524SHoward Hinnant 7773e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 7783e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 7793e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm) 7803e519524SHoward Hinnant{ 781396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 7823e519524SHoward Hinnant __gc_ = 0; 7833e519524SHoward Hinnant sentry __sen(*this, true); 7843e519524SHoward Hinnant if (__sen) 7853e519524SHoward Hinnant { 7863e519524SHoward Hinnant if (__n > 0) 7873e519524SHoward Hinnant { 788396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS 789396145d0SLouis Dionne try 790396145d0SLouis Dionne { 791396145d0SLouis Dionne#endif 79200d8c245SHoward Hinnant while (__gc_ < __n-1) 7933e519524SHoward Hinnant { 79400d8c245SHoward Hinnant int_type __i = this->rdbuf()->sgetc(); 79500d8c245SHoward Hinnant if (traits_type::eq_int_type(__i, traits_type::eof())) 79600d8c245SHoward Hinnant { 797396145d0SLouis Dionne __state |= ios_base::eofbit; 79800d8c245SHoward Hinnant break; 79900d8c245SHoward Hinnant } 80000d8c245SHoward Hinnant char_type __ch = traits_type::to_char_type(__i); 8013e519524SHoward Hinnant if (traits_type::eq(__ch, __dlm)) 8023e519524SHoward Hinnant break; 80300d8c245SHoward Hinnant *__s++ = __ch; 80400d8c245SHoward Hinnant ++__gc_; 80500d8c245SHoward Hinnant this->rdbuf()->sbumpc(); 8063e519524SHoward Hinnant } 80700d8c245SHoward Hinnant if (__gc_ == 0) 808396145d0SLouis Dionne __state |= ios_base::failbit; 8093e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 8103e519524SHoward Hinnant } 8113e519524SHoward Hinnant catch (...) 8123e519524SHoward Hinnant { 813396145d0SLouis Dionne __state |= ios_base::badbit; 814396145d0SLouis Dionne this->__setstate_nothrow(__state); 815396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 816396145d0SLouis Dionne { 817a051024cSVolodymyr Sapsai if (__n > 0) 818a051024cSVolodymyr Sapsai *__s = char_type(); 819396145d0SLouis Dionne throw; 8203e519524SHoward Hinnant } 821396145d0SLouis Dionne } 822396145d0SLouis Dionne#endif 823396145d0SLouis Dionne } 824396145d0SLouis Dionne else 825396145d0SLouis Dionne { 826396145d0SLouis Dionne __state |= ios_base::failbit; 827396145d0SLouis Dionne } 828396145d0SLouis Dionne 829396145d0SLouis Dionne if (__n > 0) 830396145d0SLouis Dionne *__s = char_type(); 831396145d0SLouis Dionne this->setstate(__state); 832396145d0SLouis Dionne } 833396145d0SLouis Dionne if (__n > 0) 834396145d0SLouis Dionne *__s = char_type(); 8353e519524SHoward Hinnant return *this; 8363e519524SHoward Hinnant} 8373e519524SHoward Hinnant 8383e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 8393e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 8403e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb, 8413e519524SHoward Hinnant char_type __dlm) 8423e519524SHoward Hinnant{ 843396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 8443e519524SHoward Hinnant __gc_ = 0; 8453e519524SHoward Hinnant sentry __sen(*this, true); 8463e519524SHoward Hinnant if (__sen) 8473e519524SHoward Hinnant { 8483e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 8493e519524SHoward Hinnant try 8503e519524SHoward Hinnant { 851b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 85200d8c245SHoward Hinnant while (true) 8533e519524SHoward Hinnant { 85400d8c245SHoward Hinnant typename traits_type::int_type __i = this->rdbuf()->sgetc(); 85500d8c245SHoward Hinnant if (traits_type::eq_int_type(__i, traits_type::eof())) 85600d8c245SHoward Hinnant { 857396145d0SLouis Dionne __state |= ios_base::eofbit; 8583e519524SHoward Hinnant break; 8593e519524SHoward Hinnant } 86000d8c245SHoward Hinnant char_type __ch = traits_type::to_char_type(__i); 86100d8c245SHoward Hinnant if (traits_type::eq(__ch, __dlm)) 86200d8c245SHoward Hinnant break; 86300d8c245SHoward Hinnant if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof())) 86400d8c245SHoward Hinnant break; 86500d8c245SHoward Hinnant ++__gc_; 86600d8c245SHoward Hinnant this->rdbuf()->sbumpc(); 86700d8c245SHoward Hinnant } 8683e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 8693e519524SHoward Hinnant } 8703e519524SHoward Hinnant catch (...) 8713e519524SHoward Hinnant { 872396145d0SLouis Dionne __state |= ios_base::badbit; 873396145d0SLouis Dionne // according to the spec, exceptions here are caught but not rethrown 8743e519524SHoward Hinnant } 875b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 87600d8c245SHoward Hinnant if (__gc_ == 0) 877396145d0SLouis Dionne __state |= ios_base::failbit; 878396145d0SLouis Dionne this->setstate(__state); 8793e519524SHoward Hinnant } 8803e519524SHoward Hinnant return *this; 8813e519524SHoward Hinnant} 8823e519524SHoward Hinnant 8833e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 8843e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 8853e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm) 8863e519524SHoward Hinnant{ 887396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 8883e519524SHoward Hinnant __gc_ = 0; 889396145d0SLouis Dionne sentry __sen(*this, true); 890396145d0SLouis Dionne if (__sen) 891396145d0SLouis Dionne { 8923e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 8933e519524SHoward Hinnant try 8943e519524SHoward Hinnant { 895b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 89600d8c245SHoward Hinnant while (true) 89700d8c245SHoward Hinnant { 89800d8c245SHoward Hinnant typename traits_type::int_type __i = this->rdbuf()->sgetc(); 89900d8c245SHoward Hinnant if (traits_type::eq_int_type(__i, traits_type::eof())) 90000d8c245SHoward Hinnant { 901396145d0SLouis Dionne __state |= ios_base::eofbit; 90200d8c245SHoward Hinnant break; 90300d8c245SHoward Hinnant } 90400d8c245SHoward Hinnant char_type __ch = traits_type::to_char_type(__i); 90500d8c245SHoward Hinnant if (traits_type::eq(__ch, __dlm)) 90600d8c245SHoward Hinnant { 90700d8c245SHoward Hinnant this->rdbuf()->sbumpc(); 90800d8c245SHoward Hinnant ++__gc_; 90900d8c245SHoward Hinnant break; 91000d8c245SHoward Hinnant } 91100d8c245SHoward Hinnant if (__gc_ >= __n-1) 91200d8c245SHoward Hinnant { 913396145d0SLouis Dionne __state |= ios_base::failbit; 91400d8c245SHoward Hinnant break; 91500d8c245SHoward Hinnant } 91600d8c245SHoward Hinnant *__s++ = __ch; 91700d8c245SHoward Hinnant this->rdbuf()->sbumpc(); 91800d8c245SHoward Hinnant ++__gc_; 91900d8c245SHoward Hinnant } 9203e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 9213e519524SHoward Hinnant } 9223e519524SHoward Hinnant catch (...) 9233e519524SHoward Hinnant { 924396145d0SLouis Dionne __state |= ios_base::badbit; 925396145d0SLouis Dionne this->__setstate_nothrow(__state); 926396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 927396145d0SLouis Dionne { 9282eb7f433SVolodymyr Sapsai if (__n > 0) 9292eb7f433SVolodymyr Sapsai *__s = char_type(); 930396145d0SLouis Dionne if (__gc_ == 0) 931396145d0SLouis Dionne __state |= ios_base::failbit; 932396145d0SLouis Dionne throw; 933396145d0SLouis Dionne } 9343e519524SHoward Hinnant } 935b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 936396145d0SLouis Dionne } 937396145d0SLouis Dionne if (__n > 0) 938396145d0SLouis Dionne *__s = char_type(); 939396145d0SLouis Dionne if (__gc_ == 0) 940396145d0SLouis Dionne __state |= ios_base::failbit; 941396145d0SLouis Dionne this->setstate(__state); 9423e519524SHoward Hinnant return *this; 9433e519524SHoward Hinnant} 9443e519524SHoward Hinnant 9453e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 9463e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 9473e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) 9483e519524SHoward Hinnant{ 949396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 9503e519524SHoward Hinnant __gc_ = 0; 951396145d0SLouis Dionne sentry __sen(*this, true); 952396145d0SLouis Dionne if (__sen) 953396145d0SLouis Dionne { 9543e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 9553e519524SHoward Hinnant try 9563e519524SHoward Hinnant { 957b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 95800d8c245SHoward Hinnant if (__n == numeric_limits<streamsize>::max()) 9593e519524SHoward Hinnant { 96000d8c245SHoward Hinnant while (true) 9613e519524SHoward Hinnant { 96200d8c245SHoward Hinnant typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 96300d8c245SHoward Hinnant if (traits_type::eq_int_type(__i, traits_type::eof())) 96400d8c245SHoward Hinnant { 965396145d0SLouis Dionne __state |= ios_base::eofbit; 96600d8c245SHoward Hinnant break; 96700d8c245SHoward Hinnant } 96800d8c245SHoward Hinnant ++__gc_; 969eecacc0fSHoward Hinnant if (traits_type::eq_int_type(__i, __dlm)) 9703e519524SHoward Hinnant break; 9713e519524SHoward Hinnant } 9723e519524SHoward Hinnant } 9733e519524SHoward Hinnant else 9743e519524SHoward Hinnant { 97500d8c245SHoward Hinnant while (__gc_ < __n) 9763e519524SHoward Hinnant { 97700d8c245SHoward Hinnant typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 97800d8c245SHoward Hinnant if (traits_type::eq_int_type(__i, traits_type::eof())) 97900d8c245SHoward Hinnant { 980396145d0SLouis Dionne __state |= ios_base::eofbit; 98100d8c245SHoward Hinnant break; 98200d8c245SHoward Hinnant } 98300d8c245SHoward Hinnant ++__gc_; 984eecacc0fSHoward Hinnant if (traits_type::eq_int_type(__i, __dlm)) 9853e519524SHoward Hinnant break; 9863e519524SHoward Hinnant } 9873e519524SHoward Hinnant } 9883e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 9893e519524SHoward Hinnant } 9903e519524SHoward Hinnant catch (...) 9913e519524SHoward Hinnant { 992396145d0SLouis Dionne __state |= ios_base::badbit; 993396145d0SLouis Dionne this->__setstate_nothrow(__state); 994396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 995396145d0SLouis Dionne { 996396145d0SLouis Dionne throw; 997396145d0SLouis Dionne } 9983e519524SHoward Hinnant } 999b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1000396145d0SLouis Dionne this->setstate(__state); 1001396145d0SLouis Dionne } 10023e519524SHoward Hinnant return *this; 10033e519524SHoward Hinnant} 10043e519524SHoward Hinnant 10053e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 10063e519524SHoward Hinnanttypename basic_istream<_CharT, _Traits>::int_type 10073e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::peek() 10083e519524SHoward Hinnant{ 1009396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 10103e519524SHoward Hinnant __gc_ = 0; 10113e519524SHoward Hinnant int_type __r = traits_type::eof(); 1012396145d0SLouis Dionne sentry __sen(*this, true); 1013396145d0SLouis Dionne if (__sen) 1014396145d0SLouis Dionne { 10153e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 10163e519524SHoward Hinnant try 10173e519524SHoward Hinnant { 1018b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 10193e519524SHoward Hinnant __r = this->rdbuf()->sgetc(); 102066e7ed95SHoward Hinnant if (traits_type::eq_int_type(__r, traits_type::eof())) 1021396145d0SLouis Dionne __state |= ios_base::eofbit; 10223e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 10233e519524SHoward Hinnant } 10243e519524SHoward Hinnant catch (...) 10253e519524SHoward Hinnant { 1026396145d0SLouis Dionne __state |= ios_base::badbit; 1027396145d0SLouis Dionne this->__setstate_nothrow(__state); 1028396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1029396145d0SLouis Dionne { 1030396145d0SLouis Dionne throw; 1031396145d0SLouis Dionne } 10323e519524SHoward Hinnant } 1033b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1034396145d0SLouis Dionne this->setstate(__state); 1035396145d0SLouis Dionne } 10363e519524SHoward Hinnant return __r; 10373e519524SHoward Hinnant} 10383e519524SHoward Hinnant 10393e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 10403e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 10413e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) 10423e519524SHoward Hinnant{ 1043396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 10443e519524SHoward Hinnant __gc_ = 0; 1045396145d0SLouis Dionne sentry __sen(*this, true); 1046396145d0SLouis Dionne if (__sen) 1047396145d0SLouis Dionne { 10483e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 10493e519524SHoward Hinnant try 10503e519524SHoward Hinnant { 1051b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 105265f58f3fSHoward Hinnant __gc_ = this->rdbuf()->sgetn(__s, __n); 105365f58f3fSHoward Hinnant if (__gc_ != __n) 1054396145d0SLouis Dionne __state |= ios_base::failbit | ios_base::eofbit; 10553e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 10563e519524SHoward Hinnant } 10573e519524SHoward Hinnant catch (...) 10583e519524SHoward Hinnant { 1059396145d0SLouis Dionne __state |= ios_base::badbit; 1060396145d0SLouis Dionne this->__setstate_nothrow(__state); 1061396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1062396145d0SLouis Dionne { 1063396145d0SLouis Dionne throw; 1064396145d0SLouis Dionne } 10653e519524SHoward Hinnant } 1066b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1067396145d0SLouis Dionne } 1068396145d0SLouis Dionne else 1069396145d0SLouis Dionne { 1070396145d0SLouis Dionne __state |= ios_base::failbit; 1071396145d0SLouis Dionne } 1072396145d0SLouis Dionne this->setstate(__state); 10733e519524SHoward Hinnant return *this; 10743e519524SHoward Hinnant} 10753e519524SHoward Hinnant 10763e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 10773e519524SHoward Hinnantstreamsize 10783e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n) 10793e519524SHoward Hinnant{ 1080396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 10813b42bdd5SHoward Hinnant __gc_ = 0; 1082396145d0SLouis Dionne sentry __sen(*this, true); 1083396145d0SLouis Dionne if (__sen) 1084396145d0SLouis Dionne { 10859531bbd7SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS 10869531bbd7SMarshall Clow try 10879531bbd7SMarshall Clow { 10889531bbd7SMarshall Clow#endif // _LIBCPP_NO_EXCEPTIONS 108900d8c245SHoward Hinnant streamsize __c = this->rdbuf()->in_avail(); 10903e519524SHoward Hinnant switch (__c) 10913e519524SHoward Hinnant { 10923e519524SHoward Hinnant case -1: 1093396145d0SLouis Dionne __state |= ios_base::eofbit; 10943e519524SHoward Hinnant break; 10953e519524SHoward Hinnant case 0: 10963e519524SHoward Hinnant break; 10973e519524SHoward Hinnant default: 1098396145d0SLouis Dionne __n = _VSTD::min(__c, __n); 1099396145d0SLouis Dionne __gc_ = this->rdbuf()->sgetn(__s, __n); 1100396145d0SLouis Dionne if (__gc_ != __n) 1101396145d0SLouis Dionne __state |= ios_base::failbit | ios_base::eofbit; 110200d8c245SHoward Hinnant break; 11033e519524SHoward Hinnant } 11049531bbd7SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS 11059531bbd7SMarshall Clow } 11069531bbd7SMarshall Clow catch (...) 11079531bbd7SMarshall Clow { 1108396145d0SLouis Dionne __state |= ios_base::badbit; 1109396145d0SLouis Dionne this->__setstate_nothrow(__state); 1110396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1111396145d0SLouis Dionne { 1112396145d0SLouis Dionne throw; 1113396145d0SLouis Dionne } 11149531bbd7SMarshall Clow } 11159531bbd7SMarshall Clow#endif // _LIBCPP_NO_EXCEPTIONS 1116396145d0SLouis Dionne } 1117396145d0SLouis Dionne else 1118396145d0SLouis Dionne { 1119396145d0SLouis Dionne __state |= ios_base::failbit; 1120396145d0SLouis Dionne } 1121396145d0SLouis Dionne this->setstate(__state); 112200d8c245SHoward Hinnant return __gc_; 11233e519524SHoward Hinnant} 11243e519524SHoward Hinnant 11253e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 11263e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 11273e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::putback(char_type __c) 11283e519524SHoward Hinnant{ 1129396145d0SLouis Dionne ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 11303e519524SHoward Hinnant __gc_ = 0; 1131396145d0SLouis Dionne this->clear(__state); 1132396145d0SLouis Dionne sentry __sen(*this, true); 1133396145d0SLouis Dionne if (__sen) 1134396145d0SLouis Dionne { 11353e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 11363e519524SHoward Hinnant try 11373e519524SHoward Hinnant { 1138b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1139527a7fdfSBruce Mitchener if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof()) 1140396145d0SLouis Dionne __state |= ios_base::badbit; 11413e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 11423e519524SHoward Hinnant } 11433e519524SHoward Hinnant catch (...) 11443e519524SHoward Hinnant { 1145396145d0SLouis Dionne __state |= ios_base::badbit; 1146396145d0SLouis Dionne this->__setstate_nothrow(__state); 1147396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1148396145d0SLouis Dionne { 1149396145d0SLouis Dionne throw; 1150396145d0SLouis Dionne } 11513e519524SHoward Hinnant } 1152b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1153396145d0SLouis Dionne } 1154396145d0SLouis Dionne else 1155396145d0SLouis Dionne { 1156396145d0SLouis Dionne __state |= ios_base::failbit; 1157396145d0SLouis Dionne } 1158396145d0SLouis Dionne this->setstate(__state); 11593e519524SHoward Hinnant return *this; 11603e519524SHoward Hinnant} 11613e519524SHoward Hinnant 11623e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 11633e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 11643e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::unget() 11653e519524SHoward Hinnant{ 1166396145d0SLouis Dionne ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 11673e519524SHoward Hinnant __gc_ = 0; 1168396145d0SLouis Dionne this->clear(__state); 1169396145d0SLouis Dionne sentry __sen(*this, true); 1170396145d0SLouis Dionne if (__sen) 1171396145d0SLouis Dionne { 11723e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 11733e519524SHoward Hinnant try 11743e519524SHoward Hinnant { 1175b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1176527a7fdfSBruce Mitchener if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof()) 1177396145d0SLouis Dionne __state |= ios_base::badbit; 11783e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 11793e519524SHoward Hinnant } 11803e519524SHoward Hinnant catch (...) 11813e519524SHoward Hinnant { 1182396145d0SLouis Dionne __state |= ios_base::badbit; 1183396145d0SLouis Dionne this->__setstate_nothrow(__state); 1184396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1185396145d0SLouis Dionne { 1186396145d0SLouis Dionne throw; 1187396145d0SLouis Dionne } 11883e519524SHoward Hinnant } 1189b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1190396145d0SLouis Dionne } 1191396145d0SLouis Dionne else 1192396145d0SLouis Dionne { 1193396145d0SLouis Dionne __state |= ios_base::failbit; 1194396145d0SLouis Dionne } 1195396145d0SLouis Dionne this->setstate(__state); 11963e519524SHoward Hinnant return *this; 11973e519524SHoward Hinnant} 11983e519524SHoward Hinnant 11993e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 12003e519524SHoward Hinnantint 12013e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::sync() 12023e519524SHoward Hinnant{ 1203396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 12043e519524SHoward Hinnant int __r = 0; 1205396145d0SLouis Dionne sentry __sen(*this, true); 1206396145d0SLouis Dionne if (__sen) 1207396145d0SLouis Dionne { 12083e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 12093e519524SHoward Hinnant try 12103e519524SHoward Hinnant { 1211b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1212527a7fdfSBruce Mitchener if (this->rdbuf() == nullptr) 12133e519524SHoward Hinnant return -1; 12143e519524SHoward Hinnant if (this->rdbuf()->pubsync() == -1) 12153e519524SHoward Hinnant { 1216396145d0SLouis Dionne __state |= ios_base::badbit; 12173e519524SHoward Hinnant return -1; 12183e519524SHoward Hinnant } 12193e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 12203e519524SHoward Hinnant } 12213e519524SHoward Hinnant catch (...) 12223e519524SHoward Hinnant { 1223396145d0SLouis Dionne __state |= ios_base::badbit; 1224396145d0SLouis Dionne this->__setstate_nothrow(__state); 1225396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1226396145d0SLouis Dionne { 1227396145d0SLouis Dionne throw; 1228396145d0SLouis Dionne } 12293e519524SHoward Hinnant } 1230b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1231396145d0SLouis Dionne this->setstate(__state); 1232396145d0SLouis Dionne } 12333e519524SHoward Hinnant return __r; 12343e519524SHoward Hinnant} 12353e519524SHoward Hinnant 12363e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 12373e519524SHoward Hinnanttypename basic_istream<_CharT, _Traits>::pos_type 12383e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::tellg() 12393e519524SHoward Hinnant{ 1240396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 12413e519524SHoward Hinnant pos_type __r(-1); 1242396145d0SLouis Dionne sentry __sen(*this, true); 1243396145d0SLouis Dionne if (__sen) 1244396145d0SLouis Dionne { 12453e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 12463e519524SHoward Hinnant try 12473e519524SHoward Hinnant { 1248b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 12493e519524SHoward Hinnant __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); 12503e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 12513e519524SHoward Hinnant } 12523e519524SHoward Hinnant catch (...) 12533e519524SHoward Hinnant { 1254396145d0SLouis Dionne __state |= ios_base::badbit; 1255396145d0SLouis Dionne this->__setstate_nothrow(__state); 1256396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1257396145d0SLouis Dionne { 1258396145d0SLouis Dionne throw; 1259396145d0SLouis Dionne } 12603e519524SHoward Hinnant } 1261b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1262396145d0SLouis Dionne this->setstate(__state); 1263396145d0SLouis Dionne } 12643e519524SHoward Hinnant return __r; 12653e519524SHoward Hinnant} 12663e519524SHoward Hinnant 12673e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 12683e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 12693e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::seekg(pos_type __pos) 12703e519524SHoward Hinnant{ 1271396145d0SLouis Dionne ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 1272396145d0SLouis Dionne this->clear(__state); 1273396145d0SLouis Dionne sentry __sen(*this, true); 1274396145d0SLouis Dionne if (__sen) 1275396145d0SLouis Dionne { 12763e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 12773e519524SHoward Hinnant try 12783e519524SHoward Hinnant { 1279b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 12803e519524SHoward Hinnant if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1)) 1281396145d0SLouis Dionne __state |= ios_base::failbit; 12823e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 12833e519524SHoward Hinnant } 12843e519524SHoward Hinnant catch (...) 12853e519524SHoward Hinnant { 1286396145d0SLouis Dionne __state |= ios_base::badbit; 1287396145d0SLouis Dionne this->__setstate_nothrow(__state); 1288396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1289396145d0SLouis Dionne { 1290396145d0SLouis Dionne throw; 1291396145d0SLouis Dionne } 12923e519524SHoward Hinnant } 1293b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1294396145d0SLouis Dionne this->setstate(__state); 1295396145d0SLouis Dionne } 12963e519524SHoward Hinnant return *this; 12973e519524SHoward Hinnant} 12983e519524SHoward Hinnant 12993e519524SHoward Hinnanttemplate<class _CharT, class _Traits> 13003e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 13013e519524SHoward Hinnantbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) 13023e519524SHoward Hinnant{ 1303396145d0SLouis Dionne ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 1304396145d0SLouis Dionne this->clear(__state); 1305396145d0SLouis Dionne sentry __sen(*this, true); 1306396145d0SLouis Dionne if (__sen) 1307396145d0SLouis Dionne { 13083e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 13093e519524SHoward Hinnant try 13103e519524SHoward Hinnant { 1311b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1312e1bedf4eSMarshall Clow if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1)) 1313396145d0SLouis Dionne __state |= ios_base::failbit; 13143e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 13153e519524SHoward Hinnant } 13163e519524SHoward Hinnant catch (...) 13173e519524SHoward Hinnant { 1318396145d0SLouis Dionne __state |= ios_base::badbit; 1319396145d0SLouis Dionne this->__setstate_nothrow(__state); 1320396145d0SLouis Dionne if (this->exceptions() & ios_base::badbit) 1321396145d0SLouis Dionne { 1322396145d0SLouis Dionne throw; 1323396145d0SLouis Dionne } 13243e519524SHoward Hinnant } 1325b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1326396145d0SLouis Dionne this->setstate(__state); 1327396145d0SLouis Dionne } 13283e519524SHoward Hinnant return *this; 13293e519524SHoward Hinnant} 13303e519524SHoward Hinnant 13313e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 13323e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 13333e519524SHoward Hinnantws(basic_istream<_CharT, _Traits>& __is) 13343e519524SHoward Hinnant{ 1335396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 1336396145d0SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 1337396145d0SLouis Dionne if (__sen) 1338396145d0SLouis Dionne { 13393e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 13403e519524SHoward Hinnant try 13413e519524SHoward Hinnant { 1342b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 13433e519524SHoward Hinnant const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); 134400d8c245SHoward Hinnant while (true) 134500d8c245SHoward Hinnant { 134600d8c245SHoward Hinnant typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 134700d8c245SHoward Hinnant if (_Traits::eq_int_type(__i, _Traits::eof())) 134800d8c245SHoward Hinnant { 1349396145d0SLouis Dionne __state |= ios_base::eofbit; 13503e519524SHoward Hinnant break; 135100d8c245SHoward Hinnant } 135200d8c245SHoward Hinnant if (!__ct.is(__ct.space, _Traits::to_char_type(__i))) 135300d8c245SHoward Hinnant break; 135400d8c245SHoward Hinnant __is.rdbuf()->sbumpc(); 135500d8c245SHoward Hinnant } 13563e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 13573e519524SHoward Hinnant } 13583e519524SHoward Hinnant catch (...) 13593e519524SHoward Hinnant { 1360396145d0SLouis Dionne __state |= ios_base::badbit; 1361396145d0SLouis Dionne __is.__setstate_nothrow(__state); 1362396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 1363396145d0SLouis Dionne { 1364396145d0SLouis Dionne throw; 1365396145d0SLouis Dionne } 13663e519524SHoward Hinnant } 1367b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1368396145d0SLouis Dionne __is.setstate(__state); 1369396145d0SLouis Dionne } 13703e519524SHoward Hinnant return __is; 13713e519524SHoward Hinnant} 13723e519524SHoward Hinnant 1373c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp, class = void> 1374c90dee1eSLouis Dionnestruct __is_istreamable : false_type { }; 1375c90dee1eSLouis Dionne 1376c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp> 1377c90dee1eSLouis Dionnestruct __is_istreamable<_Stream, _Tp, decltype( 1378ab3fcc50SArthur O'Dwyer declval<_Stream>() >> declval<_Tp>(), void() 1379c90dee1eSLouis Dionne)> : true_type { }; 1380c90dee1eSLouis Dionne 1381c90dee1eSLouis Dionnetemplate <class _Stream, class _Tp, class = typename enable_if< 1382c90dee1eSLouis Dionne _And<is_base_of<ios_base, _Stream>, 1383c90dee1eSLouis Dionne __is_istreamable<_Stream&, _Tp&&> >::value 1384c90dee1eSLouis Dionne>::type> 1385c90dee1eSLouis Dionne_LIBCPP_INLINE_VISIBILITY 1386c90dee1eSLouis Dionne_Stream&& operator>>(_Stream&& __is, _Tp&& __x) 13873e519524SHoward Hinnant{ 138863c69ef4SEric Fiselier __is >> _VSTD::forward<_Tp>(__x); 1389c90dee1eSLouis Dionne return _VSTD::move(__is); 13903e519524SHoward Hinnant} 13913e519524SHoward Hinnant 13923e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 1393e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_iostream 13943e519524SHoward Hinnant : public basic_istream<_CharT, _Traits>, 13953e519524SHoward Hinnant public basic_ostream<_CharT, _Traits> 13963e519524SHoward Hinnant{ 13973e519524SHoward Hinnantpublic: 13983e519524SHoward Hinnant // types: 13993e519524SHoward Hinnant typedef _CharT char_type; 14003e519524SHoward Hinnant typedef _Traits traits_type; 14013e519524SHoward Hinnant typedef typename traits_type::int_type int_type; 14023e519524SHoward Hinnant typedef typename traits_type::pos_type pos_type; 14033e519524SHoward Hinnant typedef typename traits_type::off_type off_type; 14043e519524SHoward Hinnant 14053e519524SHoward Hinnant // constructor/destructor 14067833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1407f8f31c49SEric Fiselier explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb) 1408f8f31c49SEric Fiselier : basic_istream<_CharT, _Traits>(__sb) 1409f8f31c49SEric Fiselier {} 1410f8f31c49SEric Fiselier 14113e519524SHoward Hinnant virtual ~basic_iostream(); 14123e519524SHoward Hinnantprotected: 1413f8f31c49SEric Fiselier inline _LIBCPP_INLINE_VISIBILITY 14143e519524SHoward Hinnant basic_iostream(basic_iostream&& __rhs); 14153e519524SHoward Hinnant 14163e519524SHoward Hinnant // assign/swap 1417f8f31c49SEric Fiselier inline _LIBCPP_INLINE_VISIBILITY 14183e519524SHoward Hinnant basic_iostream& operator=(basic_iostream&& __rhs); 1419a8d1182fSArthur O'Dwyer 14207833b88aSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 1421f8f31c49SEric Fiselier void swap(basic_iostream& __rhs) 1422f8f31c49SEric Fiselier { basic_istream<char_type, traits_type>::swap(__rhs); } 14233e519524SHoward Hinnant}; 14243e519524SHoward Hinnant 14253e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 14263e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs) 1427ce48a113SHoward Hinnant : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)) 14283e519524SHoward Hinnant{ 14293e519524SHoward Hinnant} 14303e519524SHoward Hinnant 14313e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 14323e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>& 14333e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs) 14343e519524SHoward Hinnant{ 14353e519524SHoward Hinnant swap(__rhs); 14363e519524SHoward Hinnant return *this; 14373e519524SHoward Hinnant} 14383e519524SHoward Hinnant 14393e519524SHoward Hinnanttemplate <class _CharT, class _Traits> 14403e519524SHoward Hinnantbasic_iostream<_CharT, _Traits>::~basic_iostream() 14413e519524SHoward Hinnant{ 14423e519524SHoward Hinnant} 14433e519524SHoward Hinnant 14443e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator> 14453e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 14463e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, 14473e519524SHoward Hinnant basic_string<_CharT, _Traits, _Allocator>& __str) 14483e519524SHoward Hinnant{ 1449396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 145038b7e748SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 145138b7e748SLouis Dionne if (__sen) 145238b7e748SLouis Dionne { 1453396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS 1454396145d0SLouis Dionne try 1455396145d0SLouis Dionne { 1456396145d0SLouis Dionne#endif 14573e519524SHoward Hinnant __str.clear(); 14583e519524SHoward Hinnant streamsize __n = __is.width(); 145900d8c245SHoward Hinnant if (__n <= 0) 14603e519524SHoward Hinnant __n = __str.max_size(); 146100d8c245SHoward Hinnant if (__n <= 0) 14623e519524SHoward Hinnant __n = numeric_limits<streamsize>::max(); 14633e519524SHoward Hinnant streamsize __c = 0; 14643e519524SHoward Hinnant const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); 146500d8c245SHoward Hinnant while (__c < __n) 14663e519524SHoward Hinnant { 146700d8c245SHoward Hinnant typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 146800d8c245SHoward Hinnant if (_Traits::eq_int_type(__i, _Traits::eof())) 146900d8c245SHoward Hinnant { 1470396145d0SLouis Dionne __state |= ios_base::eofbit; 147100d8c245SHoward Hinnant break; 147200d8c245SHoward Hinnant } 147300d8c245SHoward Hinnant _CharT __ch = _Traits::to_char_type(__i); 14743e519524SHoward Hinnant if (__ct.is(__ct.space, __ch)) 14753e519524SHoward Hinnant break; 14763e519524SHoward Hinnant __str.push_back(__ch); 147700d8c245SHoward Hinnant ++__c; 147800d8c245SHoward Hinnant __is.rdbuf()->sbumpc(); 14793e519524SHoward Hinnant } 14803e519524SHoward Hinnant __is.width(0); 14813e519524SHoward Hinnant if (__c == 0) 1482396145d0SLouis Dionne __state |= ios_base::failbit; 14833e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 14843e519524SHoward Hinnant } 14853e519524SHoward Hinnant catch (...) 14863e519524SHoward Hinnant { 1487396145d0SLouis Dionne __state |= ios_base::badbit; 1488396145d0SLouis Dionne __is.__setstate_nothrow(__state); 1489396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 1490396145d0SLouis Dionne { 1491396145d0SLouis Dionne throw; 14923e519524SHoward Hinnant } 1493396145d0SLouis Dionne } 1494396145d0SLouis Dionne#endif 1495396145d0SLouis Dionne __is.setstate(__state); 1496396145d0SLouis Dionne } 14973e519524SHoward Hinnant return __is; 14983e519524SHoward Hinnant} 14993e519524SHoward Hinnant 15003e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator> 15013e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 15023e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>& __is, 15033e519524SHoward Hinnant basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) 15043e519524SHoward Hinnant{ 1505396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 150638b7e748SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 150738b7e748SLouis Dionne if (__sen) 150838b7e748SLouis Dionne { 1509396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS 1510396145d0SLouis Dionne try 1511396145d0SLouis Dionne { 1512396145d0SLouis Dionne#endif 15133e519524SHoward Hinnant __str.clear(); 15141ed7df11SHoward Hinnant streamsize __extr = 0; 151500d8c245SHoward Hinnant while (true) 15163e519524SHoward Hinnant { 151700d8c245SHoward Hinnant typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 151800d8c245SHoward Hinnant if (_Traits::eq_int_type(__i, _Traits::eof())) 151900d8c245SHoward Hinnant { 1520396145d0SLouis Dionne __state |= ios_base::eofbit; 152100d8c245SHoward Hinnant break; 152200d8c245SHoward Hinnant } 15231ed7df11SHoward Hinnant ++__extr; 152400d8c245SHoward Hinnant _CharT __ch = _Traits::to_char_type(__i); 15253e519524SHoward Hinnant if (_Traits::eq(__ch, __dlm)) 15263e519524SHoward Hinnant break; 152700d8c245SHoward Hinnant __str.push_back(__ch); 152800d8c245SHoward Hinnant if (__str.size() == __str.max_size()) 15293e519524SHoward Hinnant { 1530396145d0SLouis Dionne __state |= ios_base::failbit; 15313e519524SHoward Hinnant break; 15323e519524SHoward Hinnant } 15333e519524SHoward Hinnant } 15341ed7df11SHoward Hinnant if (__extr == 0) 1535396145d0SLouis Dionne __state |= ios_base::failbit; 15363e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 15373e519524SHoward Hinnant } 15383e519524SHoward Hinnant catch (...) 15393e519524SHoward Hinnant { 1540396145d0SLouis Dionne __state |= ios_base::badbit; 1541396145d0SLouis Dionne __is.__setstate_nothrow(__state); 1542396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 1543396145d0SLouis Dionne { 1544396145d0SLouis Dionne throw; 15453e519524SHoward Hinnant } 1546396145d0SLouis Dionne } 1547396145d0SLouis Dionne#endif 1548396145d0SLouis Dionne __is.setstate(__state); 1549396145d0SLouis Dionne } 15503e519524SHoward Hinnant return __is; 15513e519524SHoward Hinnant} 15523e519524SHoward Hinnant 15533e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator> 1554c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 15553e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 15563e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>& __is, 15573e519524SHoward Hinnant basic_string<_CharT, _Traits, _Allocator>& __str) 15583e519524SHoward Hinnant{ 15593e519524SHoward Hinnant return getline(__is, __str, __is.widen('\n')); 15603e519524SHoward Hinnant} 15613e519524SHoward Hinnant 15623e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator> 1563c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 15643e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 15653e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>&& __is, 15663e519524SHoward Hinnant basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) 15673e519524SHoward Hinnant{ 15683e519524SHoward Hinnant return getline(__is, __str, __dlm); 15693e519524SHoward Hinnant} 15703e519524SHoward Hinnant 15713e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator> 1572c86b3920SEvgeniy Stepanovinline _LIBCPP_INLINE_VISIBILITY 15733e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 15743e519524SHoward Hinnantgetline(basic_istream<_CharT, _Traits>&& __is, 15753e519524SHoward Hinnant basic_string<_CharT, _Traits, _Allocator>& __str) 15763e519524SHoward Hinnant{ 15773e519524SHoward Hinnant return getline(__is, __str, __is.widen('\n')); 15783e519524SHoward Hinnant} 15793e519524SHoward Hinnant 15803e519524SHoward Hinnanttemplate <class _CharT, class _Traits, size_t _Size> 15813e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 15823e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) 15833e519524SHoward Hinnant{ 1584396145d0SLouis Dionne ios_base::iostate __state = ios_base::goodbit; 158538b7e748SLouis Dionne typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 158638b7e748SLouis Dionne if (__sen) 158738b7e748SLouis Dionne { 1588396145d0SLouis Dionne#ifndef _LIBCPP_NO_EXCEPTIONS 1589396145d0SLouis Dionne try 1590396145d0SLouis Dionne { 1591396145d0SLouis Dionne#endif 15923e519524SHoward Hinnant basic_string<_CharT, _Traits> __str; 15933e519524SHoward Hinnant const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); 1594aec08784SEric Fiselier size_t __c = 0; 15953e519524SHoward Hinnant _CharT __zero = __ct.widen('0'); 15963e519524SHoward Hinnant _CharT __one = __ct.widen('1'); 1597e39095a3SLouis Dionne while (__c != _Size) 15983e519524SHoward Hinnant { 159900d8c245SHoward Hinnant typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 160000d8c245SHoward Hinnant if (_Traits::eq_int_type(__i, _Traits::eof())) 160100d8c245SHoward Hinnant { 1602396145d0SLouis Dionne __state |= ios_base::eofbit; 160300d8c245SHoward Hinnant break; 160400d8c245SHoward Hinnant } 160500d8c245SHoward Hinnant _CharT __ch = _Traits::to_char_type(__i); 160600d8c245SHoward Hinnant if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one)) 16073e519524SHoward Hinnant break; 16083e519524SHoward Hinnant __str.push_back(__ch); 160900d8c245SHoward Hinnant ++__c; 161000d8c245SHoward Hinnant __is.rdbuf()->sbumpc(); 16113e519524SHoward Hinnant } 16123e519524SHoward Hinnant __x = bitset<_Size>(__str); 1613fc4486c2SLouis Dionne if (_Size > 0 && __c == 0) 1614396145d0SLouis Dionne __state |= ios_base::failbit; 16153e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 16163e519524SHoward Hinnant } 16173e519524SHoward Hinnant catch (...) 16183e519524SHoward Hinnant { 1619396145d0SLouis Dionne __state |= ios_base::badbit; 1620396145d0SLouis Dionne __is.__setstate_nothrow(__state); 1621396145d0SLouis Dionne if (__is.exceptions() & ios_base::badbit) 1622396145d0SLouis Dionne { 1623396145d0SLouis Dionne throw; 16243e519524SHoward Hinnant } 1625396145d0SLouis Dionne } 1626396145d0SLouis Dionne#endif 1627396145d0SLouis Dionne __is.setstate(__state); 1628396145d0SLouis Dionne } 16293e519524SHoward Hinnant return __is; 16303e519524SHoward Hinnant} 16313e519524SHoward Hinnant 16322ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>; 1633f4c1258dSLouis Dionne#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 16342ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>; 1635f4c1258dSLouis Dionne#endif 16362ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>; 16373e519524SHoward Hinnant 16383e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 16393e519524SHoward Hinnant 1640a016efb1SEric Fiselier_LIBCPP_POP_MACROS 1641a016efb1SEric Fiselier 16423e519524SHoward Hinnant#endif // _LIBCPP_ISTREAM 1643