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