istream.tcc revision 117397
1139823Simp// istream classes -*- C++ -*- 2133920Sandre 3133920Sandre// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 4133920Sandre// Free Software Foundation, Inc. 5133920Sandre// 6133920Sandre// This file is part of the GNU ISO C++ Library. This library is free 7133920Sandre// software; you can redistribute it and/or modify it under the 8133920Sandre// terms of the GNU General Public License as published by the 9133920Sandre// Free Software Foundation; either version 2, or (at your option) 10133920Sandre// any later version. 11133920Sandre 12133920Sandre// This library is distributed in the hope that it will be useful, 13133920Sandre// but WITHOUT ANY WARRANTY; without even the implied warranty of 14133920Sandre// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15133920Sandre// GNU General Public License for more details. 16133920Sandre 17133920Sandre// You should have received a copy of the GNU General Public License along 18133920Sandre// with this library; see the file COPYING. If not, write to the Free 19133920Sandre// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 20133920Sandre// USA. 21133920Sandre 22133920Sandre// As a special exception, you may use this file as part of a free software 23133920Sandre// library without restriction. Specifically, if other files instantiate 24133920Sandre// templates or use macros or inline functions from this file, or you compile 25133920Sandre// this file and link it with other files to produce an executable, this 26133920Sandre// file does not by itself cause the resulting executable to be covered by 27172467Ssilby// the GNU General Public License. This exception does not however 28172467Ssilby// invalidate any other reasons why the executable file might be covered by 29172467Ssilby// the GNU General Public License. 30225518Sjhb 31133920Sandre// 32225793Sbz// ISO C++ 14882: 27.6.2 Output streams 33133920Sandre// 34133920Sandre 35133920Sandre#pragma GCC system_header 36133920Sandre 37133920Sandre#include <locale> 38133920Sandre#include <ostream> // For flush() 39133920Sandre 40133920Sandrenamespace std 41133920Sandre{ 42133920Sandre template<typename _CharT, typename _Traits> 43185895Szec basic_istream<_CharT, _Traits>::sentry:: 44185895Szec sentry(basic_istream<_CharT, _Traits>& __in, bool __noskipws) 45133920Sandre { 46133920Sandre if (__in.good()) 47133920Sandre { 48133920Sandre if (__in.tie()) 49133920Sandre __in.tie()->flush(); 50240099Smelifaro if (!__noskipws && (__in.flags() & ios_base::skipws)) 51133920Sandre { 52196423Sjulian const __int_type __eof = traits_type::eof(); 53133920Sandre __streambuf_type* __sb = __in.rdbuf(); 54133920Sandre __int_type __c = __sb->sgetc(); 55133920Sandre 56133920Sandre if (__in._M_check_facet(__in._M_fctype)) 57133920Sandre while (!traits_type::eq_int_type(__c, __eof) 58133920Sandre && __in._M_fctype->is(ctype_base::space, 59223593Sglebius traits_type::to_char_type(__c))) 60223593Sglebius __c = __sb->snextc(); 61223593Sglebius 62223593Sglebius#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 63240494Sglebius//195. Should basic_istream::sentry's constructor ever set eofbit? 64201124Sluigi if (traits_type::eq_int_type(__c, __eof)) 65133920Sandre __in.setstate(ios_base::eofbit); 66240494Sglebius#endif 67240494Sglebius } 68133920Sandre } 69133920Sandre 70215701Sdim if (__in.good()) 71200601Sluigi _M_ok = true; 72200601Sluigi else 73158470Smlaier { 74215701Sdim _M_ok = false; 75200601Sluigi __in.setstate(ios_base::failbit); 76158470Smlaier } 77133920Sandre } 78240099Smelifaro 79240099Smelifaro template<typename _CharT, typename _Traits> 80240099Smelifaro basic_istream<_CharT, _Traits>& 81158470Smlaier basic_istream<_CharT, _Traits>:: 82158470Smlaier operator>>(__istream_type& (*__pf)(__istream_type&)) 83136714Sandre { 84201527Sluigi __pf(*this); 85240099Smelifaro return *this; 86240099Smelifaro } 87240099Smelifaro 88240099Smelifaro template<typename _CharT, typename _Traits> 89133920Sandre basic_istream<_CharT, _Traits>& 90200601Sluigi basic_istream<_CharT, _Traits>:: 91204591Sluigi operator>>(__ios_type& (*__pf)(__ios_type&)) 92204591Sluigi { 93204591Sluigi __pf(*this); 94200601Sluigi return *this; 95200601Sluigi } 96200601Sluigi 97200601Sluigi template<typename _CharT, typename _Traits> 98200601Sluigi basic_istream<_CharT, _Traits>& 99200601Sluigi basic_istream<_CharT, _Traits>:: 100200601Sluigi operator>>(ios_base& (*__pf)(ios_base&)) 101200601Sluigi { 102200601Sluigi __pf(*this); 103200601Sluigi return *this; 104204591Sluigi } 105240099Smelifaro 106240099Smelifaro template<typename _CharT, typename _Traits> 107240099Smelifaro basic_istream<_CharT, _Traits>& 108240099Smelifaro basic_istream<_CharT, _Traits>:: 109240099Smelifaro operator>>(bool& __n) 110204591Sluigi { 111204591Sluigi sentry __cerb(*this, false); 112200601Sluigi if (__cerb) 113200601Sluigi { 114201122Sluigi try 115201122Sluigi { 116201122Sluigi ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 117201122Sluigi if (_M_check_facet(_M_fnumget)) 118201122Sluigi _M_fnumget->get(*this, 0, *this, __err, __n); 119240099Smelifaro this->setstate(__err); 120240099Smelifaro } 121135920Smlaier catch(...) 122133920Sandre { 123133920Sandre // 27.6.1.2.1 Common requirements. 124201527Sluigi // Turn this on without causing an ios::failure to be thrown. 125201122Sluigi this->_M_setstate(ios_base::badbit); 126201122Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 127133920Sandre __throw_exception_again; 128201122Sluigi } 129201122Sluigi } 130133920Sandre return *this; 131133920Sandre } 132173399Soleg 133201527Sluigi template<typename _CharT, typename _Traits> 134201527Sluigi basic_istream<_CharT, _Traits>& 135201527Sluigi basic_istream<_CharT, _Traits>:: 136201527Sluigi operator>>(short& __n) 137201527Sluigi { 138201527Sluigi sentry __cerb(*this, false); 139201527Sluigi if (__cerb) 140201527Sluigi { 141241359Sglebius try 142223358Sae { 143133920Sandre ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 144133920Sandre long __l; 145133920Sandre if (_M_check_facet(_M_fnumget)) 146201122Sluigi _M_fnumget->get(*this, 0, *this, __err, __l); 147135920Smlaier#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 148133920Sandre // 118. basic_istream uses nonexistent num_get member functions. 149201527Sluigi if (!(__err & ios_base::failbit) 150201527Sluigi && (numeric_limits<short>::min() <= __l 151191570Soleg && __l <= numeric_limits<short>::max())) 152140224Sglebius __n = __l; 153140224Sglebius else 154133920Sandre __err |= ios_base::failbit; 155201122Sluigi#endif 156201122Sluigi this->setstate(__err); 157140224Sglebius } 158140224Sglebius catch(...) 159201122Sluigi { 160225044Sbz // 27.6.1.2.1 Common requirements. 161206845Sluigi // Turn this on without causing an ios::failure to be thrown. 162242079Sae this->_M_setstate(ios_base::badbit); 163201122Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 164201122Sluigi __throw_exception_again; 165201527Sluigi } 166201527Sluigi } 167225044Sbz return *this; 168201527Sluigi } 169225044Sbz 170225044Sbz template<typename _CharT, typename _Traits> 171225044Sbz basic_istream<_CharT, _Traits>& 172225044Sbz basic_istream<_CharT, _Traits>:: 173225044Sbz operator>>(unsigned short& __n) 174225044Sbz { 175225044Sbz sentry __cerb(*this, false); 176225044Sbz if (__cerb) 177225044Sbz { 178225044Sbz try 179225044Sbz { 180225044Sbz ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 181201122Sluigi if (_M_check_facet(_M_fnumget)) 182201122Sluigi _M_fnumget->get(*this, 0, *this, __err, __n); 183201122Sluigi this->setstate(__err); 184201122Sluigi } 185201122Sluigi catch(...) 186201122Sluigi { 187201122Sluigi // 27.6.1.2.1 Common requirements. 188201122Sluigi // Turn this on without causing an ios::failure to be thrown. 189201122Sluigi this->_M_setstate(ios_base::badbit); 190225044Sbz if ((this->exceptions() & ios_base::badbit) != 0) 191225044Sbz __throw_exception_again; 192201122Sluigi } 193201122Sluigi } 194201122Sluigi return *this; 195201122Sluigi } 196201122Sluigi 197225044Sbz template<typename _CharT, typename _Traits> 198225044Sbz basic_istream<_CharT, _Traits>& 199225044Sbz basic_istream<_CharT, _Traits>:: 200225044Sbz operator>>(int& __n) 201225044Sbz { 202242463Sae sentry __cerb(*this, false); 203225044Sbz if (__cerb) 204225044Sbz { 205225044Sbz try 206225044Sbz { 207225044Sbz ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 208225044Sbz long __l; 209225044Sbz if (_M_check_facet(_M_fnumget)) 210242463Sae _M_fnumget->get(*this, 0, *this, __err, __l); 211225044Sbz#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 212225044Sbz // 118. basic_istream uses nonexistent num_get member functions. 213133920Sandre if (!(__err & ios_base::failbit) 214201527Sluigi && (numeric_limits<int>::min() <= __l 215242079Sae && __l <= numeric_limits<int>::max())) 216201122Sluigi __n = __l; 217133920Sandre else 218140224Sglebius __err |= ios_base::failbit; 219201122Sluigi#endif 220201122Sluigi this->setstate(__err); 221140224Sglebius } 222140224Sglebius catch(...) 223201122Sluigi { 224193502Sluigi // 27.6.1.2.1 Common requirements. 225201122Sluigi // Turn this on without causing an ios::failure to be thrown. 226145246Sbrooks this->_M_setstate(ios_base::badbit); 227201122Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 228145246Sbrooks __throw_exception_again; 229201122Sluigi } 230201122Sluigi } 231201122Sluigi return *this; 232201122Sluigi } 233201122Sluigi 234201122Sluigi template<typename _CharT, typename _Traits> 235201122Sluigi basic_istream<_CharT, _Traits>& 236201122Sluigi basic_istream<_CharT, _Traits>:: 237201122Sluigi operator>>(unsigned int& __n) 238201122Sluigi { 239173399Soleg sentry __cerb(*this, false); 240173399Soleg if (__cerb) 241140224Sglebius { 242140224Sglebius try 243140224Sglebius { 244140224Sglebius ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 245201122Sluigi if (_M_check_facet(_M_fnumget)) 246201122Sluigi _M_fnumget->get(*this, 0, *this, __err, __n); 247201122Sluigi this->setstate(__err); 248201122Sluigi } 249201527Sluigi catch(...) 250201527Sluigi { 251201527Sluigi // 27.6.1.2.1 Common requirements. 252201527Sluigi // Turn this on without causing an ios::failure to be thrown. 253201527Sluigi this->_M_setstate(ios_base::badbit); 254201122Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 255140224Sglebius __throw_exception_again; 256141351Sglebius } 257141351Sglebius } 258201732Sluigi return *this; 259201122Sluigi } 260201122Sluigi 261201122Sluigi template<typename _CharT, typename _Traits> 262201122Sluigi basic_istream<_CharT, _Traits>& 263201122Sluigi basic_istream<_CharT, _Traits>:: 264201122Sluigi operator>>(long& __n) 265201122Sluigi { 266201122Sluigi sentry __cerb(*this, false); 267141351Sglebius if (__cerb) 268165648Spiso { 269213254Sluigi try 270213254Sluigi { 271213254Sluigi ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 272213254Sluigi if (_M_check_facet(_M_fnumget)) 273213254Sluigi _M_fnumget->get(*this, 0, *this, __err, __n); 274201122Sluigi this->setstate(__err); 275165648Spiso } 276190633Spiso catch(...) 277140224Sglebius { 278140224Sglebius // 27.6.1.2.1 Common requirements. 279140224Sglebius // Turn this on without causing an ios::failure to be thrown. 280140224Sglebius this->_M_setstate(ios_base::badbit); 281201122Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 282201122Sluigi __throw_exception_again; 283201527Sluigi } 284201122Sluigi } 285201122Sluigi return *this; 286241245Sglebius } 287201122Sluigi 288133920Sandre template<typename _CharT, typename _Traits> 289133920Sandre basic_istream<_CharT, _Traits>& 290240099Smelifaro basic_istream<_CharT, _Traits>:: 291240099Smelifaro operator>>(unsigned long& __n) 292240099Smelifaro { 293240099Smelifaro sentry __cerb(*this, false); 294240099Smelifaro if (__cerb) 295240099Smelifaro { 296240099Smelifaro try 297240099Smelifaro { 298240099Smelifaro ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 299240099Smelifaro if (_M_check_facet(_M_fnumget)) 300240099Smelifaro _M_fnumget->get(*this, 0, *this, __err, __n); 301240099Smelifaro this->setstate(__err); 302240099Smelifaro } 303240099Smelifaro catch(...) 304240099Smelifaro { 305240099Smelifaro // 27.6.1.2.1 Common requirements. 306240099Smelifaro // Turn this on without causing an ios::failure to be thrown. 307240099Smelifaro this->_M_setstate(ios_base::badbit); 308240099Smelifaro if ((this->exceptions() & ios_base::badbit) != 0) 309240099Smelifaro __throw_exception_again; 310240099Smelifaro } 311240099Smelifaro } 312240099Smelifaro return *this; 313240099Smelifaro } 314240099Smelifaro 315240099Smelifaro#ifdef _GLIBCPP_USE_LONG_LONG 316240099Smelifaro template<typename _CharT, typename _Traits> 317240099Smelifaro basic_istream<_CharT, _Traits>& 318240099Smelifaro basic_istream<_CharT, _Traits>:: 319240099Smelifaro operator>>(long long& __n) 320240099Smelifaro { 321240099Smelifaro sentry __cerb(*this, false); 322240099Smelifaro if (__cerb) 323240099Smelifaro { 324240099Smelifaro try 325240099Smelifaro { 326240099Smelifaro ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 327240099Smelifaro if (_M_check_facet(_M_fnumget)) 328240099Smelifaro _M_fnumget->get(*this, 0, *this, __err, __n); 329240099Smelifaro this->setstate(__err); 330240099Smelifaro } 331240099Smelifaro catch(...) 332240099Smelifaro { 333240099Smelifaro // 27.6.1.2.1 Common requirements. 334240099Smelifaro // Turn this on without causing an ios::failure to be thrown. 335240099Smelifaro this->_M_setstate(ios_base::badbit); 336240099Smelifaro if ((this->exceptions() & ios_base::badbit) != 0) 337240099Smelifaro __throw_exception_again; 338240099Smelifaro } 339240099Smelifaro } 340240099Smelifaro return *this; 341240099Smelifaro } 342240099Smelifaro 343240099Smelifaro template<typename _CharT, typename _Traits> 344240099Smelifaro basic_istream<_CharT, _Traits>& 345240099Smelifaro basic_istream<_CharT, _Traits>:: 346240099Smelifaro operator>>(unsigned long long& __n) 347240099Smelifaro { 348240099Smelifaro sentry __cerb(*this, false); 349243882Sglebius if (__cerb) 350240099Smelifaro { 351240099Smelifaro try 352240099Smelifaro { 353240099Smelifaro ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 354240099Smelifaro if (_M_check_facet(_M_fnumget)) 355240099Smelifaro _M_fnumget->get(*this, 0, *this, __err, __n); 356240099Smelifaro this->setstate(__err); 357240099Smelifaro } 358240099Smelifaro catch(...) 359240099Smelifaro { 360240099Smelifaro // 27.6.1.2.1 Common requirements. 361240099Smelifaro // Turn this on without causing an ios::failure to be thrown. 362240099Smelifaro this->_M_setstate(ios_base::badbit); 363240099Smelifaro if ((this->exceptions() & ios_base::badbit) != 0) 364240099Smelifaro __throw_exception_again; 365240099Smelifaro } 366240099Smelifaro } 367240099Smelifaro return *this; 368240099Smelifaro } 369240099Smelifaro#endif 370240099Smelifaro 371240099Smelifaro template<typename _CharT, typename _Traits> 372240099Smelifaro basic_istream<_CharT, _Traits>& 373240099Smelifaro basic_istream<_CharT, _Traits>:: 374240099Smelifaro operator>>(float& __n) 375240099Smelifaro { 376240099Smelifaro sentry __cerb(*this, false); 377240099Smelifaro if (__cerb) 378240099Smelifaro { 379240099Smelifaro try 380240099Smelifaro { 381240099Smelifaro ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 382240099Smelifaro if (_M_check_facet(_M_fnumget)) 383240099Smelifaro _M_fnumget->get(*this, 0, *this, __err, __n); 384240099Smelifaro this->setstate(__err); 385240099Smelifaro } 386240099Smelifaro catch(...) 387240099Smelifaro { 388240099Smelifaro // 27.6.1.2.1 Common requirements. 389240099Smelifaro // Turn this on without causing an ios::failure to be thrown. 390240099Smelifaro this->_M_setstate(ios_base::badbit); 391240099Smelifaro if ((this->exceptions() & ios_base::badbit) != 0) 392240099Smelifaro __throw_exception_again; 393240099Smelifaro } 394240099Smelifaro } 395201527Sluigi return *this; 396201527Sluigi } 397201527Sluigi 398201527Sluigi template<typename _CharT, typename _Traits> 399133920Sandre basic_istream<_CharT, _Traits>& 400133920Sandre basic_istream<_CharT, _Traits>:: 401135154Sandre operator>>(double& __n) 402133920Sandre { 403133920Sandre sentry __cerb(*this, false); 404133920Sandre if (__cerb) 405201122Sluigi { 406223593Sglebius try 407201527Sluigi { 408133920Sandre ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 409133920Sandre if (_M_check_facet(_M_fnumget)) 410201122Sluigi _M_fnumget->get(*this, 0, *this, __err, __n); 411201122Sluigi this->setstate(__err); 412201122Sluigi } 413201122Sluigi catch(...) 414243882Sglebius { 415201122Sluigi // 27.6.1.2.1 Common requirements. 416201122Sluigi // Turn this on without causing an ios::failure to be thrown. 417201122Sluigi this->_M_setstate(ios_base::badbit); 418201122Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 419201527Sluigi __throw_exception_again; 420201122Sluigi } 421133920Sandre } 422133920Sandre return *this; 423201122Sluigi } 424201122Sluigi 425201122Sluigi template<typename _CharT, typename _Traits> 426201122Sluigi basic_istream<_CharT, _Traits>& 427201122Sluigi basic_istream<_CharT, _Traits>:: 428201122Sluigi operator>>(long double& __n) 429133920Sandre { 430223593Sglebius sentry __cerb(*this, false); 431223593Sglebius if (__cerb) 432223593Sglebius { 433201122Sluigi try 434201122Sluigi { 435133920Sandre ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 436201122Sluigi if (_M_check_facet(_M_fnumget)) 437201122Sluigi _M_fnumget->get(*this, 0, *this, __err, __n); 438201527Sluigi this->setstate(__err); 439201122Sluigi } 440133920Sandre catch(...) 441133920Sandre { 442133920Sandre // 27.6.1.2.1 Common requirements. 443133920Sandre // Turn this on without causing an ios::failure to be thrown. 444201122Sluigi this->_M_setstate(ios_base::badbit); 445201122Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 446201122Sluigi __throw_exception_again; 447201122Sluigi } 448201122Sluigi } 449201122Sluigi return *this; 450201122Sluigi } 451201122Sluigi 452223593Sglebius template<typename _CharT, typename _Traits> 453223593Sglebius basic_istream<_CharT, _Traits>& 454223593Sglebius basic_istream<_CharT, _Traits>:: 455223593Sglebius operator>>(void*& __n) 456223593Sglebius { 457223593Sglebius sentry __cerb(*this, false); 458223593Sglebius if (__cerb) 459223593Sglebius { 460223593Sglebius try 461223593Sglebius { 462223593Sglebius ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); 463223593Sglebius if (_M_check_facet(_M_fnumget)) 464223593Sglebius _M_fnumget->get(*this, 0, *this, __err, __n); 465223593Sglebius this->setstate(__err); 466223593Sglebius } 467223593Sglebius catch(...) 468223593Sglebius { 469223593Sglebius // 27.6.1.2.1 Common requirements. 470133920Sandre // Turn this on without causing an ios::failure to be thrown. 471223593Sglebius this->_M_setstate(ios_base::badbit); 472201527Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 473201527Sluigi __throw_exception_again; 474201527Sluigi } 475201527Sluigi } 476201527Sluigi return *this; 477201527Sluigi } 478201527Sluigi 479201527Sluigi template<typename _CharT, typename _Traits> 480201527Sluigi basic_istream<_CharT, _Traits>& 481133920Sandre basic_istream<_CharT, _Traits>:: 482133920Sandre operator>>(__streambuf_type* __sbout) 483201122Sluigi { 484201527Sluigi sentry __cerb(*this, false); 485133920Sandre if (__cerb) 486133920Sandre { 487201122Sluigi try 488201122Sluigi { 489201122Sluigi streamsize __xtrct = 0; 490200601Sluigi if (__sbout) 491201122Sluigi { 492133920Sandre __streambuf_type* __sbin = this->rdbuf(); 493201122Sluigi __xtrct = __copy_streambufs(*this, __sbin, __sbout); 494240099Smelifaro } 495133920Sandre if (!__sbout || !__xtrct) 496201122Sluigi this->setstate(ios_base::failbit); 497201122Sluigi } 498133920Sandre catch(...) 499133920Sandre { 500240099Smelifaro // 27.6.2.5.1 Common requirements. 501240099Smelifaro // Turn this on without causing an ios::failure to be thrown. 502201527Sluigi this->_M_setstate(ios_base::badbit); 503240099Smelifaro if ((this->exceptions() & ios_base::badbit) != 0) 504133920Sandre __throw_exception_again; 505133920Sandre } 506133920Sandre } 507133920Sandre return *this; 508196423Sjulian } 509201122Sluigi 510133920Sandre template<typename _CharT, typename _Traits> 511200601Sluigi typename basic_istream<_CharT, _Traits>::int_type 512200601Sluigi basic_istream<_CharT, _Traits>:: 513201122Sluigi get(void) 514201122Sluigi { 515206845Sluigi const int_type __eof = traits_type::eof(); 516200601Sluigi int_type __c = __eof; 517200601Sluigi _M_gcount = 0; 518200601Sluigi sentry __cerb(*this, true); 519200601Sluigi if (__cerb) 520201122Sluigi { 521201122Sluigi try 522206845Sluigi { 523200601Sluigi __c = this->rdbuf()->sbumpc(); 524200601Sluigi // 27.6.1.1 paragraph 3 525200601Sluigi if (!traits_type::eq_int_type(__c, __eof)) 526200601Sluigi _M_gcount = 1; 527240099Smelifaro else 528240099Smelifaro this->setstate(ios_base::eofbit | ios_base::failbit); 529240099Smelifaro } 530240099Smelifaro catch(...) 531240099Smelifaro { 532240099Smelifaro // 27.6.1.3 paragraph 1 533200601Sluigi // Turn this on without causing an ios::failure to be thrown. 534200601Sluigi this->_M_setstate(ios_base::badbit); 535200601Sluigi if ((this->exceptions() & ios_base::badbit) != 0) 536200601Sluigi __throw_exception_again; 537158470Smlaier } 538158470Smlaier } 539240099Smelifaro return __c; 540240099Smelifaro } 541158470Smlaier 542201122Sluigi template<typename _CharT, typename _Traits> 543158470Smlaier basic_istream<_CharT, _Traits>& 544197952Sjulian basic_istream<_CharT, _Traits>:: 545240099Smelifaro get(char_type& __c) 546201122Sluigi { 547197952Sjulian _M_gcount = 0; 548197952Sjulian sentry __cerb(*this, true); 549197952Sjulian if (__cerb) 550240099Smelifaro { 551201122Sluigi try 552197952Sjulian { 553196423Sjulian const int_type __eof = traits_type::eof(); 554240099Smelifaro int_type __bufval = this->rdbuf()->sbumpc(); 555240099Smelifaro // 27.6.1.1 paragraph 3 556240099Smelifaro if (!traits_type::eq_int_type(__bufval, __eof)) 557240099Smelifaro { 558197952Sjulian _M_gcount = 1; 559197952Sjulian __c = traits_type::to_char_type(__bufval); 560197952Sjulian } 561240099Smelifaro else 562197952Sjulian this->setstate(ios_base::eofbit | ios_base::failbit); 563240099Smelifaro } 564240099Smelifaro catch(...) 565197952Sjulian { 566158470Smlaier // 27.6.1.3 paragraph 1 567158470Smlaier // Turn this on without causing an ios::failure to be thrown. 568158470Smlaier this->_M_setstate(ios_base::badbit); 569240099Smelifaro if ((this->exceptions() & ios_base::badbit) != 0) 570240099Smelifaro __throw_exception_again; 571158470Smlaier } 572240099Smelifaro } 573158470Smlaier return *this; 574158470Smlaier } 575240099Smelifaro 576201122Sluigi template<typename _CharT, typename _Traits> 577201122Sluigi basic_istream<_CharT, _Traits>& 578240099Smelifaro basic_istream<_CharT, _Traits>:: 579158470Smlaier get(char_type* __s, streamsize __n, char_type __delim) 580158470Smlaier { 581158470Smlaier _M_gcount = 0; 582200601Sluigi sentry __cerb(*this, true); 583 if (__cerb) 584 { 585 try 586 { 587 const int_type __idelim = traits_type::to_int_type(__delim); 588 const int_type __eof = traits_type::eof(); 589 __streambuf_type* __sb = this->rdbuf(); 590 int_type __c = __sb->sgetc(); 591 592 while (_M_gcount + 1 < __n 593 && !traits_type::eq_int_type(__c, __eof) 594 && !traits_type::eq_int_type(__c, __idelim)) 595 { 596 *__s++ = traits_type::to_char_type(__c); 597 __c = __sb->snextc(); 598 ++_M_gcount; 599 } 600 if (traits_type::eq_int_type(__c, __eof)) 601 this->setstate(ios_base::eofbit); 602 } 603 catch(...) 604 { 605 // 27.6.1.3 paragraph 1 606 // Turn this on without causing an ios::failure to be thrown. 607 this->_M_setstate(ios_base::badbit); 608 if ((this->exceptions() & ios_base::badbit) != 0) 609 __throw_exception_again; 610 } 611 } 612 *__s = char_type(); 613 if (!_M_gcount) 614 this->setstate(ios_base::failbit); 615 return *this; 616 } 617 618 template<typename _CharT, typename _Traits> 619 basic_istream<_CharT, _Traits>& 620 basic_istream<_CharT, _Traits>:: 621 get(__streambuf_type& __sb, char_type __delim) 622 { 623 _M_gcount = 0; 624 sentry __cerb(*this, true); 625 if (__cerb) 626 { 627 try 628 { 629 const int_type __idelim = traits_type::to_int_type(__delim); 630 const int_type __eof = traits_type::eof(); 631 __streambuf_type* __this_sb = this->rdbuf(); 632 int_type __c = __this_sb->sgetc(); 633 char_type __c2 = traits_type::to_char_type(__c); 634 635 while (!traits_type::eq_int_type(__c, __eof) 636 && !traits_type::eq_int_type(__c, __idelim) 637 && !traits_type::eq_int_type(__sb.sputc(__c2), __eof)) 638 { 639 ++_M_gcount; 640 __c = __this_sb->snextc(); 641 __c2 = traits_type::to_char_type(__c); 642 } 643 if (traits_type::eq_int_type(__c, __eof)) 644 this->setstate(ios_base::eofbit); 645 } 646 catch(...) 647 { 648 // 27.6.1.3 paragraph 1 649 // Turn this on without causing an ios::failure to be thrown. 650 this->_M_setstate(ios_base::badbit); 651 if ((this->exceptions() & ios_base::badbit) != 0) 652 __throw_exception_again; 653 } 654 } 655 if (!_M_gcount) 656 this->setstate(ios_base::failbit); 657 return *this; 658 } 659 660 template<typename _CharT, typename _Traits> 661 basic_istream<_CharT, _Traits>& 662 basic_istream<_CharT, _Traits>:: 663 getline(char_type* __s, streamsize __n, char_type __delim) 664 { 665 _M_gcount = 0; 666 sentry __cerb(*this, true); 667 if (__cerb) 668 { 669 try 670 { 671 const int_type __idelim = traits_type::to_int_type(__delim); 672 const int_type __eof = traits_type::eof(); 673 __streambuf_type* __sb = this->rdbuf(); 674 int_type __c = __sb->sgetc(); 675 676 while (_M_gcount + 1 < __n 677 && !traits_type::eq_int_type(__c, __eof) 678 && !traits_type::eq_int_type(__c, __idelim)) 679 { 680 *__s++ = traits_type::to_char_type(__c); 681 __c = __sb->snextc(); 682 ++_M_gcount; 683 } 684 if (traits_type::eq_int_type(__c, __eof)) 685 this->setstate(ios_base::eofbit); 686 else 687 { 688 if (traits_type::eq_int_type(__c, __idelim)) 689 { 690 __sb->sbumpc(); 691 ++_M_gcount; 692 } 693 else 694 this->setstate(ios_base::failbit); 695 } 696 } 697 catch(...) 698 { 699 // 27.6.1.3 paragraph 1 700 // Turn this on without causing an ios::failure to be thrown. 701 this->_M_setstate(ios_base::badbit); 702 if ((this->exceptions() & ios_base::badbit) != 0) 703 __throw_exception_again; 704 } 705 } 706 *__s = char_type(); 707 if (!_M_gcount) 708 this->setstate(ios_base::failbit); 709 return *this; 710 } 711 712 template<typename _CharT, typename _Traits> 713 basic_istream<_CharT, _Traits>& 714 basic_istream<_CharT, _Traits>:: 715 ignore(streamsize __n, int_type __delim) 716 { 717 _M_gcount = 0; 718 sentry __cerb(*this, true); 719 if (__cerb && __n > 0) 720 { 721 try 722 { 723 const int_type __eof = traits_type::eof(); 724 __streambuf_type* __sb = this->rdbuf(); 725 int_type __c; 726 727 __n = min(__n, numeric_limits<streamsize>::max()); 728 while (_M_gcount < __n 729 && !traits_type::eq_int_type(__c = __sb->sbumpc(), __eof)) 730 { 731 ++_M_gcount; 732 if (traits_type::eq_int_type(__c, __delim)) 733 break; 734 } 735 if (traits_type::eq_int_type(__c, __eof)) 736 this->setstate(ios_base::eofbit); 737 } 738 catch(...) 739 { 740 // 27.6.1.3 paragraph 1 741 // Turn this on without causing an ios::failure to be thrown. 742 this->_M_setstate(ios_base::badbit); 743 if ((this->exceptions() & ios_base::badbit) != 0) 744 __throw_exception_again; 745 } 746 } 747 return *this; 748 } 749 750 template<typename _CharT, typename _Traits> 751 typename basic_istream<_CharT, _Traits>::int_type 752 basic_istream<_CharT, _Traits>:: 753 peek(void) 754 { 755 int_type __c = traits_type::eof(); 756 _M_gcount = 0; 757 sentry __cerb(*this, true); 758 if (__cerb) 759 { 760 try 761 { __c = this->rdbuf()->sgetc(); } 762 catch(...) 763 { 764 // 27.6.1.3 paragraph 1 765 // Turn this on without causing an ios::failure to be thrown. 766 this->_M_setstate(ios_base::badbit); 767 if ((this->exceptions() & ios_base::badbit) != 0) 768 __throw_exception_again; 769 } 770 } 771 return __c; 772 } 773 774 template<typename _CharT, typename _Traits> 775 basic_istream<_CharT, _Traits>& 776 basic_istream<_CharT, _Traits>:: 777 read(char_type* __s, streamsize __n) 778 { 779 _M_gcount = 0; 780 sentry __cerb(*this, true); 781 if (__cerb) 782 { 783 try 784 { 785 _M_gcount = this->rdbuf()->sgetn(__s, __n); 786 if (_M_gcount != __n) 787 this->setstate(ios_base::eofbit | ios_base::failbit); 788 } 789 catch(...) 790 { 791 // 27.6.1.3 paragraph 1 792 // Turn this on without causing an ios::failure to be thrown. 793 this->_M_setstate(ios_base::badbit); 794 if ((this->exceptions() & ios_base::badbit) != 0) 795 __throw_exception_again; 796 } 797 } 798 else 799 this->setstate(ios_base::failbit); 800 return *this; 801 } 802 803 template<typename _CharT, typename _Traits> 804 streamsize 805 basic_istream<_CharT, _Traits>:: 806 readsome(char_type* __s, streamsize __n) 807 { 808 _M_gcount = 0; 809 sentry __cerb(*this, true); 810 if (__cerb) 811 { 812 try 813 { 814 // Cannot compare int_type with streamsize generically. 815 streamsize __num = this->rdbuf()->in_avail(); 816 if (__num >= 0) 817 { 818 __num = min(__num, __n); 819 if (__num) 820 _M_gcount = this->rdbuf()->sgetn(__s, __num); 821 } 822 else 823 this->setstate(ios_base::eofbit); 824 } 825 catch(...) 826 { 827 // 27.6.1.3 paragraph 1 828 // Turn this on without causing an ios::failure to be thrown. 829 this->_M_setstate(ios_base::badbit); 830 if ((this->exceptions() & ios_base::badbit) != 0) 831 __throw_exception_again; 832 } 833 } 834 else 835 this->setstate(ios_base::failbit); 836 return _M_gcount; 837 } 838 839 template<typename _CharT, typename _Traits> 840 basic_istream<_CharT, _Traits>& 841 basic_istream<_CharT, _Traits>:: 842 putback(char_type __c) 843 { 844#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 845// 60. What is a formatted input function? 846 _M_gcount = 0; 847#endif 848 sentry __cerb(*this, true); 849 if (__cerb) 850 { 851 try 852 { 853 const int_type __eof = traits_type::eof(); 854 __streambuf_type* __sb = this->rdbuf(); 855 if (!__sb 856 || traits_type::eq_int_type(__sb->sputbackc(__c), __eof)) 857 this->setstate(ios_base::badbit); 858 } 859 catch(...) 860 { 861 // 27.6.1.3 paragraph 1 862 // Turn this on without causing an ios::failure to be thrown. 863 this->_M_setstate(ios_base::badbit); 864 if ((this->exceptions() & ios_base::badbit) != 0) 865 __throw_exception_again; 866 } 867 } 868 else 869 this->setstate(ios_base::failbit); 870 return *this; 871 } 872 873 template<typename _CharT, typename _Traits> 874 basic_istream<_CharT, _Traits>& 875 basic_istream<_CharT, _Traits>:: 876 unget(void) 877 { 878#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 879// 60. What is a formatted input function? 880 _M_gcount = 0; 881#endif 882 sentry __cerb(*this, true); 883 if (__cerb) 884 { 885 try 886 { 887 const int_type __eof = traits_type::eof(); 888 __streambuf_type* __sb = this->rdbuf(); 889 if (!__sb 890 || traits_type::eq_int_type(__sb->sungetc(), __eof)) 891 this->setstate(ios_base::badbit); 892 } 893 catch(...) 894 { 895 // 27.6.1.3 paragraph 1 896 // Turn this on without causing an ios::failure to be thrown. 897 this->_M_setstate(ios_base::badbit); 898 if ((this->exceptions() & ios_base::badbit) != 0) 899 __throw_exception_again; 900 } 901 } 902 else 903 this->setstate(ios_base::failbit); 904 return *this; 905 } 906 907 template<typename _CharT, typename _Traits> 908 int 909 basic_istream<_CharT, _Traits>:: 910 sync(void) 911 { 912 // DR60. Do not change _M_gcount. 913 int __ret = -1; 914 sentry __cerb(*this, true); 915 if (__cerb) 916 { 917 try 918 { 919 __streambuf_type* __sb = this->rdbuf(); 920 if (__sb) 921 { 922 if (__sb->pubsync() == -1) 923 this->setstate(ios_base::badbit); 924 else 925 __ret = 0; 926 } 927 } 928 catch(...) 929 { 930 // 27.6.1.3 paragraph 1 931 // Turn this on without causing an ios::failure to be thrown. 932 this->_M_setstate(ios_base::badbit); 933 if ((this->exceptions() & ios_base::badbit) != 0) 934 __throw_exception_again; 935 } 936 } 937 return __ret; 938 } 939 940 template<typename _CharT, typename _Traits> 941 typename basic_istream<_CharT, _Traits>::pos_type 942 basic_istream<_CharT, _Traits>:: 943 tellg(void) 944 { 945 // DR60. Do not change _M_gcount. 946 pos_type __ret = pos_type(-1); 947 if (!this->fail()) 948 __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); 949 return __ret; 950 } 951 952 953 template<typename _CharT, typename _Traits> 954 basic_istream<_CharT, _Traits>& 955 basic_istream<_CharT, _Traits>:: 956 seekg(pos_type __pos) 957 { 958 // DR60. Do not change _M_gcount. 959 if (!this->fail()) 960 { 961#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 962// 136. seekp, seekg setting wrong streams? 963 pos_type __err = this->rdbuf()->pubseekpos(__pos, ios_base::in); 964 965// 129. Need error indication from seekp() and seekg() 966 if (__err == pos_type(off_type(-1))) 967 this->setstate(ios_base::failbit); 968#endif 969 } 970 return *this; 971 } 972 973 template<typename _CharT, typename _Traits> 974 basic_istream<_CharT, _Traits>& 975 basic_istream<_CharT, _Traits>:: 976 seekg(off_type __off, ios_base::seekdir __dir) 977 { 978 // DR60. Do not change _M_gcount. 979 if (!this->fail()) 980 { 981#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 982// 136. seekp, seekg setting wrong streams? 983 pos_type __err = this->rdbuf()->pubseekoff(__off, __dir, 984 ios_base::in); 985 986// 129. Need error indication from seekp() and seekg() 987 if (__err == pos_type(off_type(-1))) 988 this->setstate(ios_base::failbit); 989#endif 990 } 991 return *this; 992 } 993 994 // 27.6.1.2.3 Character extraction templates 995 template<typename _CharT, typename _Traits> 996 basic_istream<_CharT, _Traits>& 997 operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) 998 { 999 typedef basic_istream<_CharT, _Traits> __istream_type; 1000 typename __istream_type::sentry __cerb(__in, false); 1001 if (__cerb) 1002 { 1003 try 1004 { __in.get(__c); } 1005 catch(...) 1006 { 1007 // 27.6.1.2.1 Common requirements. 1008 // Turn this on without causing an ios::failure to be thrown. 1009 __in._M_setstate(ios_base::badbit); 1010 if ((__in.exceptions() & ios_base::badbit) != 0) 1011 __throw_exception_again; 1012 } 1013 } 1014 else 1015 __in.setstate(ios_base::failbit); 1016 return __in; 1017 } 1018 1019 template<typename _CharT, typename _Traits> 1020 basic_istream<_CharT, _Traits>& 1021 operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) 1022 { 1023 typedef basic_istream<_CharT, _Traits> __istream_type; 1024 typedef typename __istream_type::__streambuf_type __streambuf_type; 1025 typedef typename _Traits::int_type int_type; 1026 typedef _CharT char_type; 1027 typedef ctype<_CharT> __ctype_type; 1028 streamsize __extracted = 0; 1029 1030 typename __istream_type::sentry __cerb(__in, false); 1031 if (__cerb) 1032 { 1033 try 1034 { 1035 // Figure out how many characters to extract. 1036 streamsize __num = __in.width(); 1037 if (__num <= 0) 1038 __num = numeric_limits<streamsize>::max(); 1039 1040 const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc()); 1041 const int_type __eof = _Traits::eof(); 1042 __streambuf_type* __sb = __in.rdbuf(); 1043 int_type __c = __sb->sgetc(); 1044 1045 while (__extracted < __num - 1 1046 && !_Traits::eq_int_type(__c, __eof) 1047 && !__ctype.is(ctype_base::space, _Traits::to_char_type(__c))) 1048 { 1049 *__s++ = _Traits::to_char_type(__c); 1050 ++__extracted; 1051 __c = __sb->snextc(); 1052 } 1053 if (_Traits::eq_int_type(__c, __eof)) 1054 __in.setstate(ios_base::eofbit); 1055 1056#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 1057//68. Extractors for char* should store null at end 1058 *__s = char_type(); 1059#endif 1060 __in.width(0); 1061 } 1062 catch(...) 1063 { 1064 // 27.6.1.2.1 Common requirements. 1065 // Turn this on without causing an ios::failure to be thrown. 1066 __in._M_setstate(ios_base::badbit); 1067 if ((__in.exceptions() & ios_base::badbit) != 0) 1068 __throw_exception_again; 1069 } 1070 } 1071 if (!__extracted) 1072 __in.setstate(ios_base::failbit); 1073 return __in; 1074 } 1075 1076 // 27.6.1.4 Standard basic_istream manipulators 1077 template<typename _CharT, typename _Traits> 1078 basic_istream<_CharT,_Traits>& 1079 ws(basic_istream<_CharT,_Traits>& __in) 1080 { 1081 typedef basic_istream<_CharT, _Traits> __istream_type; 1082 typedef typename __istream_type::__streambuf_type __streambuf_type; 1083 typedef typename __istream_type::__ctype_type __ctype_type; 1084 typedef typename __istream_type::int_type __int_type; 1085 1086 const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc()); 1087 const __int_type __eof = _Traits::eof(); 1088 __streambuf_type* __sb = __in.rdbuf(); 1089 __int_type __c = __sb->sgetc(); 1090 1091 while (!_Traits::eq_int_type(__c, __eof) 1092 && __ctype.is(ctype_base::space, _Traits::to_char_type(__c))) 1093 __c = __sb->snextc(); 1094 1095 if (_Traits::eq_int_type(__c, __eof)) 1096 __in.setstate(ios_base::eofbit); 1097 1098 return __in; 1099 } 1100 1101 // 21.3.7.9 basic_string::getline and operators 1102 template<typename _CharT, typename _Traits, typename _Alloc> 1103 basic_istream<_CharT, _Traits>& 1104 operator>>(basic_istream<_CharT, _Traits>& __in, 1105 basic_string<_CharT, _Traits, _Alloc>& __str) 1106 { 1107 typedef basic_istream<_CharT, _Traits> __istream_type; 1108 typedef typename __istream_type::int_type __int_type; 1109 typedef typename __istream_type::__streambuf_type __streambuf_type; 1110 typedef typename __istream_type::__ctype_type __ctype_type; 1111 typedef basic_string<_CharT, _Traits, _Alloc> __string_type; 1112 typedef typename __string_type::size_type __size_type; 1113 __size_type __extracted = 0; 1114 1115 typename __istream_type::sentry __cerb(__in, false); 1116 if (__cerb) 1117 { 1118 __str.erase(); 1119 streamsize __w = __in.width(); 1120 __size_type __n; 1121 __n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size(); 1122 1123 const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc()); 1124 const __int_type __eof = _Traits::eof(); 1125 __streambuf_type* __sb = __in.rdbuf(); 1126 __int_type __c = __sb->sgetc(); 1127 1128 while (__extracted < __n 1129 && !_Traits::eq_int_type(__c, __eof) 1130 && !__ctype.is(ctype_base::space, _Traits::to_char_type(__c))) 1131 { 1132 __str += _Traits::to_char_type(__c); 1133 ++__extracted; 1134 __c = __sb->snextc(); 1135 } 1136 if (_Traits::eq_int_type(__c, __eof)) 1137 __in.setstate(ios_base::eofbit); 1138 __in.width(0); 1139 } 1140#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 1141//211. operator>>(istream&, string&) doesn't set failbit 1142 if (!__extracted) 1143 __in.setstate (ios_base::failbit); 1144#endif 1145 return __in; 1146 } 1147 1148 template<typename _CharT, typename _Traits, typename _Alloc> 1149 basic_istream<_CharT, _Traits>& 1150 getline(basic_istream<_CharT, _Traits>& __in, 1151 basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim) 1152 { 1153 typedef basic_istream<_CharT, _Traits> __istream_type; 1154 typedef typename __istream_type::int_type __int_type; 1155 typedef typename __istream_type::__streambuf_type __streambuf_type; 1156 typedef typename __istream_type::__ctype_type __ctype_type; 1157 typedef basic_string<_CharT, _Traits, _Alloc> __string_type; 1158 typedef typename __string_type::size_type __size_type; 1159 1160 __size_type __extracted = 0; 1161 bool __testdelim = false; 1162 typename __istream_type::sentry __cerb(__in, true); 1163 if (__cerb) 1164 { 1165 __str.erase(); 1166 __size_type __n = __str.max_size(); 1167 1168 __int_type __idelim = _Traits::to_int_type(__delim); 1169 __streambuf_type* __sb = __in.rdbuf(); 1170 __int_type __c = __sb->sbumpc(); 1171 const __int_type __eof = _Traits::eof(); 1172 __testdelim = _Traits::eq_int_type(__c, __idelim); 1173 1174 while (__extracted <= __n 1175 && !_Traits::eq_int_type(__c, __eof) 1176 && !__testdelim) 1177 { 1178 __str += _Traits::to_char_type(__c); 1179 ++__extracted; 1180 __c = __sb->sbumpc(); 1181 __testdelim = _Traits::eq_int_type(__c, __idelim); 1182 } 1183 if (_Traits::eq_int_type(__c, __eof)) 1184 __in.setstate(ios_base::eofbit); 1185 } 1186 if (!__extracted && !__testdelim) 1187 __in.setstate(ios_base::failbit); 1188 return __in; 1189 } 1190 1191 template<class _CharT, class _Traits, class _Alloc> 1192 inline basic_istream<_CharT,_Traits>& 1193 getline(basic_istream<_CharT, _Traits>& __in, 1194 basic_string<_CharT,_Traits,_Alloc>& __str) 1195 { return getline(__in, __str, __in.widen('\n')); } 1196 1197 // Inhibit implicit instantiations for required instantiations, 1198 // which are defined via explicit instantiations elsewhere. 1199 // NB: This syntax is a GNU extension. 1200#if _GLIBCPP_EXTERN_TEMPLATE 1201 extern template class basic_istream<char>; 1202 extern template istream& ws(istream&); 1203 extern template istream& operator>>(istream&, char&); 1204 extern template istream& operator>>(istream&, char*); 1205 extern template istream& operator>>(istream&, unsigned char&); 1206 extern template istream& operator>>(istream&, signed char&); 1207 extern template istream& operator>>(istream&, unsigned char*); 1208 extern template istream& operator>>(istream&, signed char*); 1209 1210#ifdef _GLIBCPP_USE_WCHAR_T 1211 extern template class basic_istream<wchar_t>; 1212 extern template wistream& ws(wistream&); 1213 extern template wistream& operator>>(wistream&, wchar_t&); 1214 extern template wistream& operator>>(wistream&, wchar_t*); 1215#endif 1216#endif 1217} // namespace std 1218