1// -*- C++ -*- 2//===-------------------------- ostream -----------------------------------===// 3// 4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5// See https://llvm.org/LICENSE.txt for license information. 6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef _LIBCPP_OSTREAM 11#define _LIBCPP_OSTREAM 12 13/* 14 ostream synopsis 15 16template <class charT, class traits = char_traits<charT> > 17class basic_ostream 18 : virtual public basic_ios<charT,traits> 19{ 20public: 21 // types (inherited from basic_ios (27.5.4)): 22 typedef charT char_type; 23 typedef traits traits_type; 24 typedef typename traits_type::int_type int_type; 25 typedef typename traits_type::pos_type pos_type; 26 typedef typename traits_type::off_type off_type; 27 28 // 27.7.2.2 Constructor/destructor: 29 explicit basic_ostream(basic_streambuf<char_type,traits>* sb); 30 basic_ostream(basic_ostream&& rhs); 31 virtual ~basic_ostream(); 32 33 // 27.7.2.3 Assign/swap 34 basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14 35 basic_ostream& operator=(basic_ostream&& rhs); 36 void swap(basic_ostream& rhs); 37 38 // 27.7.2.4 Prefix/suffix: 39 class sentry; 40 41 // 27.7.2.6 Formatted output: 42 basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&)); 43 basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&)); 44 basic_ostream& operator<<(ios_base& (*pf)(ios_base&)); 45 basic_ostream& operator<<(bool n); 46 basic_ostream& operator<<(short n); 47 basic_ostream& operator<<(unsigned short n); 48 basic_ostream& operator<<(int n); 49 basic_ostream& operator<<(unsigned int n); 50 basic_ostream& operator<<(long n); 51 basic_ostream& operator<<(unsigned long n); 52 basic_ostream& operator<<(long long n); 53 basic_ostream& operator<<(unsigned long long n); 54 basic_ostream& operator<<(float f); 55 basic_ostream& operator<<(double f); 56 basic_ostream& operator<<(long double f); 57 basic_ostream& operator<<(const void* p); 58 basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb); 59 basic_ostream& operator<<(nullptr_t); 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); 70protected: 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 81template<class charT, class traits> 82 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT); 83 84template<class charT, class traits> 85 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char); 86 87template<class traits> 88 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char); 89 90// signed and unsigned 91 92template<class traits> 93 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char); 94 95template<class traits> 96 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char); 97 98// NTBS 99template<class charT, class traits> 100 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*); 101 102template<class charT, class traits> 103 basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*); 104 105template<class traits> 106 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*); 107 108// signed and unsigned 109template<class traits> 110basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*); 111 112template<class traits> 113 basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*); 114 115// swap: 116template <class charT, class traits> 117 void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y); 118 119template <class charT, class traits> 120 basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); 121 122template <class charT, class traits> 123 basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os); 124 125template <class charT, class traits> 126 basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os); 127 128// rvalue stream insertion 129template <class Stream, class T> 130 Stream&& operator<<(Stream&& os, const T& x); 131 132} // std 133 134*/ 135 136#include <__config> 137#include <ios> 138#include <streambuf> 139#include <locale> 140#include <iterator> 141#include <bitset> 142#include <version> 143 144#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 145#pragma GCC system_header 146#endif 147 148_LIBCPP_BEGIN_NAMESPACE_STD 149 150template <class _CharT, class _Traits> 151class _LIBCPP_TEMPLATE_VIS basic_ostream 152 : virtual public basic_ios<_CharT, _Traits> 153{ 154public: 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 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 164 explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb) 165 { this->init(__sb); } 166 virtual ~basic_ostream(); 167protected: 168#ifndef _LIBCPP_CXX03_LANG 169 inline _LIBCPP_INLINE_VISIBILITY 170 basic_ostream(basic_ostream&& __rhs); 171 172 // 27.7.2.3 Assign/swap 173 inline _LIBCPP_INLINE_VISIBILITY 174 basic_ostream& operator=(basic_ostream&& __rhs); 175#endif 176 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 177 void swap(basic_ostream& __rhs) 178 { basic_ios<char_type, traits_type>::swap(__rhs); } 179 180#ifndef _LIBCPP_CXX03_LANG 181 basic_ostream (const basic_ostream& __rhs) = delete; 182 basic_ostream& operator=(const basic_ostream& __rhs) = delete; 183#else 184 basic_ostream (const basic_ostream& __rhs); // not defined 185 basic_ostream& operator=(const basic_ostream& __rhs); // not defined 186#endif 187public: 188 189 // 27.7.2.4 Prefix/suffix: 190 class _LIBCPP_TEMPLATE_VIS sentry; 191 192 // 27.7.2.6 Formatted output: 193 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 194 basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)) 195 { return __pf(*this); } 196 197 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 198 basic_ostream& operator<<(basic_ios<char_type, traits_type>& 199 (*__pf)(basic_ios<char_type,traits_type>&)) 200 { __pf(*this); return *this; } 201 202 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 203 basic_ostream& operator<<(ios_base& (*__pf)(ios_base&)) 204 { __pf(*this); return *this; } 205 206 basic_ostream& operator<<(bool __n); 207 basic_ostream& operator<<(short __n); 208 basic_ostream& operator<<(unsigned short __n); 209 basic_ostream& operator<<(int __n); 210 basic_ostream& operator<<(unsigned int __n); 211 basic_ostream& operator<<(long __n); 212 basic_ostream& operator<<(unsigned long __n); 213 basic_ostream& operator<<(long long __n); 214 basic_ostream& operator<<(unsigned long long __n); 215 basic_ostream& operator<<(float __f); 216 basic_ostream& operator<<(double __f); 217 basic_ostream& operator<<(long double __f); 218 basic_ostream& operator<<(const void* __p); 219 basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb); 220 221 _LIBCPP_INLINE_VISIBILITY 222 basic_ostream& operator<<(nullptr_t) 223 { return *this << "nullptr"; } 224 225 // 27.7.2.7 Unformatted output: 226 basic_ostream& put(char_type __c); 227 basic_ostream& write(const char_type* __s, streamsize __n); 228 basic_ostream& flush(); 229 230 // 27.7.2.5 seeks: 231 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 232 pos_type tellp(); 233 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 234 basic_ostream& seekp(pos_type __pos); 235 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 236 basic_ostream& seekp(off_type __off, ios_base::seekdir __dir); 237 238protected: 239 _LIBCPP_INLINE_VISIBILITY 240 basic_ostream() {} // extension, intentially does not initialize 241}; 242 243template <class _CharT, class _Traits> 244class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry 245{ 246 bool __ok_; 247 basic_ostream<_CharT, _Traits>& __os_; 248 249 sentry(const sentry&); // = delete; 250 sentry& operator=(const sentry&); // = delete; 251 252public: 253 explicit sentry(basic_ostream<_CharT, _Traits>& __os); 254 ~sentry(); 255 256 _LIBCPP_INLINE_VISIBILITY 257 _LIBCPP_EXPLICIT 258 operator bool() const {return __ok_;} 259}; 260 261template <class _CharT, class _Traits> 262basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) 263 : __ok_(false), 264 __os_(__os) 265{ 266 if (__os.good()) 267 { 268 if (__os.tie()) 269 __os.tie()->flush(); 270 __ok_ = true; 271 } 272} 273 274template <class _CharT, class _Traits> 275basic_ostream<_CharT, _Traits>::sentry::~sentry() 276{ 277 if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) 278 && !uncaught_exception()) 279 { 280#ifndef _LIBCPP_NO_EXCEPTIONS 281 try 282 { 283#endif // _LIBCPP_NO_EXCEPTIONS 284 if (__os_.rdbuf()->pubsync() == -1) 285 __os_.setstate(ios_base::badbit); 286#ifndef _LIBCPP_NO_EXCEPTIONS 287 } 288 catch (...) 289 { 290 } 291#endif // _LIBCPP_NO_EXCEPTIONS 292 } 293} 294 295#ifndef _LIBCPP_CXX03_LANG 296 297template <class _CharT, class _Traits> 298basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) 299{ 300 this->move(__rhs); 301} 302 303template <class _CharT, class _Traits> 304basic_ostream<_CharT, _Traits>& 305basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs) 306{ 307 swap(__rhs); 308 return *this; 309} 310 311#endif // _LIBCPP_CXX03_LANG 312 313template <class _CharT, class _Traits> 314basic_ostream<_CharT, _Traits>::~basic_ostream() 315{ 316} 317 318template <class _CharT, class _Traits> 319basic_ostream<_CharT, _Traits>& 320basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) 321{ 322#ifndef _LIBCPP_NO_EXCEPTIONS 323 try 324 { 325#endif // _LIBCPP_NO_EXCEPTIONS 326 sentry __s(*this); 327 if (__s) 328 { 329 if (__sb) 330 { 331#ifndef _LIBCPP_NO_EXCEPTIONS 332 try 333 { 334#endif // _LIBCPP_NO_EXCEPTIONS 335 typedef istreambuf_iterator<_CharT, _Traits> _Ip; 336 typedef ostreambuf_iterator<_CharT, _Traits> _Op; 337 _Ip __i(__sb); 338 _Ip __eof; 339 _Op __o(*this); 340 size_t __c = 0; 341 for (; __i != __eof; ++__i, ++__o, ++__c) 342 { 343 *__o = *__i; 344 if (__o.failed()) 345 break; 346 } 347 if (__c == 0) 348 this->setstate(ios_base::failbit); 349#ifndef _LIBCPP_NO_EXCEPTIONS 350 } 351 catch (...) 352 { 353 this->__set_failbit_and_consider_rethrow(); 354 } 355#endif // _LIBCPP_NO_EXCEPTIONS 356 } 357 else 358 this->setstate(ios_base::badbit); 359 } 360#ifndef _LIBCPP_NO_EXCEPTIONS 361 } 362 catch (...) 363 { 364 this->__set_badbit_and_consider_rethrow(); 365 } 366#endif // _LIBCPP_NO_EXCEPTIONS 367 return *this; 368} 369 370template <class _CharT, class _Traits> 371basic_ostream<_CharT, _Traits>& 372basic_ostream<_CharT, _Traits>::operator<<(bool __n) 373{ 374#ifndef _LIBCPP_NO_EXCEPTIONS 375 try 376 { 377#endif // _LIBCPP_NO_EXCEPTIONS 378 sentry __s(*this); 379 if (__s) 380 { 381 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 382 const _Fp& __f = use_facet<_Fp>(this->getloc()); 383 if (__f.put(*this, *this, this->fill(), __n).failed()) 384 this->setstate(ios_base::badbit | ios_base::failbit); 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 396template <class _CharT, class _Traits> 397basic_ostream<_CharT, _Traits>& 398basic_ostream<_CharT, _Traits>::operator<<(short __n) 399{ 400#ifndef _LIBCPP_NO_EXCEPTIONS 401 try 402 { 403#endif // _LIBCPP_NO_EXCEPTIONS 404 sentry __s(*this); 405 if (__s) 406 { 407 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; 408 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 409 const _Fp& __f = use_facet<_Fp>(this->getloc()); 410 if (__f.put(*this, *this, this->fill(), 411 __flags == ios_base::oct || __flags == ios_base::hex ? 412 static_cast<long>(static_cast<unsigned short>(__n)) : 413 static_cast<long>(__n)).failed()) 414 this->setstate(ios_base::badbit | ios_base::failbit); 415 } 416#ifndef _LIBCPP_NO_EXCEPTIONS 417 } 418 catch (...) 419 { 420 this->__set_badbit_and_consider_rethrow(); 421 } 422#endif // _LIBCPP_NO_EXCEPTIONS 423 return *this; 424} 425 426template <class _CharT, class _Traits> 427basic_ostream<_CharT, _Traits>& 428basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) 429{ 430#ifndef _LIBCPP_NO_EXCEPTIONS 431 try 432 { 433#endif // _LIBCPP_NO_EXCEPTIONS 434 sentry __s(*this); 435 if (__s) 436 { 437 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 438 const _Fp& __f = use_facet<_Fp>(this->getloc()); 439 if (__f.put(*this, *this, this->fill(), static_cast<unsigned 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 452template <class _CharT, class _Traits> 453basic_ostream<_CharT, _Traits>& 454basic_ostream<_CharT, _Traits>::operator<<(int __n) 455{ 456#ifndef _LIBCPP_NO_EXCEPTIONS 457 try 458 { 459#endif // _LIBCPP_NO_EXCEPTIONS 460 sentry __s(*this); 461 if (__s) 462 { 463 ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; 464 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 465 const _Fp& __f = use_facet<_Fp>(this->getloc()); 466 if (__f.put(*this, *this, this->fill(), 467 __flags == ios_base::oct || __flags == ios_base::hex ? 468 static_cast<long>(static_cast<unsigned int>(__n)) : 469 static_cast<long>(__n)).failed()) 470 this->setstate(ios_base::badbit | ios_base::failbit); 471 } 472#ifndef _LIBCPP_NO_EXCEPTIONS 473 } 474 catch (...) 475 { 476 this->__set_badbit_and_consider_rethrow(); 477 } 478#endif // _LIBCPP_NO_EXCEPTIONS 479 return *this; 480} 481 482template <class _CharT, class _Traits> 483basic_ostream<_CharT, _Traits>& 484basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) 485{ 486#ifndef _LIBCPP_NO_EXCEPTIONS 487 try 488 { 489#endif // _LIBCPP_NO_EXCEPTIONS 490 sentry __s(*this); 491 if (__s) 492 { 493 typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; 494 const _Fp& __f = use_facet<_Fp>(this->getloc()); 495 if (__f.put(*this, *this, this->fill(), static_cast<unsigned 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 508template <class _CharT, class _Traits> 509basic_ostream<_CharT, _Traits>& 510basic_ostream<_CharT, _Traits>::operator<<(long __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(), __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 534template <class _CharT, class _Traits> 535basic_ostream<_CharT, _Traits>& 536basic_ostream<_CharT, _Traits>::operator<<(unsigned 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 560template <class _CharT, class _Traits> 561basic_ostream<_CharT, _Traits>& 562basic_ostream<_CharT, _Traits>::operator<<(long 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 586template <class _CharT, class _Traits> 587basic_ostream<_CharT, _Traits>& 588basic_ostream<_CharT, _Traits>::operator<<(unsigned 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 612template <class _CharT, class _Traits> 613basic_ostream<_CharT, _Traits>& 614basic_ostream<_CharT, _Traits>::operator<<(float __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(), static_cast<double>(__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 638template <class _CharT, class _Traits> 639basic_ostream<_CharT, _Traits>& 640basic_ostream<_CharT, _Traits>::operator<<(double __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(), __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 664template <class _CharT, class _Traits> 665basic_ostream<_CharT, _Traits>& 666basic_ostream<_CharT, _Traits>::operator<<(long 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 690template <class _CharT, class _Traits> 691basic_ostream<_CharT, _Traits>& 692basic_ostream<_CharT, _Traits>::operator<<(const void* __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 716template<class _CharT, class _Traits> 717basic_ostream<_CharT, _Traits>& 718__put_character_sequence(basic_ostream<_CharT, _Traits>& __os, 719 const _CharT* __str, size_t __len) 720{ 721#ifndef _LIBCPP_NO_EXCEPTIONS 722 try 723 { 724#endif // _LIBCPP_NO_EXCEPTIONS 725 typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 726 if (__s) 727 { 728 typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 729 if (__pad_and_output(_Ip(__os), 730 __str, 731 (__os.flags() & ios_base::adjustfield) == ios_base::left ? 732 __str + __len : 733 __str, 734 __str + __len, 735 __os, 736 __os.fill()).failed()) 737 __os.setstate(ios_base::badbit | ios_base::failbit); 738 } 739#ifndef _LIBCPP_NO_EXCEPTIONS 740 } 741 catch (...) 742 { 743 __os.__set_badbit_and_consider_rethrow(); 744 } 745#endif // _LIBCPP_NO_EXCEPTIONS 746 return __os; 747} 748 749 750template<class _CharT, class _Traits> 751basic_ostream<_CharT, _Traits>& 752operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) 753{ 754 return _VSTD::__put_character_sequence(__os, &__c, 1); 755} 756 757template<class _CharT, class _Traits> 758basic_ostream<_CharT, _Traits>& 759operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) 760{ 761#ifndef _LIBCPP_NO_EXCEPTIONS 762 try 763 { 764#endif // _LIBCPP_NO_EXCEPTIONS 765 typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 766 if (__s) 767 { 768 _CharT __c = __os.widen(__cn); 769 typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 770 if (__pad_and_output(_Ip(__os), 771 &__c, 772 (__os.flags() & ios_base::adjustfield) == ios_base::left ? 773 &__c + 1 : 774 &__c, 775 &__c + 1, 776 __os, 777 __os.fill()).failed()) 778 __os.setstate(ios_base::badbit | ios_base::failbit); 779 } 780#ifndef _LIBCPP_NO_EXCEPTIONS 781 } 782 catch (...) 783 { 784 __os.__set_badbit_and_consider_rethrow(); 785 } 786#endif // _LIBCPP_NO_EXCEPTIONS 787 return __os; 788} 789 790template<class _Traits> 791basic_ostream<char, _Traits>& 792operator<<(basic_ostream<char, _Traits>& __os, char __c) 793{ 794 return _VSTD::__put_character_sequence(__os, &__c, 1); 795} 796 797template<class _Traits> 798basic_ostream<char, _Traits>& 799operator<<(basic_ostream<char, _Traits>& __os, signed char __c) 800{ 801 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1); 802} 803 804template<class _Traits> 805basic_ostream<char, _Traits>& 806operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) 807{ 808 return _VSTD::__put_character_sequence(__os, (char *) &__c, 1); 809} 810 811template<class _CharT, class _Traits> 812basic_ostream<_CharT, _Traits>& 813operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) 814{ 815 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str)); 816} 817 818template<class _CharT, class _Traits> 819basic_ostream<_CharT, _Traits>& 820operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) 821{ 822#ifndef _LIBCPP_NO_EXCEPTIONS 823 try 824 { 825#endif // _LIBCPP_NO_EXCEPTIONS 826 typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 827 if (__s) 828 { 829 typedef ostreambuf_iterator<_CharT, _Traits> _Ip; 830 size_t __len = char_traits<char>::length(__strn); 831 const int __bs = 100; 832 _CharT __wbb[__bs]; 833 _CharT* __wb = __wbb; 834 unique_ptr<_CharT, void(*)(void*)> __h(0, free); 835 if (__len > __bs) 836 { 837 __wb = (_CharT*)malloc(__len*sizeof(_CharT)); 838 if (__wb == 0) 839 __throw_bad_alloc(); 840 __h.reset(__wb); 841 } 842 for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p) 843 *__p = __os.widen(*__strn); 844 if (__pad_and_output(_Ip(__os), 845 __wb, 846 (__os.flags() & ios_base::adjustfield) == ios_base::left ? 847 __wb + __len : 848 __wb, 849 __wb + __len, 850 __os, 851 __os.fill()).failed()) 852 __os.setstate(ios_base::badbit | ios_base::failbit); 853 } 854#ifndef _LIBCPP_NO_EXCEPTIONS 855 } 856 catch (...) 857 { 858 __os.__set_badbit_and_consider_rethrow(); 859 } 860#endif // _LIBCPP_NO_EXCEPTIONS 861 return __os; 862} 863 864template<class _Traits> 865basic_ostream<char, _Traits>& 866operator<<(basic_ostream<char, _Traits>& __os, const char* __str) 867{ 868 return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str)); 869} 870 871template<class _Traits> 872basic_ostream<char, _Traits>& 873operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) 874{ 875 const char *__s = (const char *) __str; 876 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s)); 877} 878 879template<class _Traits> 880basic_ostream<char, _Traits>& 881operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) 882{ 883 const char *__s = (const char *) __str; 884 return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s)); 885} 886 887template <class _CharT, class _Traits> 888basic_ostream<_CharT, _Traits>& 889basic_ostream<_CharT, _Traits>::put(char_type __c) 890{ 891#ifndef _LIBCPP_NO_EXCEPTIONS 892 try 893 { 894#endif // _LIBCPP_NO_EXCEPTIONS 895 sentry __s(*this); 896 if (__s) 897 { 898 typedef ostreambuf_iterator<_CharT, _Traits> _Op; 899 _Op __o(*this); 900 *__o = __c; 901 if (__o.failed()) 902 this->setstate(ios_base::badbit); 903 } 904#ifndef _LIBCPP_NO_EXCEPTIONS 905 } 906 catch (...) 907 { 908 this->__set_badbit_and_consider_rethrow(); 909 } 910#endif // _LIBCPP_NO_EXCEPTIONS 911 return *this; 912} 913 914template <class _CharT, class _Traits> 915basic_ostream<_CharT, _Traits>& 916basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) 917{ 918#ifndef _LIBCPP_NO_EXCEPTIONS 919 try 920 { 921#endif // _LIBCPP_NO_EXCEPTIONS 922 sentry __sen(*this); 923 if (__sen && __n) 924 { 925 if (this->rdbuf()->sputn(__s, __n) != __n) 926 this->setstate(ios_base::badbit); 927 } 928#ifndef _LIBCPP_NO_EXCEPTIONS 929 } 930 catch (...) 931 { 932 this->__set_badbit_and_consider_rethrow(); 933 } 934#endif // _LIBCPP_NO_EXCEPTIONS 935 return *this; 936} 937 938template <class _CharT, class _Traits> 939basic_ostream<_CharT, _Traits>& 940basic_ostream<_CharT, _Traits>::flush() 941{ 942#ifndef _LIBCPP_NO_EXCEPTIONS 943 try 944 { 945#endif // _LIBCPP_NO_EXCEPTIONS 946 if (this->rdbuf()) 947 { 948 sentry __s(*this); 949 if (__s) 950 { 951 if (this->rdbuf()->pubsync() == -1) 952 this->setstate(ios_base::badbit); 953 } 954 } 955#ifndef _LIBCPP_NO_EXCEPTIONS 956 } 957 catch (...) 958 { 959 this->__set_badbit_and_consider_rethrow(); 960 } 961#endif // _LIBCPP_NO_EXCEPTIONS 962 return *this; 963} 964 965template <class _CharT, class _Traits> 966typename basic_ostream<_CharT, _Traits>::pos_type 967basic_ostream<_CharT, _Traits>::tellp() 968{ 969 if (this->fail()) 970 return pos_type(-1); 971 return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); 972} 973 974template <class _CharT, class _Traits> 975basic_ostream<_CharT, _Traits>& 976basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) 977{ 978 sentry __s(*this); 979 if (!this->fail()) 980 { 981 if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1)) 982 this->setstate(ios_base::failbit); 983 } 984 return *this; 985} 986 987template <class _CharT, class _Traits> 988basic_ostream<_CharT, _Traits>& 989basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) 990{ 991 sentry __s(*this); 992 if (!this->fail()) 993 { 994 if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1)) 995 this->setstate(ios_base::failbit); 996 } 997 return *this; 998} 999 1000template <class _CharT, class _Traits> 1001inline 1002basic_ostream<_CharT, _Traits>& 1003endl(basic_ostream<_CharT, _Traits>& __os) 1004{ 1005 __os.put(__os.widen('\n')); 1006 __os.flush(); 1007 return __os; 1008} 1009 1010template <class _CharT, class _Traits> 1011inline 1012basic_ostream<_CharT, _Traits>& 1013ends(basic_ostream<_CharT, _Traits>& __os) 1014{ 1015 __os.put(_CharT()); 1016 return __os; 1017} 1018 1019template <class _CharT, class _Traits> 1020inline 1021basic_ostream<_CharT, _Traits>& 1022flush(basic_ostream<_CharT, _Traits>& __os) 1023{ 1024 __os.flush(); 1025 return __os; 1026} 1027 1028#ifndef _LIBCPP_CXX03_LANG 1029 1030template <class _Stream, class _Tp, class = void> 1031struct __is_ostreamable : false_type { }; 1032 1033template <class _Stream, class _Tp> 1034struct __is_ostreamable<_Stream, _Tp, decltype( 1035 _VSTD::declval<_Stream>() << _VSTD::declval<_Tp>(), void() 1036)> : true_type { }; 1037 1038template <class _Stream, class _Tp, class = typename enable_if< 1039 _And<is_base_of<ios_base, _Stream>, 1040 __is_ostreamable<_Stream&, const _Tp&>>::value 1041>::type> 1042_LIBCPP_INLINE_VISIBILITY 1043_Stream&& operator<<(_Stream&& __os, const _Tp& __x) 1044{ 1045 __os << __x; 1046 return _VSTD::move(__os); 1047} 1048 1049#endif // _LIBCPP_CXX03_LANG 1050 1051template<class _CharT, class _Traits, class _Allocator> 1052basic_ostream<_CharT, _Traits>& 1053operator<<(basic_ostream<_CharT, _Traits>& __os, 1054 const basic_string<_CharT, _Traits, _Allocator>& __str) 1055{ 1056 return _VSTD::__put_character_sequence(__os, __str.data(), __str.size()); 1057} 1058 1059template<class _CharT, class _Traits> 1060basic_ostream<_CharT, _Traits>& 1061operator<<(basic_ostream<_CharT, _Traits>& __os, 1062 basic_string_view<_CharT, _Traits> __sv) 1063{ 1064 return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size()); 1065} 1066 1067template <class _CharT, class _Traits> 1068inline _LIBCPP_INLINE_VISIBILITY 1069basic_ostream<_CharT, _Traits>& 1070operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) 1071{ 1072 return __os << __ec.category().name() << ':' << __ec.value(); 1073} 1074 1075template<class _CharT, class _Traits, class _Yp> 1076inline _LIBCPP_INLINE_VISIBILITY 1077basic_ostream<_CharT, _Traits>& 1078operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) 1079{ 1080 return __os << __p.get(); 1081} 1082 1083template<class _CharT, class _Traits, class _Yp, class _Dp> 1084inline _LIBCPP_INLINE_VISIBILITY 1085typename enable_if 1086< 1087 is_same<void, typename __void_t<decltype((declval<basic_ostream<_CharT, _Traits>&>() << declval<typename unique_ptr<_Yp, _Dp>::pointer>()))>::type>::value, 1088 basic_ostream<_CharT, _Traits>& 1089>::type 1090operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p) 1091{ 1092 return __os << __p.get(); 1093} 1094 1095template <class _CharT, class _Traits, size_t _Size> 1096basic_ostream<_CharT, _Traits>& 1097operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) 1098{ 1099 return __os << __x.template to_string<_CharT, _Traits> 1100 (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'), 1101 use_facet<ctype<_CharT> >(__os.getloc()).widen('1')); 1102} 1103 1104_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>) 1105_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>) 1106 1107_LIBCPP_END_NAMESPACE_STD 1108 1109#endif // _LIBCPP_OSTREAM 1110