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
17template <class charT, class traits = char_traits<charT> >
18class basic_ostream
19    : virtual public basic_ios<charT,traits>
20{
21public:
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);
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 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
150template <class _CharT, class _Traits>
151class _LIBCPP_TYPE_VIS_ONLY 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    explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb);
164    virtual ~basic_ostream();
165protected:
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
185public:
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
220protected:
221    _LIBCPP_ALWAYS_INLINE
222    basic_ostream() {}  // extension, intentially does not initialize
223};
224
225template <class _CharT, class _Traits>
226class _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
234public:
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
243template <class _CharT, class _Traits>
244basic_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
256template <class _CharT, class _Traits>
257basic_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
277template <class _CharT, class _Traits>
278inline _LIBCPP_INLINE_VISIBILITY
279basic_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
286template <class _CharT, class _Traits>
287inline _LIBCPP_INLINE_VISIBILITY
288basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs)
289{
290    this->move(__rhs);
291}
292
293template <class _CharT, class _Traits>
294inline _LIBCPP_INLINE_VISIBILITY
295basic_ostream<_CharT, _Traits>&
296basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs)
297{
298    swap(__rhs);
299    return *this;
300}
301
302#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
303
304template <class _CharT, class _Traits>
305basic_ostream<_CharT, _Traits>::~basic_ostream()
306{
307}
308
309template <class _CharT, class _Traits>
310inline _LIBCPP_INLINE_VISIBILITY
311void
312basic_ostream<_CharT, _Traits>::swap(basic_ostream& __rhs)
313{
314    basic_ios<char_type, traits_type>::swap(__rhs);
315}
316
317template <class _CharT, class _Traits>
318inline _LIBCPP_INLINE_VISIBILITY
319basic_ostream<_CharT, _Traits>&
320basic_ostream<_CharT, _Traits>::operator<<(basic_ostream& (*__pf)(basic_ostream&))
321{
322    return __pf(*this);
323}
324
325template <class _CharT, class _Traits>
326inline _LIBCPP_INLINE_VISIBILITY
327basic_ostream<_CharT, _Traits>&
328basic_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
335template <class _CharT, class _Traits>
336inline _LIBCPP_INLINE_VISIBILITY
337basic_ostream<_CharT, _Traits>&
338basic_ostream<_CharT, _Traits>::operator<<(ios_base& (*__pf)(ios_base&))
339{
340    __pf(*this);
341    return *this;
342}
343
344template <class _CharT, class _Traits>
345basic_ostream<_CharT, _Traits>&
346basic_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
396template <class _CharT, class _Traits>
397basic_ostream<_CharT, _Traits>&
398basic_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
422template <class _CharT, class _Traits>
423basic_ostream<_CharT, _Traits>&
424basic_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
452template <class _CharT, class _Traits>
453basic_ostream<_CharT, _Traits>&
454basic_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
478template <class _CharT, class _Traits>
479basic_ostream<_CharT, _Traits>&
480basic_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
508template <class _CharT, class _Traits>
509basic_ostream<_CharT, _Traits>&
510basic_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
534template <class _CharT, class _Traits>
535basic_ostream<_CharT, _Traits>&
536basic_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
560template <class _CharT, class _Traits>
561basic_ostream<_CharT, _Traits>&
562basic_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
586template <class _CharT, class _Traits>
587basic_ostream<_CharT, _Traits>&
588basic_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
612template <class _CharT, class _Traits>
613basic_ostream<_CharT, _Traits>&
614basic_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
638template <class _CharT, class _Traits>
639basic_ostream<_CharT, _Traits>&
640basic_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
664template <class _CharT, class _Traits>
665basic_ostream<_CharT, _Traits>&
666basic_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
690template <class _CharT, class _Traits>
691basic_ostream<_CharT, _Traits>&
692basic_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
716template <class _CharT, class _Traits>
717basic_ostream<_CharT, _Traits>&
718basic_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
742template<class _CharT, class _Traits>
743basic_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
776template<class _CharT, class _Traits>
777basic_ostream<_CharT, _Traits>&
778operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c)
779{
780    return _VSTD::__put_character_sequence(__os, &__c, 1);
781}
782
783template<class _CharT, class _Traits>
784basic_ostream<_CharT, _Traits>&
785operator<<(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
816template<class _Traits>
817basic_ostream<char, _Traits>&
818operator<<(basic_ostream<char, _Traits>& __os, char __c)
819{
820    return _VSTD::__put_character_sequence(__os, &__c, 1);
821}
822
823template<class _Traits>
824basic_ostream<char, _Traits>&
825operator<<(basic_ostream<char, _Traits>& __os, signed char __c)
826{
827    return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
828}
829
830template<class _Traits>
831basic_ostream<char, _Traits>&
832operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)
833{
834    return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
835}
836
837template<class _CharT, class _Traits>
838basic_ostream<_CharT, _Traits>&
839operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str)
840{
841    return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
842}
843
844template<class _CharT, class _Traits>
845basic_ostream<_CharT, _Traits>&
846operator<<(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
890template<class _Traits>
891basic_ostream<char, _Traits>&
892operator<<(basic_ostream<char, _Traits>& __os, const char* __str)
893{
894    return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
895}
896
897template<class _Traits>
898basic_ostream<char, _Traits>&
899operator<<(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
905template<class _Traits>
906basic_ostream<char, _Traits>&
907operator<<(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
913template <class _CharT, class _Traits>
914basic_ostream<_CharT, _Traits>&
915basic_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
940template <class _CharT, class _Traits>
941basic_ostream<_CharT, _Traits>&
942basic_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
964template <class _CharT, class _Traits>
965basic_ostream<_CharT, _Traits>&
966basic_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
991template <class _CharT, class _Traits>
992inline _LIBCPP_INLINE_VISIBILITY
993typename basic_ostream<_CharT, _Traits>::pos_type
994basic_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
1001template <class _CharT, class _Traits>
1002inline _LIBCPP_INLINE_VISIBILITY
1003basic_ostream<_CharT, _Traits>&
1004basic_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
1015template <class _CharT, class _Traits>
1016inline _LIBCPP_INLINE_VISIBILITY
1017basic_ostream<_CharT, _Traits>&
1018basic_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
1029template <class _CharT, class _Traits>
1030inline _LIBCPP_INLINE_VISIBILITY
1031basic_ostream<_CharT, _Traits>&
1032endl(basic_ostream<_CharT, _Traits>& __os)
1033{
1034    __os.put(__os.widen('\n'));
1035    __os.flush();
1036    return __os;
1037}
1038
1039template <class _CharT, class _Traits>
1040inline _LIBCPP_INLINE_VISIBILITY
1041basic_ostream<_CharT, _Traits>&
1042ends(basic_ostream<_CharT, _Traits>& __os)
1043{
1044    __os.put(_CharT());
1045    return __os;
1046}
1047
1048template <class _CharT, class _Traits>
1049inline _LIBCPP_INLINE_VISIBILITY
1050basic_ostream<_CharT, _Traits>&
1051flush(basic_ostream<_CharT, _Traits>& __os)
1052{
1053    __os.flush();
1054    return __os;
1055}
1056
1057#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1058
1059template <class _Stream, class _Tp>
1060inline _LIBCPP_INLINE_VISIBILITY
1061typename enable_if
1062<
1063    !is_lvalue_reference<_Stream>::value &&
1064    is_base_of<ios_base, _Stream>::value,
1065    _Stream&&
1066>::type
1067operator<<(_Stream&& __os, const _Tp& __x)
1068{
1069    __os << __x;
1070    return _VSTD::move(__os);
1071}
1072
1073#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1074
1075template<class _CharT, class _Traits, class _Allocator>
1076basic_ostream<_CharT, _Traits>&
1077operator<<(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
1083template <class _CharT, class _Traits>
1084inline _LIBCPP_INLINE_VISIBILITY
1085basic_ostream<_CharT, _Traits>&
1086operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec)
1087{
1088    return __os << __ec.category().name() << ':' << __ec.value();
1089}
1090
1091template<class _CharT, class _Traits, class _Yp>
1092inline _LIBCPP_INLINE_VISIBILITY
1093basic_ostream<_CharT, _Traits>&
1094operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p)
1095{
1096    return __os << __p.get();
1097}
1098
1099template <class _CharT, class _Traits, size_t _Size>
1100basic_ostream<_CharT, _Traits>&
1101operator<<(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