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