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