100db7afdSDavid E. O'Brien // ostream classes -*- 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.tcc
33*f8a1b7d9SAlexander Kabaev  *  This is an internal header file, included by other library headers.
34*f8a1b7d9SAlexander Kabaev  *  You should not attempt to use it directly.
35*f8a1b7d9SAlexander Kabaev  */
36*f8a1b7d9SAlexander Kabaev 
3700db7afdSDavid E. O'Brien //
3800db7afdSDavid E. O'Brien // ISO C++ 14882: 27.6.2  Output streams
3900db7afdSDavid E. O'Brien //
4000db7afdSDavid E. O'Brien 
41ffeaf689SAlexander Kabaev #ifndef _OSTREAM_TCC
42ffeaf689SAlexander Kabaev #define _OSTREAM_TCC 1
43ffeaf689SAlexander Kabaev 
4400db7afdSDavid E. O'Brien #pragma GCC system_header
4500db7afdSDavid E. O'Brien 
4600db7afdSDavid E. O'Brien #include <locale>
4700db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NAMESPACE(std)48*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
49*f8a1b7d9SAlexander Kabaev 
5000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
5100db7afdSDavid E. O'Brien     basic_ostream<_CharT, _Traits>::sentry::
5200db7afdSDavid E. O'Brien     sentry(basic_ostream<_CharT, _Traits>& __os)
53ffeaf689SAlexander Kabaev     : _M_ok(false), _M_os(__os)
5400db7afdSDavid E. O'Brien     {
5500db7afdSDavid E. O'Brien       // XXX MT
561b86b14eSAlexander Kabaev       if (__os.tie() && __os.good())
5700db7afdSDavid E. O'Brien 	__os.tie()->flush();
581b86b14eSAlexander Kabaev 
591b86b14eSAlexander Kabaev       if (__os.good())
601b86b14eSAlexander Kabaev 	_M_ok = true;
611b86b14eSAlexander Kabaev       else
621b86b14eSAlexander Kabaev 	__os.setstate(ios_base::failbit);
631b86b14eSAlexander Kabaev     }
6400db7afdSDavid E. O'Brien 
6500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
66*f8a1b7d9SAlexander Kabaev     template<typename _ValueT>
6700db7afdSDavid E. O'Brien       basic_ostream<_CharT, _Traits>&
6800db7afdSDavid E. O'Brien       basic_ostream<_CharT, _Traits>::
_M_insert(_ValueT __v)69*f8a1b7d9SAlexander Kabaev       _M_insert(_ValueT __v)
7000db7afdSDavid E. O'Brien       {
7100db7afdSDavid E. O'Brien 	sentry __cerb(*this);
72ffeaf689SAlexander Kabaev 	if (__cerb)
7300db7afdSDavid E. O'Brien 	  {
74ffeaf689SAlexander Kabaev 	    ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
7500db7afdSDavid E. O'Brien 	    try
7600db7afdSDavid E. O'Brien 	      {
77ffeaf689SAlexander Kabaev 		const __num_put_type& __np = __check_facet(this->_M_num_put);
78*f8a1b7d9SAlexander Kabaev 		if (__np.put(*this, *this, this->fill(), __v).failed())
79ffeaf689SAlexander Kabaev 		  __err |= ios_base::badbit;
8000db7afdSDavid E. O'Brien 	      }
811b86b14eSAlexander Kabaev 	    catch(...)
82ffeaf689SAlexander Kabaev 	      { this->_M_setstate(ios_base::badbit); }
83ffeaf689SAlexander Kabaev 	    if (__err)
84ffeaf689SAlexander Kabaev 	      this->setstate(__err);
8500db7afdSDavid E. O'Brien 	  }
8600db7afdSDavid E. O'Brien 	return *this;
8700db7afdSDavid E. O'Brien       }
8800db7afdSDavid E. O'Brien 
8900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
9000db7afdSDavid E. O'Brien     basic_ostream<_CharT, _Traits>&
9100db7afdSDavid E. O'Brien     basic_ostream<_CharT, _Traits>::
operator <<(short __n)92*f8a1b7d9SAlexander Kabaev     operator<<(short __n)
93ffeaf689SAlexander Kabaev     {
94*f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
95*f8a1b7d9SAlexander Kabaev       // 117. basic_ostream uses nonexistent num_put member functions.
96*f8a1b7d9SAlexander Kabaev       const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
97*f8a1b7d9SAlexander Kabaev       if (__fmt == ios_base::oct || __fmt == ios_base::hex)
98*f8a1b7d9SAlexander Kabaev 	return _M_insert(static_cast<long>(static_cast<unsigned short>(__n)));
99ffeaf689SAlexander Kabaev       else
100*f8a1b7d9SAlexander Kabaev 	return _M_insert(static_cast<long>(__n));
101ffeaf689SAlexander Kabaev     }
102ffeaf689SAlexander Kabaev 
103ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
104ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>&
105ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
operator <<(int __n)106*f8a1b7d9SAlexander Kabaev     operator<<(int __n)
107ffeaf689SAlexander Kabaev     {
108*f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
109*f8a1b7d9SAlexander Kabaev       // 117. basic_ostream uses nonexistent num_put member functions.
110*f8a1b7d9SAlexander Kabaev       const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
111*f8a1b7d9SAlexander Kabaev       if (__fmt == ios_base::oct || __fmt == ios_base::hex)
112*f8a1b7d9SAlexander Kabaev 	return _M_insert(static_cast<long>(static_cast<unsigned int>(__n)));
113ffeaf689SAlexander Kabaev       else
114*f8a1b7d9SAlexander Kabaev 	return _M_insert(static_cast<long>(__n));
115ffeaf689SAlexander Kabaev     }
116ffeaf689SAlexander Kabaev 
117ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
118ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>&
119ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
operator <<(__streambuf_type * __sbin)120ffeaf689SAlexander Kabaev     operator<<(__streambuf_type* __sbin)
121ffeaf689SAlexander Kabaev     {
122ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
123ffeaf689SAlexander Kabaev       sentry __cerb(*this);
124ffeaf689SAlexander Kabaev       if (__cerb && __sbin)
125ffeaf689SAlexander Kabaev 	{
126ffeaf689SAlexander Kabaev 	  try
127ffeaf689SAlexander Kabaev 	    {
128ffeaf689SAlexander Kabaev 	      if (!__copy_streambufs(__sbin, this->rdbuf()))
129ffeaf689SAlexander Kabaev 		__err |= ios_base::failbit;
130ffeaf689SAlexander Kabaev 	    }
131ffeaf689SAlexander Kabaev 	  catch(...)
132ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::failbit); }
133ffeaf689SAlexander Kabaev 	}
134ffeaf689SAlexander Kabaev       else if (!__sbin)
135ffeaf689SAlexander Kabaev 	__err |= ios_base::badbit;
136ffeaf689SAlexander Kabaev       if (__err)
137ffeaf689SAlexander Kabaev 	this->setstate(__err);
138ffeaf689SAlexander Kabaev       return *this;
139ffeaf689SAlexander Kabaev     }
140ffeaf689SAlexander Kabaev 
141ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
142ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>&
143ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
put(char_type __c)144ffeaf689SAlexander Kabaev     put(char_type __c)
145ffeaf689SAlexander Kabaev     {
146ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
147ffeaf689SAlexander Kabaev       // DR 60. What is a formatted input function?
148ffeaf689SAlexander Kabaev       // basic_ostream::put(char_type) is an unformatted output function.
149ffeaf689SAlexander Kabaev       // DR 63. Exception-handling policy for unformatted output.
150ffeaf689SAlexander Kabaev       // Unformatted output functions should catch exceptions thrown
151ffeaf689SAlexander Kabaev       // from streambuf members.
152ffeaf689SAlexander Kabaev       sentry __cerb(*this);
153ffeaf689SAlexander Kabaev       if (__cerb)
154ffeaf689SAlexander Kabaev 	{
155ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
156ffeaf689SAlexander Kabaev 	  try
157ffeaf689SAlexander Kabaev 	    {
158ffeaf689SAlexander Kabaev 	      const int_type __put = this->rdbuf()->sputc(__c);
159ffeaf689SAlexander Kabaev 	      if (traits_type::eq_int_type(__put, traits_type::eof()))
160ffeaf689SAlexander Kabaev 		__err |= ios_base::badbit;
161ffeaf689SAlexander Kabaev 	    }
162ffeaf689SAlexander Kabaev 	  catch (...)
163ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
164ffeaf689SAlexander Kabaev 	  if (__err)
165ffeaf689SAlexander Kabaev 	    this->setstate(__err);
166ffeaf689SAlexander Kabaev 	}
167ffeaf689SAlexander Kabaev       return *this;
168ffeaf689SAlexander Kabaev     }
169ffeaf689SAlexander Kabaev 
170ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
171ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>&
172ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
write(const _CharT * __s,streamsize __n)173ffeaf689SAlexander Kabaev     write(const _CharT* __s, streamsize __n)
174ffeaf689SAlexander Kabaev     {
175ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
176ffeaf689SAlexander Kabaev       // DR 60. What is a formatted input function?
177ffeaf689SAlexander Kabaev       // basic_ostream::write(const char_type*, streamsize) is an
178ffeaf689SAlexander Kabaev       // unformatted output function.
179ffeaf689SAlexander Kabaev       // DR 63. Exception-handling policy for unformatted output.
180ffeaf689SAlexander Kabaev       // Unformatted output functions should catch exceptions thrown
181ffeaf689SAlexander Kabaev       // from streambuf members.
182ffeaf689SAlexander Kabaev       sentry __cerb(*this);
183ffeaf689SAlexander Kabaev       if (__cerb)
184ffeaf689SAlexander Kabaev 	{
185ffeaf689SAlexander Kabaev 	  try
186ffeaf689SAlexander Kabaev 	    { _M_write(__s, __n); }
187ffeaf689SAlexander Kabaev 	  catch (...)
188ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
189ffeaf689SAlexander Kabaev 	}
190ffeaf689SAlexander Kabaev       return *this;
191ffeaf689SAlexander Kabaev     }
192ffeaf689SAlexander Kabaev 
193ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
194ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>&
195ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
flush()196ffeaf689SAlexander Kabaev     flush()
197ffeaf689SAlexander Kabaev     {
198ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
199ffeaf689SAlexander Kabaev       // DR 60. What is a formatted input function?
200ffeaf689SAlexander Kabaev       // basic_ostream::flush() is *not* an unformatted output function.
201ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
202ffeaf689SAlexander Kabaev       try
203ffeaf689SAlexander Kabaev 	{
204ffeaf689SAlexander Kabaev 	  if (this->rdbuf() && this->rdbuf()->pubsync() == -1)
205ffeaf689SAlexander Kabaev 	    __err |= ios_base::badbit;
206ffeaf689SAlexander Kabaev 	}
207ffeaf689SAlexander Kabaev       catch(...)
208ffeaf689SAlexander Kabaev 	{ this->_M_setstate(ios_base::badbit); }
209ffeaf689SAlexander Kabaev       if (__err)
210ffeaf689SAlexander Kabaev 	this->setstate(__err);
211ffeaf689SAlexander Kabaev       return *this;
212ffeaf689SAlexander Kabaev     }
213ffeaf689SAlexander Kabaev 
214ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
215ffeaf689SAlexander Kabaev     typename basic_ostream<_CharT, _Traits>::pos_type
216ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
tellp()217ffeaf689SAlexander Kabaev     tellp()
218ffeaf689SAlexander Kabaev     {
219ffeaf689SAlexander Kabaev       pos_type __ret = pos_type(-1);
220ffeaf689SAlexander Kabaev       try
221ffeaf689SAlexander Kabaev 	{
222ffeaf689SAlexander Kabaev 	  if (!this->fail())
223ffeaf689SAlexander Kabaev 	    __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
224ffeaf689SAlexander Kabaev 	}
225ffeaf689SAlexander Kabaev       catch(...)
226ffeaf689SAlexander Kabaev 	{ this->_M_setstate(ios_base::badbit); }
227ffeaf689SAlexander Kabaev       return __ret;
228ffeaf689SAlexander Kabaev     }
229ffeaf689SAlexander Kabaev 
230ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
231ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>&
232ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
seekp(pos_type __pos)233ffeaf689SAlexander Kabaev     seekp(pos_type __pos)
234ffeaf689SAlexander Kabaev     {
235ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
236ffeaf689SAlexander Kabaev       try
23700db7afdSDavid E. O'Brien 	{
23800db7afdSDavid E. O'Brien 	  if (!this->fail())
23900db7afdSDavid E. O'Brien 	    {
240ffeaf689SAlexander Kabaev 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
24100db7afdSDavid E. O'Brien 	      // 136.  seekp, seekg setting wrong streams?
242ffeaf689SAlexander Kabaev 	      const pos_type __p = this->rdbuf()->pubseekpos(__pos,
24300db7afdSDavid E. O'Brien 							     ios_base::out);
24400db7afdSDavid E. O'Brien 
24500db7afdSDavid E. O'Brien 	      // 129. Need error indication from seekp() and seekg()
246ffeaf689SAlexander Kabaev 	      if (__p == pos_type(off_type(-1)))
247ffeaf689SAlexander Kabaev 		__err |= ios_base::failbit;
24800db7afdSDavid E. O'Brien 	    }
249ffeaf689SAlexander Kabaev 	}
250ffeaf689SAlexander Kabaev       catch(...)
251ffeaf689SAlexander Kabaev 	{ this->_M_setstate(ios_base::badbit); }
252ffeaf689SAlexander Kabaev       if (__err)
253ffeaf689SAlexander Kabaev 	this->setstate(__err);
254ffeaf689SAlexander Kabaev       return *this;
255ffeaf689SAlexander Kabaev     }
256ffeaf689SAlexander Kabaev 
257ffeaf689SAlexander Kabaev   template<typename _CharT, typename _Traits>
258ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>&
259ffeaf689SAlexander Kabaev     basic_ostream<_CharT, _Traits>::
seekp(off_type __off,ios_base::seekdir __dir)260ffeaf689SAlexander Kabaev     seekp(off_type __off, ios_base::seekdir __dir)
261ffeaf689SAlexander Kabaev     {
262ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
263ffeaf689SAlexander Kabaev       try
264ffeaf689SAlexander Kabaev 	{
265ffeaf689SAlexander Kabaev 	  if (!this->fail())
266ffeaf689SAlexander Kabaev 	    {
267ffeaf689SAlexander Kabaev 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
268ffeaf689SAlexander Kabaev 	      // 136.  seekp, seekg setting wrong streams?
269ffeaf689SAlexander Kabaev 	      const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
270ffeaf689SAlexander Kabaev 							     ios_base::out);
271ffeaf689SAlexander Kabaev 
272ffeaf689SAlexander Kabaev 	      // 129. Need error indication from seekp() and seekg()
273ffeaf689SAlexander Kabaev 	      if (__p == pos_type(off_type(-1)))
274ffeaf689SAlexander Kabaev 		__err |= ios_base::failbit;
275ffeaf689SAlexander Kabaev 	    }
276ffeaf689SAlexander Kabaev 	}
277ffeaf689SAlexander Kabaev       catch(...)
278ffeaf689SAlexander Kabaev 	{ this->_M_setstate(ios_base::badbit); }
279ffeaf689SAlexander Kabaev       if (__err)
280ffeaf689SAlexander Kabaev 	this->setstate(__err);
28100db7afdSDavid E. O'Brien       return *this;
28200db7afdSDavid E. O'Brien     }
28300db7afdSDavid E. O'Brien 
28400db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
28500db7afdSDavid E. O'Brien     basic_ostream<_CharT, _Traits>&
operator <<(basic_ostream<_CharT,_Traits> & __out,const char * __s)28600db7afdSDavid E. O'Brien     operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
28700db7afdSDavid E. O'Brien     {
288*f8a1b7d9SAlexander Kabaev       if (!__s)
289*f8a1b7d9SAlexander Kabaev 	__out.setstate(ios_base::badbit);
290*f8a1b7d9SAlexander Kabaev       else
291*f8a1b7d9SAlexander Kabaev 	{
292ffeaf689SAlexander Kabaev 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
29300db7afdSDavid E. O'Brien 	  // 167.  Improper use of traits_type::length()
294*f8a1b7d9SAlexander Kabaev 	  const size_t __clen = char_traits<char>::length(__s);
295*f8a1b7d9SAlexander Kabaev 	  _CharT* __ws = 0;
296*f8a1b7d9SAlexander Kabaev 	  try
29700db7afdSDavid E. O'Brien 	    {
298*f8a1b7d9SAlexander Kabaev 	      __ws = new _CharT[__clen];
299ca6500fcSAlexander Kabaev 	      for (size_t  __i = 0; __i < __clen; ++__i)
30000db7afdSDavid E. O'Brien 		__ws[__i] = __out.widen(__s[__i]);
30100db7afdSDavid E. O'Brien 	    }
3021b86b14eSAlexander Kabaev 	  catch(...)
303*f8a1b7d9SAlexander Kabaev 	    {
304*f8a1b7d9SAlexander Kabaev 	      delete [] __ws;
305*f8a1b7d9SAlexander Kabaev 	      __out._M_setstate(ios_base::badbit);
30600db7afdSDavid E. O'Brien 	      return __out;
30700db7afdSDavid E. O'Brien 	    }
30800db7afdSDavid E. O'Brien 
30900db7afdSDavid E. O'Brien 	  try
31000db7afdSDavid E. O'Brien 	    {
311*f8a1b7d9SAlexander Kabaev 	      __ostream_insert(__out, __ws, __clen);
312*f8a1b7d9SAlexander Kabaev 	      delete [] __ws;
31300db7afdSDavid E. O'Brien 	    }
3141b86b14eSAlexander Kabaev 	  catch(...)
31500db7afdSDavid E. O'Brien 	    {
316*f8a1b7d9SAlexander Kabaev 	      delete [] __ws;
317*f8a1b7d9SAlexander Kabaev 	      __throw_exception_again;
31800db7afdSDavid E. O'Brien 	    }
31900db7afdSDavid E. O'Brien 	}
32000db7afdSDavid E. O'Brien       return __out;
32100db7afdSDavid E. O'Brien     }
32200db7afdSDavid E. O'Brien 
32300db7afdSDavid E. O'Brien   // Inhibit implicit instantiations for required instantiations,
32400db7afdSDavid E. O'Brien   // which are defined via explicit instantiations elsewhere.
32500db7afdSDavid E. O'Brien   // NB:  This syntax is a GNU extension.
326ffeaf689SAlexander Kabaev #if _GLIBCXX_EXTERN_TEMPLATE
32700db7afdSDavid E. O'Brien   extern template class basic_ostream<char>;
32800db7afdSDavid E. O'Brien   extern template ostream& endl(ostream&);
32900db7afdSDavid E. O'Brien   extern template ostream& ends(ostream&);
33000db7afdSDavid E. O'Brien   extern template ostream& flush(ostream&);
33100db7afdSDavid E. O'Brien   extern template ostream& operator<<(ostream&, char);
33200db7afdSDavid E. O'Brien   extern template ostream& operator<<(ostream&, unsigned char);
33300db7afdSDavid E. O'Brien   extern template ostream& operator<<(ostream&, signed char);
33400db7afdSDavid E. O'Brien   extern template ostream& operator<<(ostream&, const char*);
33500db7afdSDavid E. O'Brien   extern template ostream& operator<<(ostream&, const unsigned char*);
33600db7afdSDavid E. O'Brien   extern template ostream& operator<<(ostream&, const signed char*);
337*f8a1b7d9SAlexander Kabaev 
338*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(long);
339*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(unsigned long);
340*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(bool);
341*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
342*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(long long);
343*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(unsigned long long);
344*f8a1b7d9SAlexander Kabaev #endif
345*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(double);
346*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(long double);
347*f8a1b7d9SAlexander Kabaev   extern template ostream& ostream::_M_insert(const void*);
34800db7afdSDavid E. O'Brien 
349ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
35000db7afdSDavid E. O'Brien   extern template class basic_ostream<wchar_t>;
35100db7afdSDavid E. O'Brien   extern template wostream& endl(wostream&);
35200db7afdSDavid E. O'Brien   extern template wostream& ends(wostream&);
35300db7afdSDavid E. O'Brien   extern template wostream& flush(wostream&);
35400db7afdSDavid E. O'Brien   extern template wostream& operator<<(wostream&, wchar_t);
35500db7afdSDavid E. O'Brien   extern template wostream& operator<<(wostream&, char);
35600db7afdSDavid E. O'Brien   extern template wostream& operator<<(wostream&, const wchar_t*);
35700db7afdSDavid E. O'Brien   extern template wostream& operator<<(wostream&, const char*);
358*f8a1b7d9SAlexander Kabaev 
359*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(long);
360*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(unsigned long);
361*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(bool);
362*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
363*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(long long);
364*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(unsigned long long);
365*f8a1b7d9SAlexander Kabaev #endif
366*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(double);
367*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(long double);
368*f8a1b7d9SAlexander Kabaev   extern template wostream& wostream::_M_insert(const void*);
369ca6500fcSAlexander Kabaev #endif
3701b86b14eSAlexander Kabaev #endif
371*f8a1b7d9SAlexander Kabaev 
372*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
373ffeaf689SAlexander Kabaev 
374ffeaf689SAlexander Kabaev #endif
375