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