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