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