100db7afdSDavid E. O'Brien // Output streams -*- C++ -*-
200db7afdSDavid E. O'Brien
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4*f8a1b7d9SAlexander Kabaev // 2006, 2007
500db7afdSDavid E. O'Brien // Free Software Foundation, Inc.
600db7afdSDavid E. O'Brien //
700db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free
800db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
900db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
1000db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1100db7afdSDavid E. O'Brien // any later version.
1200db7afdSDavid E. O'Brien
1300db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1400db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1500db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1600db7afdSDavid E. O'Brien // GNU General Public License for more details.
1700db7afdSDavid E. O'Brien
1800db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1900db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free
20*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2100db7afdSDavid E. O'Brien // USA.
2200db7afdSDavid E. O'Brien
2300db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2400db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate
2500db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2600db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2700db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2800db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however
2900db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
3000db7afdSDavid E. O'Brien // the GNU General Public License.
3100db7afdSDavid E. O'Brien
32*f8a1b7d9SAlexander Kabaev /** @file ostream
33*f8a1b7d9SAlexander Kabaev * This is a Standard C++ Library header.
34*f8a1b7d9SAlexander Kabaev */
35*f8a1b7d9SAlexander Kabaev
3600db7afdSDavid E. O'Brien //
3700db7afdSDavid E. O'Brien // ISO C++ 14882: 27.6.2 Output streams
3800db7afdSDavid E. O'Brien //
3900db7afdSDavid E. O'Brien
40ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_OSTREAM
41ffeaf689SAlexander Kabaev #define _GLIBCXX_OSTREAM 1
4200db7afdSDavid E. O'Brien
4300db7afdSDavid E. O'Brien #pragma GCC system_header
4400db7afdSDavid E. O'Brien
4500db7afdSDavid E. O'Brien #include <ios>
46*f8a1b7d9SAlexander Kabaev #include <bits/ostream_insert.h>
4700db7afdSDavid E. O'Brien
_GLIBCXX_BEGIN_NAMESPACE(std)48*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
49*f8a1b7d9SAlexander Kabaev
501b86b14eSAlexander Kabaev // [27.6.2.1] Template class basic_ostream
511b86b14eSAlexander Kabaev /**
521b86b14eSAlexander Kabaev * @brief Controlling output.
531b86b14eSAlexander Kabaev *
541b86b14eSAlexander Kabaev * This is the base class for all output streams. It provides text
551b86b14eSAlexander Kabaev * formatting of all builtin types, and communicates with any class
561b86b14eSAlexander Kabaev * derived from basic_streambuf to do the actual output.
571b86b14eSAlexander Kabaev */
5800db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
5900db7afdSDavid E. O'Brien class basic_ostream : virtual public basic_ios<_CharT, _Traits>
6000db7afdSDavid E. O'Brien {
6100db7afdSDavid E. O'Brien public:
6200db7afdSDavid E. O'Brien // Types (inherited from basic_ios (27.4.4)):
6300db7afdSDavid E. O'Brien typedef _CharT char_type;
6400db7afdSDavid E. O'Brien typedef typename _Traits::int_type int_type;
6500db7afdSDavid E. O'Brien typedef typename _Traits::pos_type pos_type;
6600db7afdSDavid E. O'Brien typedef typename _Traits::off_type off_type;
6700db7afdSDavid E. O'Brien typedef _Traits traits_type;
6800db7afdSDavid E. O'Brien
6900db7afdSDavid E. O'Brien // Non-standard Types:
7000db7afdSDavid E. O'Brien typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
7100db7afdSDavid E. O'Brien typedef basic_ios<_CharT, _Traits> __ios_type;
7200db7afdSDavid E. O'Brien typedef basic_ostream<_CharT, _Traits> __ostream_type;
73ffeaf689SAlexander Kabaev typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
74ffeaf689SAlexander Kabaev __num_put_type;
7500db7afdSDavid E. O'Brien typedef ctype<_CharT> __ctype_type;
7600db7afdSDavid E. O'Brien
771b86b14eSAlexander Kabaev // [27.6.2.2] constructor/destructor
781b86b14eSAlexander Kabaev /**
791b86b14eSAlexander Kabaev * @brief Base constructor.
801b86b14eSAlexander Kabaev *
811b86b14eSAlexander Kabaev * This ctor is almost never called by the user directly, rather from
821b86b14eSAlexander Kabaev * derived classes' initialization lists, which pass a pointer to
831b86b14eSAlexander Kabaev * their own stream buffer.
841b86b14eSAlexander Kabaev */
8500db7afdSDavid E. O'Brien explicit
8600db7afdSDavid E. O'Brien basic_ostream(__streambuf_type* __sb)
8700db7afdSDavid E. O'Brien { this->init(__sb); }
8800db7afdSDavid E. O'Brien
891b86b14eSAlexander Kabaev /**
901b86b14eSAlexander Kabaev * @brief Base destructor.
911b86b14eSAlexander Kabaev *
921b86b14eSAlexander Kabaev * This does very little apart from providing a virtual base dtor.
931b86b14eSAlexander Kabaev */
9400db7afdSDavid E. O'Brien virtual
9500db7afdSDavid E. O'Brien ~basic_ostream() { }
9600db7afdSDavid E. O'Brien
971b86b14eSAlexander Kabaev // [27.6.2.3] prefix/suffix
9800db7afdSDavid E. O'Brien class sentry;
9900db7afdSDavid E. O'Brien friend class sentry;
10000db7afdSDavid E. O'Brien
1011b86b14eSAlexander Kabaev // [27.6.2.5] formatted output
1021b86b14eSAlexander Kabaev // [27.6.2.5.3] basic_ostream::operator<<
1031b86b14eSAlexander Kabaev //@{
1041b86b14eSAlexander Kabaev /**
1051b86b14eSAlexander Kabaev * @brief Interface for manipulators.
1061b86b14eSAlexander Kabaev *
1071b86b14eSAlexander Kabaev * Manuipulators such as @c std::endl and @c std::hex use these
1081b86b14eSAlexander Kabaev * functions in constructs like "std::cout << std::endl". For more
1091b86b14eSAlexander Kabaev * information, see the iomanip header.
1101b86b14eSAlexander Kabaev */
111*f8a1b7d9SAlexander Kabaev __ostream_type&
112*f8a1b7d9SAlexander Kabaev operator<<(__ostream_type& (*__pf)(__ostream_type&))
113*f8a1b7d9SAlexander Kabaev {
114*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
115*f8a1b7d9SAlexander Kabaev // DR 60. What is a formatted input function?
116*f8a1b7d9SAlexander Kabaev // The inserters for manipulators are *not* formatted output functions.
117*f8a1b7d9SAlexander Kabaev return __pf(*this);
118*f8a1b7d9SAlexander Kabaev }
11900db7afdSDavid E. O'Brien
120*f8a1b7d9SAlexander Kabaev __ostream_type&
121*f8a1b7d9SAlexander Kabaev operator<<(__ios_type& (*__pf)(__ios_type&))
122*f8a1b7d9SAlexander Kabaev {
123*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
124*f8a1b7d9SAlexander Kabaev // DR 60. What is a formatted input function?
125*f8a1b7d9SAlexander Kabaev // The inserters for manipulators are *not* formatted output functions.
126*f8a1b7d9SAlexander Kabaev __pf(*this);
127*f8a1b7d9SAlexander Kabaev return *this;
128*f8a1b7d9SAlexander Kabaev }
12900db7afdSDavid E. O'Brien
130*f8a1b7d9SAlexander Kabaev __ostream_type&
131*f8a1b7d9SAlexander Kabaev operator<<(ios_base& (*__pf) (ios_base&))
132*f8a1b7d9SAlexander Kabaev {
133*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
134*f8a1b7d9SAlexander Kabaev // DR 60. What is a formatted input function?
135*f8a1b7d9SAlexander Kabaev // The inserters for manipulators are *not* formatted output functions.
136*f8a1b7d9SAlexander Kabaev __pf(*this);
137*f8a1b7d9SAlexander Kabaev return *this;
138*f8a1b7d9SAlexander Kabaev }
1391b86b14eSAlexander Kabaev //@}
14000db7afdSDavid E. O'Brien
1411b86b14eSAlexander Kabaev // [27.6.2.5.2] arithmetic inserters
1421b86b14eSAlexander Kabaev /**
1431b86b14eSAlexander Kabaev * @name Arithmetic Inserters
1441b86b14eSAlexander Kabaev *
1451b86b14eSAlexander Kabaev * All the @c operator<< functions (aka <em>formatted output
1461b86b14eSAlexander Kabaev * functions</em>) have some common behavior. Each starts by
1471b86b14eSAlexander Kabaev * constructing a temporary object of type std::basic_ostream::sentry.
1481b86b14eSAlexander Kabaev * This can have several effects, concluding with the setting of a
1491b86b14eSAlexander Kabaev * status flag; see the sentry documentation for more.
1501b86b14eSAlexander Kabaev *
1511b86b14eSAlexander Kabaev * If the sentry status is good, the function tries to generate
1521b86b14eSAlexander Kabaev * whatever data is appropriate for the type of the argument.
1531b86b14eSAlexander Kabaev *
1541b86b14eSAlexander Kabaev * If an exception is thrown during insertion, ios_base::badbit
1551b86b14eSAlexander Kabaev * will be turned on in the stream's error state without causing an
1561b86b14eSAlexander Kabaev * ios_base::failure to be thrown. The original exception will then
1571b86b14eSAlexander Kabaev * be rethrown.
1581b86b14eSAlexander Kabaev */
1591b86b14eSAlexander Kabaev //@{
1601b86b14eSAlexander Kabaev /**
1611b86b14eSAlexander Kabaev * @brief Basic arithmetic inserters
1621b86b14eSAlexander Kabaev * @param A variable of builtin type.
1631b86b14eSAlexander Kabaev * @return @c *this if successful
1641b86b14eSAlexander Kabaev *
1651b86b14eSAlexander Kabaev * These functions use the stream's current locale (specifically, the
1661b86b14eSAlexander Kabaev * @c num_get facet) to perform numeric formatting.
1671b86b14eSAlexander Kabaev */
16800db7afdSDavid E. O'Brien __ostream_type&
169*f8a1b7d9SAlexander Kabaev operator<<(long __n)
170*f8a1b7d9SAlexander Kabaev { return _M_insert(__n); }
17100db7afdSDavid E. O'Brien
17200db7afdSDavid E. O'Brien __ostream_type&
173*f8a1b7d9SAlexander Kabaev operator<<(unsigned long __n)
174*f8a1b7d9SAlexander Kabaev { return _M_insert(__n); }
17500db7afdSDavid E. O'Brien
17600db7afdSDavid E. O'Brien __ostream_type&
177*f8a1b7d9SAlexander Kabaev operator<<(bool __n)
178*f8a1b7d9SAlexander Kabaev { return _M_insert(__n); }
17900db7afdSDavid E. O'Brien
18000db7afdSDavid E. O'Brien __ostream_type&
181*f8a1b7d9SAlexander Kabaev operator<<(short __n);
18200db7afdSDavid E. O'Brien
18300db7afdSDavid E. O'Brien __ostream_type&
18400db7afdSDavid E. O'Brien operator<<(unsigned short __n)
18500db7afdSDavid E. O'Brien {
186*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
187*f8a1b7d9SAlexander Kabaev // 117. basic_ostream uses nonexistent num_put member functions.
188*f8a1b7d9SAlexander Kabaev return _M_insert(static_cast<unsigned long>(__n));
18900db7afdSDavid E. O'Brien }
19000db7afdSDavid E. O'Brien
19100db7afdSDavid E. O'Brien __ostream_type&
192*f8a1b7d9SAlexander Kabaev operator<<(int __n);
193*f8a1b7d9SAlexander Kabaev
194*f8a1b7d9SAlexander Kabaev __ostream_type&
19500db7afdSDavid E. O'Brien operator<<(unsigned int __n)
196*f8a1b7d9SAlexander Kabaev {
197*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
198*f8a1b7d9SAlexander Kabaev // 117. basic_ostream uses nonexistent num_put member functions.
199*f8a1b7d9SAlexander Kabaev return _M_insert(static_cast<unsigned long>(__n));
200*f8a1b7d9SAlexander Kabaev }
20100db7afdSDavid E. O'Brien
202ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
20300db7afdSDavid E. O'Brien __ostream_type&
204*f8a1b7d9SAlexander Kabaev operator<<(long long __n)
205*f8a1b7d9SAlexander Kabaev { return _M_insert(__n); }
20600db7afdSDavid E. O'Brien
20700db7afdSDavid E. O'Brien __ostream_type&
208*f8a1b7d9SAlexander Kabaev operator<<(unsigned long long __n)
209*f8a1b7d9SAlexander Kabaev { return _M_insert(__n); }
21000db7afdSDavid E. O'Brien #endif
21100db7afdSDavid E. O'Brien
21200db7afdSDavid E. O'Brien __ostream_type&
213*f8a1b7d9SAlexander Kabaev operator<<(double __f)
214*f8a1b7d9SAlexander Kabaev { return _M_insert(__f); }
21500db7afdSDavid E. O'Brien
21600db7afdSDavid E. O'Brien __ostream_type&
21700db7afdSDavid E. O'Brien operator<<(float __f)
218*f8a1b7d9SAlexander Kabaev {
219*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
220*f8a1b7d9SAlexander Kabaev // 117. basic_ostream uses nonexistent num_put member functions.
221*f8a1b7d9SAlexander Kabaev return _M_insert(static_cast<double>(__f));
222*f8a1b7d9SAlexander Kabaev }
22300db7afdSDavid E. O'Brien
22400db7afdSDavid E. O'Brien __ostream_type&
225*f8a1b7d9SAlexander Kabaev operator<<(long double __f)
226*f8a1b7d9SAlexander Kabaev { return _M_insert(__f); }
22700db7afdSDavid E. O'Brien
22800db7afdSDavid E. O'Brien __ostream_type&
229*f8a1b7d9SAlexander Kabaev operator<<(const void* __p)
230*f8a1b7d9SAlexander Kabaev { return _M_insert(__p); }
23100db7afdSDavid E. O'Brien
2321b86b14eSAlexander Kabaev /**
2331b86b14eSAlexander Kabaev * @brief Extracting from another streambuf.
2341b86b14eSAlexander Kabaev * @param sb A pointer to a streambuf
2351b86b14eSAlexander Kabaev *
2361b86b14eSAlexander Kabaev * This function behaves like one of the basic arithmetic extractors,
237ffeaf689SAlexander Kabaev * in that it also constructs a sentry object and has the same error
2381b86b14eSAlexander Kabaev * handling behavior.
2391b86b14eSAlexander Kabaev *
2401b86b14eSAlexander Kabaev * If @a sb is NULL, the stream will set failbit in its error state.
2411b86b14eSAlexander Kabaev *
2421b86b14eSAlexander Kabaev * Characters are extracted from @a sb and inserted into @c *this
2431b86b14eSAlexander Kabaev * until one of the following occurs:
2441b86b14eSAlexander Kabaev *
2451b86b14eSAlexander Kabaev * - the input stream reaches end-of-file,
2461b86b14eSAlexander Kabaev * - insertion into the output sequence fails (in this case, the
2471b86b14eSAlexander Kabaev * character that would have been inserted is not extracted), or
2481b86b14eSAlexander Kabaev * - an exception occurs while getting a character from @a sb, which
2491b86b14eSAlexander Kabaev * sets failbit in the error state
2501b86b14eSAlexander Kabaev *
2511b86b14eSAlexander Kabaev * If the function inserts no characters, failbit is set.
2521b86b14eSAlexander Kabaev */
25300db7afdSDavid E. O'Brien __ostream_type&
25400db7afdSDavid E. O'Brien operator<<(__streambuf_type* __sb);
2551b86b14eSAlexander Kabaev //@}
25600db7afdSDavid E. O'Brien
2571b86b14eSAlexander Kabaev // [27.6.2.6] unformatted output functions
2581b86b14eSAlexander Kabaev /**
2591b86b14eSAlexander Kabaev * @name Unformatted Output Functions
2601b86b14eSAlexander Kabaev *
2611b86b14eSAlexander Kabaev * All the unformatted output functions have some common behavior.
2621b86b14eSAlexander Kabaev * Each starts by constructing a temporary object of type
2631b86b14eSAlexander Kabaev * std::basic_ostream::sentry. This has several effects, concluding
2641b86b14eSAlexander Kabaev * with the setting of a status flag; see the sentry documentation
2651b86b14eSAlexander Kabaev * for more.
2661b86b14eSAlexander Kabaev *
2671b86b14eSAlexander Kabaev * If the sentry status is good, the function tries to generate
2681b86b14eSAlexander Kabaev * whatever data is appropriate for the type of the argument.
2691b86b14eSAlexander Kabaev *
2701b86b14eSAlexander Kabaev * If an exception is thrown during insertion, ios_base::badbit
2711b86b14eSAlexander Kabaev * will be turned on in the stream's error state. If badbit is on in
2721b86b14eSAlexander Kabaev * the stream's exceptions mask, the exception will be rethrown
2731b86b14eSAlexander Kabaev * without completing its actions.
2741b86b14eSAlexander Kabaev */
2751b86b14eSAlexander Kabaev //@{
2761b86b14eSAlexander Kabaev /**
2771b86b14eSAlexander Kabaev * @brief Simple insertion.
2781b86b14eSAlexander Kabaev * @param c The character to insert.
2791b86b14eSAlexander Kabaev * @return *this
2801b86b14eSAlexander Kabaev *
2811b86b14eSAlexander Kabaev * Tries to insert @a c.
2821b86b14eSAlexander Kabaev *
2831b86b14eSAlexander Kabaev * @note This function is not overloaded on signed char and
2841b86b14eSAlexander Kabaev * unsigned char.
2851b86b14eSAlexander Kabaev */
28600db7afdSDavid E. O'Brien __ostream_type&
28700db7afdSDavid E. O'Brien put(char_type __c);
28800db7afdSDavid E. O'Brien
289ffeaf689SAlexander Kabaev // Core write functionality, without sentry.
290ffeaf689SAlexander Kabaev void
291ffeaf689SAlexander Kabaev _M_write(const char_type* __s, streamsize __n)
292ffeaf689SAlexander Kabaev {
293*f8a1b7d9SAlexander Kabaev const streamsize __put = this->rdbuf()->sputn(__s, __n);
294ffeaf689SAlexander Kabaev if (__put != __n)
295ffeaf689SAlexander Kabaev this->setstate(ios_base::badbit);
296ffeaf689SAlexander Kabaev }
297ffeaf689SAlexander Kabaev
2981b86b14eSAlexander Kabaev /**
2991b86b14eSAlexander Kabaev * @brief Character string insertion.
3001b86b14eSAlexander Kabaev * @param s The array to insert.
3011b86b14eSAlexander Kabaev * @param n Maximum number of characters to insert.
3021b86b14eSAlexander Kabaev * @return *this
3031b86b14eSAlexander Kabaev *
3041b86b14eSAlexander Kabaev * Characters are copied from @a s and inserted into the stream until
3051b86b14eSAlexander Kabaev * one of the following happens:
3061b86b14eSAlexander Kabaev *
3071b86b14eSAlexander Kabaev * - @a n characters are inserted
3081b86b14eSAlexander Kabaev * - inserting into the output sequence fails (in this case, badbit
3091b86b14eSAlexander Kabaev * will be set in the stream's error state)
3101b86b14eSAlexander Kabaev *
3111b86b14eSAlexander Kabaev * @note This function is not overloaded on signed char and
3121b86b14eSAlexander Kabaev * unsigned char.
3131b86b14eSAlexander Kabaev */
31400db7afdSDavid E. O'Brien __ostream_type&
31500db7afdSDavid E. O'Brien write(const char_type* __s, streamsize __n);
3161b86b14eSAlexander Kabaev //@}
31700db7afdSDavid E. O'Brien
3181b86b14eSAlexander Kabaev /**
3191b86b14eSAlexander Kabaev * @brief Synchronizing the stream buffer.
3201b86b14eSAlexander Kabaev * @return *this
3211b86b14eSAlexander Kabaev *
3221b86b14eSAlexander Kabaev * If @c rdbuf() is a null pointer, changes nothing.
3231b86b14eSAlexander Kabaev *
3241b86b14eSAlexander Kabaev * Otherwise, calls @c rdbuf()->pubsync(), and if that returns -1,
3251b86b14eSAlexander Kabaev * sets badbit.
3261b86b14eSAlexander Kabaev */
32700db7afdSDavid E. O'Brien __ostream_type&
32800db7afdSDavid E. O'Brien flush();
32900db7afdSDavid E. O'Brien
3301b86b14eSAlexander Kabaev // [27.6.2.4] seek members
3311b86b14eSAlexander Kabaev /**
3321b86b14eSAlexander Kabaev * @brief Getting the current write position.
3331b86b14eSAlexander Kabaev * @return A file position object.
3341b86b14eSAlexander Kabaev *
3351b86b14eSAlexander Kabaev * If @c fail() is not false, returns @c pos_type(-1) to indicate
3361b86b14eSAlexander Kabaev * failure. Otherwise returns @c rdbuf()->pubseekoff(0,cur,out).
3371b86b14eSAlexander Kabaev */
33800db7afdSDavid E. O'Brien pos_type
33900db7afdSDavid E. O'Brien tellp();
34000db7afdSDavid E. O'Brien
3411b86b14eSAlexander Kabaev /**
3421b86b14eSAlexander Kabaev * @brief Changing the current write position.
3431b86b14eSAlexander Kabaev * @param pos A file position object.
3441b86b14eSAlexander Kabaev * @return *this
3451b86b14eSAlexander Kabaev *
3461b86b14eSAlexander Kabaev * If @c fail() is not true, calls @c rdbuf()->pubseekpos(pos). If
3471b86b14eSAlexander Kabaev * that function fails, sets failbit.
3481b86b14eSAlexander Kabaev */
34900db7afdSDavid E. O'Brien __ostream_type&
35000db7afdSDavid E. O'Brien seekp(pos_type);
35100db7afdSDavid E. O'Brien
3521b86b14eSAlexander Kabaev /**
3531b86b14eSAlexander Kabaev * @brief Changing the current write position.
3541b86b14eSAlexander Kabaev * @param off A file offset object.
3551b86b14eSAlexander Kabaev * @param dir The direction in which to seek.
3561b86b14eSAlexander Kabaev * @return *this
3571b86b14eSAlexander Kabaev *
3581b86b14eSAlexander Kabaev * If @c fail() is not true, calls @c rdbuf()->pubseekoff(off,dir).
3591b86b14eSAlexander Kabaev * If that function fails, sets failbit.
3601b86b14eSAlexander Kabaev */
36100db7afdSDavid E. O'Brien __ostream_type&
36200db7afdSDavid E. O'Brien seekp(off_type, ios_base::seekdir);
363ffeaf689SAlexander Kabaev
364ffeaf689SAlexander Kabaev protected:
365ffeaf689SAlexander Kabaev explicit
366ffeaf689SAlexander Kabaev basic_ostream() { }
367*f8a1b7d9SAlexander Kabaev
368*f8a1b7d9SAlexander Kabaev template<typename _ValueT>
369*f8a1b7d9SAlexander Kabaev __ostream_type&
370*f8a1b7d9SAlexander Kabaev _M_insert(_ValueT __v);
37100db7afdSDavid E. O'Brien };
37200db7afdSDavid E. O'Brien
3731b86b14eSAlexander Kabaev /**
3741b86b14eSAlexander Kabaev * @brief Performs setup work for output streams.
3751b86b14eSAlexander Kabaev *
3761b86b14eSAlexander Kabaev * Objects of this class are created before all of the standard
3771b86b14eSAlexander Kabaev * inserters are run. It is responsible for "exception-safe prefix and
3781b86b14eSAlexander Kabaev * suffix operations." Additional actions may be added by the
3791b86b14eSAlexander Kabaev * implementation, and we list them in
3801b86b14eSAlexander Kabaev * http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/howto.html#5
3811b86b14eSAlexander Kabaev * under [27.6] notes.
3821b86b14eSAlexander Kabaev */
38300db7afdSDavid E. O'Brien template <typename _CharT, typename _Traits>
38400db7afdSDavid E. O'Brien class basic_ostream<_CharT, _Traits>::sentry
38500db7afdSDavid E. O'Brien {
38600db7afdSDavid E. O'Brien // Data Members:
38700db7afdSDavid E. O'Brien bool _M_ok;
38800db7afdSDavid E. O'Brien basic_ostream<_CharT, _Traits>& _M_os;
38900db7afdSDavid E. O'Brien
39000db7afdSDavid E. O'Brien public:
3911b86b14eSAlexander Kabaev /**
3921b86b14eSAlexander Kabaev * @brief The constructor performs preparatory work.
3931b86b14eSAlexander Kabaev * @param os The output stream to guard.
3941b86b14eSAlexander Kabaev *
3951b86b14eSAlexander Kabaev * If the stream state is good (@a os.good() is true), then if the
3961b86b14eSAlexander Kabaev * stream is tied to another output stream, @c is.tie()->flush()
3971b86b14eSAlexander Kabaev * is called to synchronize the output sequences.
3981b86b14eSAlexander Kabaev *
3991b86b14eSAlexander Kabaev * If the stream state is still good, then the sentry state becomes
4001b86b14eSAlexander Kabaev * true ("okay").
4011b86b14eSAlexander Kabaev */
40200db7afdSDavid E. O'Brien explicit
40300db7afdSDavid E. O'Brien sentry(basic_ostream<_CharT, _Traits>& __os);
40400db7afdSDavid E. O'Brien
4051b86b14eSAlexander Kabaev /**
4061b86b14eSAlexander Kabaev * @brief Possibly flushes the stream.
4071b86b14eSAlexander Kabaev *
4081b86b14eSAlexander Kabaev * If @c ios_base::unitbuf is set in @c os.flags(), and
4091b86b14eSAlexander Kabaev * @c std::uncaught_exception() is true, the sentry destructor calls
4101b86b14eSAlexander Kabaev * @c flush() on the output stream.
4111b86b14eSAlexander Kabaev */
~sentry()41200db7afdSDavid E. O'Brien ~sentry()
41300db7afdSDavid E. O'Brien {
41400db7afdSDavid E. O'Brien // XXX MT
41500db7afdSDavid E. O'Brien if (_M_os.flags() & ios_base::unitbuf && !uncaught_exception())
41600db7afdSDavid E. O'Brien {
41700db7afdSDavid E. O'Brien // Can't call flush directly or else will get into recursive lock.
41800db7afdSDavid E. O'Brien if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)
41900db7afdSDavid E. O'Brien _M_os.setstate(ios_base::badbit);
42000db7afdSDavid E. O'Brien }
42100db7afdSDavid E. O'Brien }
42200db7afdSDavid E. O'Brien
4231b86b14eSAlexander Kabaev /**
4241b86b14eSAlexander Kabaev * @brief Quick status checking.
4251b86b14eSAlexander Kabaev * @return The sentry state.
4261b86b14eSAlexander Kabaev *
4271b86b14eSAlexander Kabaev * For ease of use, sentries may be converted to booleans. The
4281b86b14eSAlexander Kabaev * return value is that of the sentry state (true == okay).
4291b86b14eSAlexander Kabaev */
430ffeaf689SAlexander Kabaev operator bool() const
43100db7afdSDavid E. O'Brien { return _M_ok; }
43200db7afdSDavid E. O'Brien };
43300db7afdSDavid E. O'Brien
4341b86b14eSAlexander Kabaev // [27.6.2.5.4] character insertion templates
4351b86b14eSAlexander Kabaev //@{
4361b86b14eSAlexander Kabaev /**
4371b86b14eSAlexander Kabaev * @brief Character inserters
4381b86b14eSAlexander Kabaev * @param out An output stream.
4391b86b14eSAlexander Kabaev * @param c A character.
4401b86b14eSAlexander Kabaev * @return out
4411b86b14eSAlexander Kabaev *
4421b86b14eSAlexander Kabaev * Behaves like one of the formatted arithmetic inserters described in
4431b86b14eSAlexander Kabaev * std::basic_ostream. After constructing a sentry object with good
4441b86b14eSAlexander Kabaev * status, this function inserts a single character and any required
4451b86b14eSAlexander Kabaev * padding (as determined by [22.2.2.2.2]). @c out.width(0) is then
4461b86b14eSAlexander Kabaev * called.
4471b86b14eSAlexander Kabaev *
4481b86b14eSAlexander Kabaev * If @a c is of type @c char and the character type of the stream is not
4491b86b14eSAlexander Kabaev * @c char, the character is widened before insertion.
4501b86b14eSAlexander Kabaev */
45100db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
452*f8a1b7d9SAlexander Kabaev inline basic_ostream<_CharT, _Traits>&
453*f8a1b7d9SAlexander Kabaev operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
454*f8a1b7d9SAlexander Kabaev { return __ostream_insert(__out, &__c, 1); }
45500db7afdSDavid E. O'Brien
45600db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
457*f8a1b7d9SAlexander Kabaev inline basic_ostream<_CharT, _Traits>&
45800db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
45900db7afdSDavid E. O'Brien { return (__out << __out.widen(__c)); }
46000db7afdSDavid E. O'Brien
46100db7afdSDavid E. O'Brien // Specialization
46200db7afdSDavid E. O'Brien template <class _Traits>
463*f8a1b7d9SAlexander Kabaev inline basic_ostream<char, _Traits>&
464*f8a1b7d9SAlexander Kabaev operator<<(basic_ostream<char, _Traits>& __out, char __c)
465*f8a1b7d9SAlexander Kabaev { return __ostream_insert(__out, &__c, 1); }
46600db7afdSDavid E. O'Brien
46700db7afdSDavid E. O'Brien // Signed and unsigned
46800db7afdSDavid E. O'Brien template<class _Traits>
469*f8a1b7d9SAlexander Kabaev inline basic_ostream<char, _Traits>&
47000db7afdSDavid E. O'Brien operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
47100db7afdSDavid E. O'Brien { return (__out << static_cast<char>(__c)); }
47200db7afdSDavid E. O'Brien
47300db7afdSDavid E. O'Brien template<class _Traits>
474*f8a1b7d9SAlexander Kabaev inline basic_ostream<char, _Traits>&
47500db7afdSDavid E. O'Brien operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
47600db7afdSDavid E. O'Brien { return (__out << static_cast<char>(__c)); }
4771b86b14eSAlexander Kabaev //@}
47800db7afdSDavid E. O'Brien
4791b86b14eSAlexander Kabaev //@{
4801b86b14eSAlexander Kabaev /**
4811b86b14eSAlexander Kabaev * @brief String inserters
4821b86b14eSAlexander Kabaev * @param out An output stream.
4831b86b14eSAlexander Kabaev * @param s A character string.
4841b86b14eSAlexander Kabaev * @return out
4851b86b14eSAlexander Kabaev * @pre @a s must be a non-NULL pointer
4861b86b14eSAlexander Kabaev *
4871b86b14eSAlexander Kabaev * Behaves like one of the formatted arithmetic inserters described in
4881b86b14eSAlexander Kabaev * std::basic_ostream. After constructing a sentry object with good
4891b86b14eSAlexander Kabaev * status, this function inserts @c traits::length(s) characters starting
4901b86b14eSAlexander Kabaev * at @a s, widened if necessary, followed by any required padding (as
4911b86b14eSAlexander Kabaev * determined by [22.2.2.2.2]). @c out.width(0) is then called.
4921b86b14eSAlexander Kabaev */
49300db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
494*f8a1b7d9SAlexander Kabaev inline basic_ostream<_CharT, _Traits>&
495*f8a1b7d9SAlexander Kabaev operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
496*f8a1b7d9SAlexander Kabaev {
497*f8a1b7d9SAlexander Kabaev if (!__s)
498*f8a1b7d9SAlexander Kabaev __out.setstate(ios_base::badbit);
499*f8a1b7d9SAlexander Kabaev else
500*f8a1b7d9SAlexander Kabaev __ostream_insert(__out, __s,
501*f8a1b7d9SAlexander Kabaev static_cast<streamsize>(_Traits::length(__s)));
502*f8a1b7d9SAlexander Kabaev return __out;
503*f8a1b7d9SAlexander Kabaev }
50400db7afdSDavid E. O'Brien
50500db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
50600db7afdSDavid E. O'Brien basic_ostream<_CharT, _Traits> &
50700db7afdSDavid E. O'Brien operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);
50800db7afdSDavid E. O'Brien
50900db7afdSDavid E. O'Brien // Partial specializationss
51000db7afdSDavid E. O'Brien template<class _Traits>
511*f8a1b7d9SAlexander Kabaev inline basic_ostream<char, _Traits>&
512*f8a1b7d9SAlexander Kabaev operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
513*f8a1b7d9SAlexander Kabaev {
514*f8a1b7d9SAlexander Kabaev if (!__s)
515*f8a1b7d9SAlexander Kabaev __out.setstate(ios_base::badbit);
516*f8a1b7d9SAlexander Kabaev else
517*f8a1b7d9SAlexander Kabaev __ostream_insert(__out, __s,
518*f8a1b7d9SAlexander Kabaev static_cast<streamsize>(_Traits::length(__s)));
519*f8a1b7d9SAlexander Kabaev return __out;
520*f8a1b7d9SAlexander Kabaev }
52100db7afdSDavid E. O'Brien
52200db7afdSDavid E. O'Brien // Signed and unsigned
52300db7afdSDavid E. O'Brien template<class _Traits>
524*f8a1b7d9SAlexander Kabaev inline basic_ostream<char, _Traits>&
52500db7afdSDavid E. O'Brien operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
52600db7afdSDavid E. O'Brien { return (__out << reinterpret_cast<const char*>(__s)); }
52700db7afdSDavid E. O'Brien
52800db7afdSDavid E. O'Brien template<class _Traits>
529*f8a1b7d9SAlexander Kabaev inline basic_ostream<char, _Traits> &
53000db7afdSDavid E. O'Brien operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
53100db7afdSDavid E. O'Brien { return (__out << reinterpret_cast<const char*>(__s)); }
5321b86b14eSAlexander Kabaev //@}
53300db7afdSDavid E. O'Brien
5341b86b14eSAlexander Kabaev // [27.6.2.7] standard basic_ostream manipulators
5351b86b14eSAlexander Kabaev /**
5361b86b14eSAlexander Kabaev * @brief Write a newline and flush the stream.
5371b86b14eSAlexander Kabaev *
5381b86b14eSAlexander Kabaev * This manipulator is often mistakenly used when a simple newline is
5391b86b14eSAlexander Kabaev * desired, leading to poor buffering performance. See
5401b86b14eSAlexander Kabaev * http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#2 for more
5411b86b14eSAlexander Kabaev * on this subject.
5421b86b14eSAlexander Kabaev */
54300db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
544*f8a1b7d9SAlexander Kabaev inline basic_ostream<_CharT, _Traits>&
endl(basic_ostream<_CharT,_Traits> & __os)54500db7afdSDavid E. O'Brien endl(basic_ostream<_CharT, _Traits>& __os)
54600db7afdSDavid E. O'Brien { return flush(__os.put(__os.widen('\n'))); }
54700db7afdSDavid E. O'Brien
5481b86b14eSAlexander Kabaev /**
5491b86b14eSAlexander Kabaev * @brief Write a null character into the output sequence.
5501b86b14eSAlexander Kabaev *
5511b86b14eSAlexander Kabaev * "Null character" is @c CharT() by definition. For CharT of @c char,
5521b86b14eSAlexander Kabaev * this correctly writes the ASCII @c NUL character string terminator.
5531b86b14eSAlexander Kabaev */
55400db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
555*f8a1b7d9SAlexander Kabaev inline basic_ostream<_CharT, _Traits>&
ends(basic_ostream<_CharT,_Traits> & __os)55600db7afdSDavid E. O'Brien ends(basic_ostream<_CharT, _Traits>& __os)
55700db7afdSDavid E. O'Brien { return __os.put(_CharT()); }
55800db7afdSDavid E. O'Brien
5591b86b14eSAlexander Kabaev /**
5601b86b14eSAlexander Kabaev * @brief Flushes the output stream.
5611b86b14eSAlexander Kabaev *
5621b86b14eSAlexander Kabaev * This manipulator simply calls the stream's @c flush() member function.
5631b86b14eSAlexander Kabaev */
56400db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
565*f8a1b7d9SAlexander Kabaev inline basic_ostream<_CharT, _Traits>&
flush(basic_ostream<_CharT,_Traits> & __os)56600db7afdSDavid E. O'Brien flush(basic_ostream<_CharT, _Traits>& __os)
56700db7afdSDavid E. O'Brien { return __os.flush(); }
56800db7afdSDavid E. O'Brien
569*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
57000db7afdSDavid E. O'Brien
571ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_EXPORT_TEMPLATE
57200db7afdSDavid E. O'Brien # include <bits/ostream.tcc>
57300db7afdSDavid E. O'Brien #endif
57400db7afdSDavid E. O'Brien
575ffeaf689SAlexander Kabaev #endif /* _GLIBCXX_OSTREAM */
576