1 // -*- C++ -*- 2 //===-------------------------- ostream -----------------------------------===// 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_OSTREAM 12 #define _LIBCPP_OSTREAM 13 14 /* 15 ostream synopsis 16 17 template <class charT, class traits = char_traits<charT> > 18 class basic_ostream 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.2.2 Constructor/destructor: 30 explicit basic_ostream(basic_streambuf<char_type,traits>* sb); 31 basic_ostream(basic_ostream&& rhs); 32 virtual ~basic_ostream(); 33 34 // 27.7.2.3 Assign/swap 35 basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14 36 basic_ostream& operator=(basic_ostream&& rhs); 37 void swap(basic_ostream& rhs); 38 39 // 27.7.2.4 Prefix/suffix: 40 class sentry; 41 42 // 27.7.2.6 Formatted output: 43 basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&)); 44 basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&)); 45 basic_ostream& operator<<(ios_base& (*pf)(ios_base&)); 46 basic_ostream& operator<<(bool n); 47 basic_ostream& operator<<(short n); 48 basic_ostream& operator<<(unsigned short n); 49 basic_ostream& operator<<(int n); 50 basic_ostream& operator<<(unsigned int n); 51 basic_ostream& operator<<(long n); 52 basic_ostream& operator<<(unsigned long n); 53 basic_ostream& operator<<(long long n); 54 basic_ostream& operator<<(unsigned long long n); 55 basic_ostream& operator<<(float f); 56 basic_ostream& operator<<(double f); 57 basic_ostream& operator<<(long double f); 58 basic_ostream& operator<<(const void* p); 59 basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb); 60 61 // 27.7.2.7 Unformatted output: 62 basic_ostream& put(char_type c); 63 basic_ostream& write(const char_type* s, streamsize n); 64 basic_ostream& flush(); 65 66 // 27.7.2.5 seeks: 67 pos_type tellp(); 68 basic_ostream& seekp(pos_type); 69 basic_ostream& seekp(off_type, ios_base::seekdir); 70 protected: 71 basic_ostream(const basic_ostream& rhs) = delete; 72 basic_ostream(basic_ostream&& rhs); 73 // 27.7.3.3 Assign/swap 74 basic_ostream& operator=(basic_ostream& rhs) = delete; 75 basic_ostream& operator=(const basic_ostream&& rhs); 76 void swap(basic_ostream& rhs); 77 }; 78 79 // 27.7.2.6.4 character inserters 80 81 template<class charT, class traits> 82 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT); 83 84 template<class charT, class traits> 85 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char); 86 87 template<class traits> 88 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char); 89 90 // signed and unsigned 91 92 template<class traits> 93 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char); 94 95 template<class traits> 96 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char); 97 98 // NTBS 99 template<class charT, class traits> 100 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*); 101 102 template<class charT, class traits> 103 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*); 104 105 template<class traits> 106 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*); 107 108 // signed and unsigned 109 template<class traits> 110 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*); 111 112 template<class traits> 113 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*); 114 115 // swap: 116 template <class charT, class traits> 117 void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y); 118 119 template <class charT, class traits> 120 basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); 121 122 template <class charT, class traits> 123 basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os); 124 125 template <class charT, class traits> 126 basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os); 127 128 // rvalue stream insertion 129 template <class charT, class traits, class T> 130 basic_ostream<charT, traits>& 131 operator<<(basic_ostream<charT, traits>&& os, const T& x); 132 133 } // std 134 135 */ 136 137 #include <__config> 138 #include <ios> 139 #include <streambuf> 140 #include <locale> 141 #include <iterator> 142 #include <bitset> 143 144 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 145 #pragma GCC system_header 146 #endif 147 148 _LIBCPP_BEGIN_NAMESPACE_STD 149 150 template <class _CharT, class _Traits> 151 class _LIBCPP_TYPE_VIS_ONLY basic_ostream 152 : virtual public basic_ios<_CharT, _Traits> 153 { 154 public: 155 // types (inherited from basic_ios (27.5.4)): 156 typedef _CharT char_type; 157 typedef _Traits traits_type; 158 typedef typename traits_type::int_type int_type; 159 typedef typename traits_type::pos_type pos_type; 160 typedef typename traits_type::off_type off_type; 161 162 // 27.7.2.2 Constructor/destructor: 163 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb); 164 virtual ~basic_ostream(); 165 protected: 166 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 167 _LIBCPP_INLINE_VISIBILITY 168 basic_ostream(basic_ostream&& __rhs); 169 #endif 170 171 // 27.7.2.3 Assign/swap 172 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 173 _LIBCPP_INLINE_VISIBILITY 174 basic_ostream& operator=(basic_ostream&& __rhs); 175 #endif 176 void swap(basic_ostream& __rhs); 177 178 #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS 179 basic_ostream (const basic_ostream& __rhs) = delete; 180 basic_ostream& operator=(const basic_ostream& __rhs) = delete; 181 #else 182 basic_ostream (const basic_ostream& __rhs); // not defined 183 basic_ostream& operator=(const basic_ostream& __rhs); // not defined 184 #endif 185 public: 186 187 // 27.7.2.4 Prefix/suffix: 188 class _LIBCPP_TYPE_VIS_ONLY sentry; 189 190 // 27.7.2.6 Formatted output: 191 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)); 192 basic_ostream& operator<<(basic_ios<char_type, traits_type>& 193 (*__pf)(basic_ios<char_type,traits_type>&)); 194 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&)); 195 basic_ostream& operator<<(bool __n); 196 basic_ostream& operator<<(short __n); 197 basic_ostream& operator<<(unsigned short __n); 198 basic_ostream& operator<<(int __n); 199 basic_ostream& operator<<(unsigned int __n); 200 basic_ostream& operator<<(long __n); 201 basic_ostream& operator<<(unsigned long __n); 202 basic_ostream& operator<<(long long __n); 203 basic_ostream& operator<<(unsigned long long __n); 204 basic_ostream& operator<<(float __f); 205 basic_ostream& operator<<(double __f); 206 basic_ostream& operator<<(long double __f); 207 basic_ostream& operator<<(const void* __p); 208 basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb); 209 210 // 27.7.2.7 Unformatted output: 211 basic_ostream& put(char_type __c); 212 basic_ostream& write(const char_type* __s, streamsize __n); 213 basic_ostream& flush(); 214 215 // 27.7.2.5 seeks: 216 pos_type tellp(); 217 basic_ostream& seekp(pos_type __pos); 218 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir); 219 220 protected: 221 _LIBCPP_ALWAYS_INLINE 222 basic_ostream() {} // extension, intentially does not initialize 223 }; 224 225 template <class _CharT, class _Traits> 226 class _LIBCPP_TYPE_VIS_ONLY basic_ostream<_CharT, _Traits>::sentry 227 { 228 bool __ok_; 229 basic_ostream<_CharT, _Traits>& __os_; 230 231 sentry(const sentry&); // = delete; 232 sentry& operator=(const sentry&); // = delete; 233 234 public: 235 explicit sentry(basic_ostream<_CharT, _Traits>& __os); 236 ~sentry(); 237 238 _LIBCPP_ALWAYS_INLINE 239 _LIBCPP_EXPLICIT 240 operator bool() const {return __ok_;} 241 }; 242 243 template <class _CharT, class _Traits> 244 basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) 245 : __ok_(false), 246 __os_(__os) 247 { 248 if (__os.good()) 249 { 250 if (__os.tie()) 251 __os.tie()->flush(); 252 __ok_ = true; 253 } 254 } 255 256 template <class _CharT, class _Traits> 257 basic_ostream<_CharT, _Traits>::sentry::~sentry() 258 { 259 if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) 260 && !uncaught_exception()) 261 { 262 #ifndef _LIBCPP_NO_EXCEPTIONS 263 try 264 { 265 #endif // _LIBCPP_NO_EXCEPTIONS 266 if (__os_.rdbuf()->pubsync() == -1) 267 __os_.setstate(ios_base::badbit); 268 #ifndef _LIBCPP_NO_EXCEPTIONS 269 } 270 catch (...) 271 { 272 } 273 #endif // _LIBCPP_NO_EXCEPTIONS 274 } 275 } 276 277 template <class _CharT, class _Traits> 278 inline _LIBCPP_INLINE_VISIBILITY 279 basic_ostream<_CharT, _Traits>::basic_ostream(basic_streambuf<char_type, traits_type>* __sb) 280 { 281 this->init(__sb); 282 } 283 284 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 285 286 template <class _CharT, class _Traits> 287 inline _LIBCPP_INLINE_VISIBILITY 288 basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) 289 { 290 this->move(__rhs); 291 } 292 293 template <class _CharT, class _Traits> 294 inline _LIBCPP_INLINE_VISIBILITY 295 basic_ostream<_CharT, _Traits>& 296 basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs) 297 { 298 swap(__rhs); 299 return *this; 300 } 301 302 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 303 304 template <class _CharT, class _Traits> 305 basic_ostream<_CharT, _Traits>::~basic_ostream() 306 { 307 } 308 309 template <class _CharT, class _Traits> 310 inline _LIBCPP_INLINE_VISIBILITY 311 void 312 basic_ostream<_CharT, _Traits>::swap(basic_ostream& __rhs) 313 { 314 basic_ios<char_type, traits_type>::swap(__rhs); 315 } 316 317 template <class _CharT, class _Traits> 318 inline _LIBCPP_INLINE_VISIBILITY 319 basic_ostream<_CharT, _Traits>& 320 basic_ostream<_CharT, _Traits>::operator<<(basic_ostream& (*__pf)(basic_ostream&)) 321 { 322 return __pf(*this); 323 } 324 325 template <class _CharT, class _Traits> 326 inline _LIBCPP_INLINE_VISIBILITY 327 basic_ostream<_CharT, _Traits>& 328 basic_ostream<_CharT, _Traits>::operator<<(basic_ios<char_type, traits_type>& 329 (*__pf)(basic_ios<char_type,traits_type>&)) 330 { 331 __pf(*this); 332 return *this; 333 } 334 335 template <class _CharT, class _Traits> 336 inline _LIBCPP_INLINE_VISIBILITY 337 basic_ostream<_CharT, _Traits>& 338 basic_ostream<_CharT, _Traits>::operator<<(ios_base& (*__pf)(ios_base&)) 339 { 340 __pf(*this); 341 return *this; 342 } 343 344 template <class _CharT, class _Traits> 345 basic_ostream<_CharT, _Traits>& 346 basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) 347 { 348 #ifndef _LIBCPP_NO_EXCEPTIONS 349 try 350 { 351 #endif // _LIBCPP_NO_EXCEPTIONS 352 sentry __s(*this); 353 if (__s) 354 { 355 if (__sb) 356 { 357 #ifndef _LIBCPP_NO_EXCEPTIONS 358 try 359 { 360 #endif // _LIBCPP_NO_EXCEPTIONS 361 typedef istreambuf_iterator<_CharT, _Traits> _Ip; 362 typedef ostreambuf_iterator<_CharT, _Traits> _Op; 363 _Ip __i(__sb); 364 _Ip __eof; 365 _Op __o(*this); 366 size_t __c = 0; 367 for (; __i != __eof; ++__i, ++__o, ++__c) 368 { 369 *__o = *__i; 370 if (__o.failed()) 371 break; 372 } 373 if (__c == 0) 374 this->setstate(ios_base::failbit); 375 #ifndef _LIBCPP_NO_EXCEPTIONS 376 } 377 catch (...) 378 { 379 this->__set_failbit_and_consider_rethrow(); 380 } 381 #endif // _LIBCPP_NO_EXCEPTIONS 382 } 383 else 384 this->setstate(ios_base::badbit); 385 } 386 #ifndef _LIBCPP_NO_EXCEPTIONS 387 } 388 catch (...) 389 { 390 this->__set_badbit_and_consider_rethrow(); 391 } 392 #endif // _LIBCPP_NO_EXCEPTIONS 393 return *this; 394 } 395 396 template <class _CharT, class _Traits> 397 basic_ostream<_CharT, _Traits>& 398 basic_ostream<_CharT, _Traits>::operator<<(bool __n) 399 { 400 #ifndef _LIBCPP_NO_EXCEPTIONS 401 try 402 { 403 #endif // _LIBCPP_NO_EXCEPTIONS 404 sentry __s(*this); 405 if (__s) 406 { 407 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 408 const _Fp& __f = use_facet<_Fp>(this->getloc()); 409 if (__f.put(*this, *this, this->fill(), __n).failed()) 410 this->setstate(ios_base::badbit | ios_base::failbit); 411 } 412 #ifndef _LIBCPP_NO_EXCEPTIONS 413 } 414 catch (...) 415 { 416 this->__set_badbit_and_consider_rethrow(); 417 } 418 #endif // _LIBCPP_NO_EXCEPTIONS 419 return *this; 420 } 421 422 template <class _CharT, class _Traits> 423 basic_ostream<_CharT, _Traits>& 424 basic_ostream<_CharT, _Traits>::operator<<(short __n) 425 { 426 #ifndef _LIBCPP_NO_EXCEPTIONS 427 try 428 { 429 #endif // _LIBCPP_NO_EXCEPTIONS 430 sentry __s(*this); 431 if (__s) 432 { 433 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; 434 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 435 const _Fp& __f = use_facet<_Fp>(this->getloc()); 436 if (__f.put(*this, *this, this->fill(), 437 __flags == ios_base::oct || __flags == ios_base::hex ? 438 static_cast<long>(static_cast<unsigned short>(__n)) : 439 static_cast<long>(__n)).failed()) 440 this->setstate(ios_base::badbit | ios_base::failbit); 441 } 442 #ifndef _LIBCPP_NO_EXCEPTIONS 443 } 444 catch (...) 445 { 446 this->__set_badbit_and_consider_rethrow(); 447 } 448 #endif // _LIBCPP_NO_EXCEPTIONS 449 return *this; 450 } 451 452 template <class _CharT, class _Traits> 453 basic_ostream<_CharT, _Traits>& 454 basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) 455 { 456 #ifndef _LIBCPP_NO_EXCEPTIONS 457 try 458 { 459 #endif // _LIBCPP_NO_EXCEPTIONS 460 sentry __s(*this); 461 if (__s) 462 { 463 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 464 const _Fp& __f = use_facet<_Fp>(this->getloc()); 465 if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) 466 this->setstate(ios_base::badbit | ios_base::failbit); 467 } 468 #ifndef _LIBCPP_NO_EXCEPTIONS 469 } 470 catch (...) 471 { 472 this->__set_badbit_and_consider_rethrow(); 473 } 474 #endif // _LIBCPP_NO_EXCEPTIONS 475 return *this; 476 } 477 478 template <class _CharT, class _Traits> 479 basic_ostream<_CharT, _Traits>& 480 basic_ostream<_CharT, _Traits>::operator<<(int __n) 481 { 482 #ifndef _LIBCPP_NO_EXCEPTIONS 483 try 484 { 485 #endif // _LIBCPP_NO_EXCEPTIONS 486 sentry __s(*this); 487 if (__s) 488 { 489 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; 490 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 491 const _Fp& __f = use_facet<_Fp>(this->getloc()); 492 if (__f.put(*this, *this, this->fill(), 493 __flags == ios_base::oct || __flags == ios_base::hex ? 494 static_cast<long>(static_cast<unsigned int>(__n)) : 495 static_cast<long>(__n)).failed()) 496 this->setstate(ios_base::badbit | ios_base::failbit); 497 } 498 #ifndef _LIBCPP_NO_EXCEPTIONS 499 } 500 catch (...) 501 { 502 this->__set_badbit_and_consider_rethrow(); 503 } 504 #endif // _LIBCPP_NO_EXCEPTIONS 505 return *this; 506 } 507 508 template <class _CharT, class _Traits> 509 basic_ostream<_CharT, _Traits>& 510 basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) 511 { 512 #ifndef _LIBCPP_NO_EXCEPTIONS 513 try 514 { 515 #endif // _LIBCPP_NO_EXCEPTIONS 516 sentry __s(*this); 517 if (__s) 518 { 519 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 520 const _Fp& __f = use_facet<_Fp>(this->getloc()); 521 if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) 522 this->setstate(ios_base::badbit | ios_base::failbit); 523 } 524 #ifndef _LIBCPP_NO_EXCEPTIONS 525 } 526 catch (...) 527 { 528 this->__set_badbit_and_consider_rethrow(); 529 } 530 #endif // _LIBCPP_NO_EXCEPTIONS 531 return *this; 532 } 533 534 template <class _CharT, class _Traits> 535 basic_ostream<_CharT, _Traits>& 536 basic_ostream<_CharT, _Traits>::operator<<(long __n) 537 { 538 #ifndef _LIBCPP_NO_EXCEPTIONS 539 try 540 { 541 #endif // _LIBCPP_NO_EXCEPTIONS 542 sentry __s(*this); 543 if (__s) 544 { 545 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 546 const _Fp& __f = use_facet<_Fp>(this->getloc()); 547 if (__f.put(*this, *this, this->fill(), __n).failed()) 548 this->setstate(ios_base::badbit | ios_base::failbit); 549 } 550 #ifndef _LIBCPP_NO_EXCEPTIONS 551 } 552 catch (...) 553 { 554 this->__set_badbit_and_consider_rethrow(); 555 } 556 #endif // _LIBCPP_NO_EXCEPTIONS 557 return *this; 558 } 559 560 template <class _CharT, class _Traits> 561 basic_ostream<_CharT, _Traits>& 562 basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) 563 { 564 #ifndef _LIBCPP_NO_EXCEPTIONS 565 try 566 { 567 #endif // _LIBCPP_NO_EXCEPTIONS 568 sentry __s(*this); 569 if (__s) 570 { 571 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 572 const _Fp& __f = use_facet<_Fp>(this->getloc()); 573 if (__f.put(*this, *this, this->fill(), __n).failed()) 574 this->setstate(ios_base::badbit | ios_base::failbit); 575 } 576 #ifndef _LIBCPP_NO_EXCEPTIONS 577 } 578 catch (...) 579 { 580 this->__set_badbit_and_consider_rethrow(); 581 } 582 #endif // _LIBCPP_NO_EXCEPTIONS 583 return *this; 584 } 585 586 template <class _CharT, class _Traits> 587 basic_ostream<_CharT, _Traits>& 588 basic_ostream<_CharT, _Traits>::operator<<(long long __n) 589 { 590 #ifndef _LIBCPP_NO_EXCEPTIONS 591 try 592 { 593 #endif // _LIBCPP_NO_EXCEPTIONS 594 sentry __s(*this); 595 if (__s) 596 { 597 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 598 const _Fp& __f = use_facet<_Fp>(this->getloc()); 599 if (__f.put(*this, *this, this->fill(), __n).failed()) 600 this->setstate(ios_base::badbit | ios_base::failbit); 601 } 602 #ifndef _LIBCPP_NO_EXCEPTIONS 603 } 604 catch (...) 605 { 606 this->__set_badbit_and_consider_rethrow(); 607 } 608 #endif // _LIBCPP_NO_EXCEPTIONS 609 return *this; 610 } 611 612 template <class _CharT, class _Traits> 613 basic_ostream<_CharT, _Traits>& 614 basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) 615 { 616 #ifndef _LIBCPP_NO_EXCEPTIONS 617 try 618 { 619 #endif // _LIBCPP_NO_EXCEPTIONS 620 sentry __s(*this); 621 if (__s) 622 { 623 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 624 const _Fp& __f = use_facet<_Fp>(this->getloc()); 625 if (__f.put(*this, *this, this->fill(), __n).failed()) 626 this->setstate(ios_base::badbit | ios_base::failbit); 627 } 628 #ifndef _LIBCPP_NO_EXCEPTIONS 629 } 630 catch (...) 631 { 632 this->__set_badbit_and_consider_rethrow(); 633 } 634 #endif // _LIBCPP_NO_EXCEPTIONS 635 return *this; 636 } 637 638 template <class _CharT, class _Traits> 639 basic_ostream<_CharT, _Traits>& 640 basic_ostream<_CharT, _Traits>::operator<<(float __n) 641 { 642 #ifndef _LIBCPP_NO_EXCEPTIONS 643 try 644 { 645 #endif // _LIBCPP_NO_EXCEPTIONS 646 sentry __s(*this); 647 if (__s) 648 { 649 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 650 const _Fp& __f = use_facet<_Fp>(this->getloc()); 651 if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed()) 652 this->setstate(ios_base::badbit | ios_base::failbit); 653 } 654 #ifndef _LIBCPP_NO_EXCEPTIONS 655 } 656 catch (...) 657 { 658 this->__set_badbit_and_consider_rethrow(); 659 } 660 #endif // _LIBCPP_NO_EXCEPTIONS 661 return *this; 662 } 663 664 template <class _CharT, class _Traits> 665 basic_ostream<_CharT, _Traits>& 666 basic_ostream<_CharT, _Traits>::operator<<(double __n) 667 { 668 #ifndef _LIBCPP_NO_EXCEPTIONS 669 try 670 { 671 #endif // _LIBCPP_NO_EXCEPTIONS 672 sentry __s(*this); 673 if (__s) 674 { 675 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 676 const _Fp& __f = use_facet<_Fp>(this->getloc()); 677 if (__f.put(*this, *this, this->fill(), __n).failed()) 678 this->setstate(ios_base::badbit | ios_base::failbit); 679 } 680 #ifndef _LIBCPP_NO_EXCEPTIONS 681 } 682 catch (...) 683 { 684 this->__set_badbit_and_consider_rethrow(); 685 } 686 #endif // _LIBCPP_NO_EXCEPTIONS 687 return *this; 688 } 689 690 template <class _CharT, class _Traits> 691 basic_ostream<_CharT, _Traits>& 692 basic_ostream<_CharT, _Traits>::operator<<(long double __n) 693 { 694 #ifndef _LIBCPP_NO_EXCEPTIONS 695 try 696 { 697 #endif // _LIBCPP_NO_EXCEPTIONS 698 sentry __s(*this); 699 if (__s) 700 { 701 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 702 const _Fp& __f = use_facet<_Fp>(this->getloc()); 703 if (__f.put(*this, *this, this->fill(), __n).failed()) 704 this->setstate(ios_base::badbit | ios_base::failbit); 705 } 706 #ifndef _LIBCPP_NO_EXCEPTIONS 707 } 708 catch (...) 709 { 710 this->__set_badbit_and_consider_rethrow(); 711 } 712 #endif // _LIBCPP_NO_EXCEPTIONS 713 return *this; 714 } 715 716 template <class _CharT, class _Traits> 717 basic_ostream<_CharT, _Traits>& 718 basic_ostream<_CharT, _Traits>::operator<<(const void* __n) 719 { 720 #ifndef _LIBCPP_NO_EXCEPTIONS 721 try 722 { 723 #endif // _LIBCPP_NO_EXCEPTIONS 724 sentry __s(*this); 725 if (__s) 726 { 727 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 728 const _Fp& __f = use_facet<_Fp>(this->getloc()); 729 if (__f.put(*this, *this, this->fill(), __n).failed()) 730 this->setstate(ios_base::badbit | ios_base::failbit); 731 } 732 #ifndef _LIBCPP_NO_EXCEPTIONS 733 } 734 catch (...) 735 { 736 this->__set_badbit_and_consider_rethrow(); 737 } 738 #endif // _LIBCPP_NO_EXCEPTIONS 739 return *this; 740 } 741 742 template<class _CharT, class _Traits> 743 basic_ostream<_CharT, _Traits>& 744 __put_character_sequence(basic_ostream<_CharT, _Traits>& __os, 745 const _CharT* __str, size_t __len) 746 { 747 #ifndef _LIBCPP_NO_EXCEPTIONS 748 try 749 { 750 #endif // _LIBCPP_NO_EXCEPTIONS 751 typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 752 if (__s) 753 { 754 typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 755 if (__pad_and_output(_Ip(__os), 756 __str, 757 (__os.flags() & ios_base::adjustfield) == ios_base::left ? 758 __str + __len : 759 __str, 760 __str + __len, 761 __os, 762 __os.fill()).failed()) 763 __os.setstate(ios_base::badbit | ios_base::failbit); 764 } 765 #ifndef _LIBCPP_NO_EXCEPTIONS 766 } 767 catch (...) 768 { 769 __os.__set_badbit_and_consider_rethrow(); 770 } 771 #endif // _LIBCPP_NO_EXCEPTIONS 772 return __os; 773 } 774 775 776 template<class _CharT, class _Traits> 777 basic_ostream<_CharT, _Traits>& 778 operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) 779 { 780 return _VSTD::__put_character_sequence(__os, &__c, 1); 781 } 782 783 template<class _CharT, class _Traits> 784 basic_ostream<_CharT, _Traits>& 785 operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) 786 { 787 #ifndef _LIBCPP_NO_EXCEPTIONS 788 try 789 { 790 #endif // _LIBCPP_NO_EXCEPTIONS 791 typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 792 if (__s) 793 { 794 _CharT __c = __os.widen(__cn); 795 typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 796 if (__pad_and_output(_Ip(__os), 797 &__c, 798 (__os.flags() & ios_base::adjustfield) == ios_base::left ? 799 &__c + 1 : 800 &__c, 801 &__c + 1, 802 __os, 803 __os.fill()).failed()) 804 __os.setstate(ios_base::badbit | ios_base::failbit); 805 } 806 #ifndef _LIBCPP_NO_EXCEPTIONS 807 } 808 catch (...) 809 { 810 __os.__set_badbit_and_consider_rethrow(); 811 } 812 #endif // _LIBCPP_NO_EXCEPTIONS 813 return __os; 814 } 815 816 template<class _Traits> 817 basic_ostream<char, _Traits>& 818 operator<<(basic_ostream<char, _Traits>& __os, char __c) 819 { 820 return _VSTD::__put_character_sequence(__os, &__c, 1); 821 } 822 823 template<class _Traits> 824 basic_ostream<char, _Traits>& 825 operator<<(basic_ostream<char, _Traits>& __os, signed char __c) 826 { 827 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1); 828 } 829 830 template<class _Traits> 831 basic_ostream<char, _Traits>& 832 operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) 833 { 834 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1); 835 } 836 837 template<class _CharT, class _Traits> 838 basic_ostream<_CharT, _Traits>& 839 operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) 840 { 841 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str)); 842 } 843 844 template<class _CharT, class _Traits> 845 basic_ostream<_CharT, _Traits>& 846 operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) 847 { 848 #ifndef _LIBCPP_NO_EXCEPTIONS 849 try 850 { 851 #endif // _LIBCPP_NO_EXCEPTIONS 852 typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 853 if (__s) 854 { 855 typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 856 size_t __len = char_traits<char>::length(__strn); 857 const int __bs = 100; 858 _CharT __wbb[__bs]; 859 _CharT* __wb = __wbb; 860 unique_ptr<_CharT, void(*)(void*)> __h(0, free); 861 if (__len > __bs) 862 { 863 __wb = (_CharT*)malloc(__len*sizeof(_CharT)); 864 if (__wb == 0) 865 __throw_bad_alloc(); 866 __h.reset(__wb); 867 } 868 for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p) 869 *__p = __os.widen(*__strn); 870 if (__pad_and_output(_Ip(__os), 871 __wb, 872 (__os.flags() & ios_base::adjustfield) == ios_base::left ? 873 __wb + __len : 874 __wb, 875 __wb + __len, 876 __os, 877 __os.fill()).failed()) 878 __os.setstate(ios_base::badbit | ios_base::failbit); 879 } 880 #ifndef _LIBCPP_NO_EXCEPTIONS 881 } 882 catch (...) 883 { 884 __os.__set_badbit_and_consider_rethrow(); 885 } 886 #endif // _LIBCPP_NO_EXCEPTIONS 887 return __os; 888 } 889 890 template<class _Traits> 891 basic_ostream<char, _Traits>& 892 operator<<(basic_ostream<char, _Traits>& __os, const char* __str) 893 { 894 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str)); 895 } 896 897 template<class _Traits> 898 basic_ostream<char, _Traits>& 899 operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) 900 { 901 const char *__s = (const char *) __str; 902 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s)); 903 } 904 905 template<class _Traits> 906 basic_ostream<char, _Traits>& 907 operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) 908 { 909 const char *__s = (const char *) __str; 910 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s)); 911 } 912 913 template <class _CharT, class _Traits> 914 basic_ostream<_CharT, _Traits>& 915 basic_ostream<_CharT, _Traits>::put(char_type __c) 916 { 917 #ifndef _LIBCPP_NO_EXCEPTIONS 918 try 919 { 920 #endif // _LIBCPP_NO_EXCEPTIONS 921 sentry __s(*this); 922 if (__s) 923 { 924 typedef ostreambuf_iterator<_CharT, _Traits> _Op; 925 _Op __o(*this); 926 *__o = __c; 927 if (__o.failed()) 928 this->setstate(ios_base::badbit); 929 } 930 #ifndef _LIBCPP_NO_EXCEPTIONS 931 } 932 catch (...) 933 { 934 this->__set_badbit_and_consider_rethrow(); 935 } 936 #endif // _LIBCPP_NO_EXCEPTIONS 937 return *this; 938 } 939 940 template <class _CharT, class _Traits> 941 basic_ostream<_CharT, _Traits>& 942 basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) 943 { 944 #ifndef _LIBCPP_NO_EXCEPTIONS 945 try 946 { 947 #endif // _LIBCPP_NO_EXCEPTIONS 948 sentry __sen(*this); 949 if (__sen && __n) 950 { 951 if (this->rdbuf()->sputn(__s, __n) != __n) 952 this->setstate(ios_base::badbit); 953 } 954 #ifndef _LIBCPP_NO_EXCEPTIONS 955 } 956 catch (...) 957 { 958 this->__set_badbit_and_consider_rethrow(); 959 } 960 #endif // _LIBCPP_NO_EXCEPTIONS 961 return *this; 962 } 963 964 template <class _CharT, class _Traits> 965 basic_ostream<_CharT, _Traits>& 966 basic_ostream<_CharT, _Traits>::flush() 967 { 968 #ifndef _LIBCPP_NO_EXCEPTIONS 969 try 970 { 971 #endif // _LIBCPP_NO_EXCEPTIONS 972 if (this->rdbuf()) 973 { 974 sentry __s(*this); 975 if (__s) 976 { 977 if (this->rdbuf()->pubsync() == -1) 978 this->setstate(ios_base::badbit); 979 } 980 } 981 #ifndef _LIBCPP_NO_EXCEPTIONS 982 } 983 catch (...) 984 { 985 this->__set_badbit_and_consider_rethrow(); 986 } 987 #endif // _LIBCPP_NO_EXCEPTIONS 988 return *this; 989 } 990 991 template <class _CharT, class _Traits> 992 inline _LIBCPP_INLINE_VISIBILITY 993 typename basic_ostream<_CharT, _Traits>::pos_type 994 basic_ostream<_CharT, _Traits>::tellp() 995 { 996 if (this->fail()) 997 return pos_type(-1); 998 return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); 999 } 1000 1001 template <class _CharT, class _Traits> 1002 inline _LIBCPP_INLINE_VISIBILITY 1003 basic_ostream<_CharT, _Traits>& 1004 basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) 1005 { 1006 sentry __s(*this); 1007 if (!this->fail()) 1008 { 1009 if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1)) 1010 this->setstate(ios_base::failbit); 1011 } 1012 return *this; 1013 } 1014 1015 template <class _CharT, class _Traits> 1016 inline _LIBCPP_INLINE_VISIBILITY 1017 basic_ostream<_CharT, _Traits>& 1018 basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) 1019 { 1020 sentry __s(*this); 1021 if (!this->fail()) 1022 { 1023 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1)) 1024 this->setstate(ios_base::failbit); 1025 } 1026 return *this; 1027 } 1028 1029 template <class _CharT, class _Traits> 1030 inline _LIBCPP_INLINE_VISIBILITY 1031 basic_ostream<_CharT, _Traits>& 1032 endl(basic_ostream<_CharT, _Traits>& __os) 1033 { 1034 __os.put(__os.widen('\n')); 1035 __os.flush(); 1036 return __os; 1037 } 1038 1039 template <class _CharT, class _Traits> 1040 inline _LIBCPP_INLINE_VISIBILITY 1041 basic_ostream<_CharT, _Traits>& 1042 ends(basic_ostream<_CharT, _Traits>& __os) 1043 { 1044 __os.put(_CharT()); 1045 return __os; 1046 } 1047 1048 template <class _CharT, class _Traits> 1049 inline _LIBCPP_INLINE_VISIBILITY 1050 basic_ostream<_CharT, _Traits>& 1051 flush(basic_ostream<_CharT, _Traits>& __os) 1052 { 1053 __os.flush(); 1054 return __os; 1055 } 1056 1057 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1058 1059 template <class _Stream, class _Tp> 1060 inline _LIBCPP_INLINE_VISIBILITY 1061 typename enable_if 1062 < 1063 !is_lvalue_reference<_Stream>::value && 1064 is_base_of<ios_base, _Stream>::value, 1065 _Stream&& 1066 >::type 1067 operator<<(_Stream&& __os, const _Tp& __x) 1068 { 1069 __os << __x; 1070 return _VSTD::move(__os); 1071 } 1072 1073 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1074 1075 template<class _CharT, class _Traits, class _Allocator> 1076 basic_ostream<_CharT, _Traits>& 1077 operator<<(basic_ostream<_CharT, _Traits>& __os, 1078 const basic_string<_CharT, _Traits, _Allocator>& __str) 1079 { 1080 return _VSTD::__put_character_sequence(__os, __str.data(), __str.size()); 1081 } 1082 1083 template <class _CharT, class _Traits> 1084 inline _LIBCPP_INLINE_VISIBILITY 1085 basic_ostream<_CharT, _Traits>& 1086 operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) 1087 { 1088 return __os << __ec.category().name() << ':' << __ec.value(); 1089 } 1090 1091 template<class _CharT, class _Traits, class _Yp> 1092 inline _LIBCPP_INLINE_VISIBILITY 1093 basic_ostream<_CharT, _Traits>& 1094 operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) 1095 { 1096 return __os << __p.get(); 1097 } 1098 1099 template <class _CharT, class _Traits, size_t _Size> 1100 basic_ostream<_CharT, _Traits>& 1101 operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) 1102 { 1103 return __os << __x.template to_string<_CharT, _Traits> 1104 (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'), 1105 use_facet<ctype<_CharT> >(__os.getloc()).widen('1')); 1106 } 1107 1108 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<char>) 1109 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<wchar_t>) 1110 1111 _LIBCPP_END_NAMESPACE_STD 1112 1113 #endif // _LIBCPP_OSTREAM 1114