1*e4b17023SJohn Marino // ostream classes -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 4*e4b17023SJohn Marino // 2006, 2007, 2008, 2009, 2010, 2011 5*e4b17023SJohn Marino // Free Software Foundation, Inc. 6*e4b17023SJohn Marino // 7*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 8*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 9*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 10*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 11*e4b17023SJohn Marino // any later version. 12*e4b17023SJohn Marino 13*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 14*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 15*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*e4b17023SJohn Marino // GNU General Public License for more details. 17*e4b17023SJohn Marino 18*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 19*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 20*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 21*e4b17023SJohn Marino 22*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 23*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 24*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 25*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 26*e4b17023SJohn Marino 27*e4b17023SJohn Marino /** @file bits/ostream.tcc 28*e4b17023SJohn Marino * This is an internal header file, included by other library headers. 29*e4b17023SJohn Marino * Do not attempt to use it directly. @headername{ostream} 30*e4b17023SJohn Marino */ 31*e4b17023SJohn Marino 32*e4b17023SJohn Marino // 33*e4b17023SJohn Marino // ISO C++ 14882: 27.6.2 Output streams 34*e4b17023SJohn Marino // 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino #ifndef _OSTREAM_TCC 37*e4b17023SJohn Marino #define _OSTREAM_TCC 1 38*e4b17023SJohn Marino 39*e4b17023SJohn Marino #pragma GCC system_header 40*e4b17023SJohn Marino 41*e4b17023SJohn Marino #include <bits/cxxabi_forced.h> 42*e4b17023SJohn Marino 43*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 44*e4b17023SJohn Marino { 45*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 46*e4b17023SJohn Marino 47*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 48*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>::sentry:: sentry(basic_ostream<_CharT,_Traits> & __os)49*e4b17023SJohn Marino sentry(basic_ostream<_CharT, _Traits>& __os) 50*e4b17023SJohn Marino : _M_ok(false), _M_os(__os) 51*e4b17023SJohn Marino { 52*e4b17023SJohn Marino // XXX MT 53*e4b17023SJohn Marino if (__os.tie() && __os.good()) 54*e4b17023SJohn Marino __os.tie()->flush(); 55*e4b17023SJohn Marino 56*e4b17023SJohn Marino if (__os.good()) 57*e4b17023SJohn Marino _M_ok = true; 58*e4b17023SJohn Marino else 59*e4b17023SJohn Marino __os.setstate(ios_base::failbit); 60*e4b17023SJohn Marino } 61*e4b17023SJohn Marino 62*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 63*e4b17023SJohn Marino template<typename _ValueT> 64*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 65*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: _M_insert(_ValueT __v)66*e4b17023SJohn Marino _M_insert(_ValueT __v) 67*e4b17023SJohn Marino { 68*e4b17023SJohn Marino sentry __cerb(*this); 69*e4b17023SJohn Marino if (__cerb) 70*e4b17023SJohn Marino { 71*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 72*e4b17023SJohn Marino __try 73*e4b17023SJohn Marino { 74*e4b17023SJohn Marino const __num_put_type& __np = __check_facet(this->_M_num_put); 75*e4b17023SJohn Marino if (__np.put(*this, *this, this->fill(), __v).failed()) 76*e4b17023SJohn Marino __err |= ios_base::badbit; 77*e4b17023SJohn Marino } 78*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 79*e4b17023SJohn Marino { 80*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 81*e4b17023SJohn Marino __throw_exception_again; 82*e4b17023SJohn Marino } 83*e4b17023SJohn Marino __catch(...) 84*e4b17023SJohn Marino { this->_M_setstate(ios_base::badbit); } 85*e4b17023SJohn Marino if (__err) 86*e4b17023SJohn Marino this->setstate(__err); 87*e4b17023SJohn Marino } 88*e4b17023SJohn Marino return *this; 89*e4b17023SJohn Marino } 90*e4b17023SJohn Marino 91*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 92*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 93*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: operator <<(short __n)94*e4b17023SJohn Marino operator<<(short __n) 95*e4b17023SJohn Marino { 96*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 97*e4b17023SJohn Marino // 117. basic_ostream uses nonexistent num_put member functions. 98*e4b17023SJohn Marino const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield; 99*e4b17023SJohn Marino if (__fmt == ios_base::oct || __fmt == ios_base::hex) 100*e4b17023SJohn Marino return _M_insert(static_cast<long>(static_cast<unsigned short>(__n))); 101*e4b17023SJohn Marino else 102*e4b17023SJohn Marino return _M_insert(static_cast<long>(__n)); 103*e4b17023SJohn Marino } 104*e4b17023SJohn Marino 105*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 106*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 107*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: operator <<(int __n)108*e4b17023SJohn Marino operator<<(int __n) 109*e4b17023SJohn Marino { 110*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 111*e4b17023SJohn Marino // 117. basic_ostream uses nonexistent num_put member functions. 112*e4b17023SJohn Marino const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield; 113*e4b17023SJohn Marino if (__fmt == ios_base::oct || __fmt == ios_base::hex) 114*e4b17023SJohn Marino return _M_insert(static_cast<long>(static_cast<unsigned int>(__n))); 115*e4b17023SJohn Marino else 116*e4b17023SJohn Marino return _M_insert(static_cast<long>(__n)); 117*e4b17023SJohn Marino } 118*e4b17023SJohn Marino 119*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 120*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 121*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: operator <<(__streambuf_type * __sbin)122*e4b17023SJohn Marino operator<<(__streambuf_type* __sbin) 123*e4b17023SJohn Marino { 124*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 125*e4b17023SJohn Marino sentry __cerb(*this); 126*e4b17023SJohn Marino if (__cerb && __sbin) 127*e4b17023SJohn Marino { 128*e4b17023SJohn Marino __try 129*e4b17023SJohn Marino { 130*e4b17023SJohn Marino if (!__copy_streambufs(__sbin, this->rdbuf())) 131*e4b17023SJohn Marino __err |= ios_base::failbit; 132*e4b17023SJohn Marino } 133*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 134*e4b17023SJohn Marino { 135*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 136*e4b17023SJohn Marino __throw_exception_again; 137*e4b17023SJohn Marino } 138*e4b17023SJohn Marino __catch(...) 139*e4b17023SJohn Marino { this->_M_setstate(ios_base::failbit); } 140*e4b17023SJohn Marino } 141*e4b17023SJohn Marino else if (!__sbin) 142*e4b17023SJohn Marino __err |= ios_base::badbit; 143*e4b17023SJohn Marino if (__err) 144*e4b17023SJohn Marino this->setstate(__err); 145*e4b17023SJohn Marino return *this; 146*e4b17023SJohn Marino } 147*e4b17023SJohn Marino 148*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 149*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 150*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: put(char_type __c)151*e4b17023SJohn Marino put(char_type __c) 152*e4b17023SJohn Marino { 153*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 154*e4b17023SJohn Marino // DR 60. What is a formatted input function? 155*e4b17023SJohn Marino // basic_ostream::put(char_type) is an unformatted output function. 156*e4b17023SJohn Marino // DR 63. Exception-handling policy for unformatted output. 157*e4b17023SJohn Marino // Unformatted output functions should catch exceptions thrown 158*e4b17023SJohn Marino // from streambuf members. 159*e4b17023SJohn Marino sentry __cerb(*this); 160*e4b17023SJohn Marino if (__cerb) 161*e4b17023SJohn Marino { 162*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 163*e4b17023SJohn Marino __try 164*e4b17023SJohn Marino { 165*e4b17023SJohn Marino const int_type __put = this->rdbuf()->sputc(__c); 166*e4b17023SJohn Marino if (traits_type::eq_int_type(__put, traits_type::eof())) 167*e4b17023SJohn Marino __err |= ios_base::badbit; 168*e4b17023SJohn Marino } 169*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 170*e4b17023SJohn Marino { 171*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 172*e4b17023SJohn Marino __throw_exception_again; 173*e4b17023SJohn Marino } 174*e4b17023SJohn Marino __catch(...) 175*e4b17023SJohn Marino { this->_M_setstate(ios_base::badbit); } 176*e4b17023SJohn Marino if (__err) 177*e4b17023SJohn Marino this->setstate(__err); 178*e4b17023SJohn Marino } 179*e4b17023SJohn Marino return *this; 180*e4b17023SJohn Marino } 181*e4b17023SJohn Marino 182*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 183*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 184*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: write(const _CharT * __s,streamsize __n)185*e4b17023SJohn Marino write(const _CharT* __s, streamsize __n) 186*e4b17023SJohn Marino { 187*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 188*e4b17023SJohn Marino // DR 60. What is a formatted input function? 189*e4b17023SJohn Marino // basic_ostream::write(const char_type*, streamsize) is an 190*e4b17023SJohn Marino // unformatted output function. 191*e4b17023SJohn Marino // DR 63. Exception-handling policy for unformatted output. 192*e4b17023SJohn Marino // Unformatted output functions should catch exceptions thrown 193*e4b17023SJohn Marino // from streambuf members. 194*e4b17023SJohn Marino sentry __cerb(*this); 195*e4b17023SJohn Marino if (__cerb) 196*e4b17023SJohn Marino { 197*e4b17023SJohn Marino __try 198*e4b17023SJohn Marino { _M_write(__s, __n); } 199*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 200*e4b17023SJohn Marino { 201*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 202*e4b17023SJohn Marino __throw_exception_again; 203*e4b17023SJohn Marino } 204*e4b17023SJohn Marino __catch(...) 205*e4b17023SJohn Marino { this->_M_setstate(ios_base::badbit); } 206*e4b17023SJohn Marino } 207*e4b17023SJohn Marino return *this; 208*e4b17023SJohn Marino } 209*e4b17023SJohn Marino 210*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 211*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 212*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: flush()213*e4b17023SJohn Marino flush() 214*e4b17023SJohn Marino { 215*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 216*e4b17023SJohn Marino // DR 60. What is a formatted input function? 217*e4b17023SJohn Marino // basic_ostream::flush() is *not* an unformatted output function. 218*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 219*e4b17023SJohn Marino __try 220*e4b17023SJohn Marino { 221*e4b17023SJohn Marino if (this->rdbuf() && this->rdbuf()->pubsync() == -1) 222*e4b17023SJohn Marino __err |= ios_base::badbit; 223*e4b17023SJohn Marino } 224*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 225*e4b17023SJohn Marino { 226*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 227*e4b17023SJohn Marino __throw_exception_again; 228*e4b17023SJohn Marino } 229*e4b17023SJohn Marino __catch(...) 230*e4b17023SJohn Marino { this->_M_setstate(ios_base::badbit); } 231*e4b17023SJohn Marino if (__err) 232*e4b17023SJohn Marino this->setstate(__err); 233*e4b17023SJohn Marino return *this; 234*e4b17023SJohn Marino } 235*e4b17023SJohn Marino 236*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 237*e4b17023SJohn Marino typename basic_ostream<_CharT, _Traits>::pos_type 238*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: tellp()239*e4b17023SJohn Marino tellp() 240*e4b17023SJohn Marino { 241*e4b17023SJohn Marino pos_type __ret = pos_type(-1); 242*e4b17023SJohn Marino __try 243*e4b17023SJohn Marino { 244*e4b17023SJohn Marino if (!this->fail()) 245*e4b17023SJohn Marino __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); 246*e4b17023SJohn Marino } 247*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 248*e4b17023SJohn Marino { 249*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 250*e4b17023SJohn Marino __throw_exception_again; 251*e4b17023SJohn Marino } 252*e4b17023SJohn Marino __catch(...) 253*e4b17023SJohn Marino { this->_M_setstate(ios_base::badbit); } 254*e4b17023SJohn Marino return __ret; 255*e4b17023SJohn Marino } 256*e4b17023SJohn Marino 257*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 258*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 259*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: seekp(pos_type __pos)260*e4b17023SJohn Marino seekp(pos_type __pos) 261*e4b17023SJohn Marino { 262*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 263*e4b17023SJohn Marino __try 264*e4b17023SJohn Marino { 265*e4b17023SJohn Marino if (!this->fail()) 266*e4b17023SJohn Marino { 267*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 268*e4b17023SJohn Marino // 136. seekp, seekg setting wrong streams? 269*e4b17023SJohn Marino const pos_type __p = this->rdbuf()->pubseekpos(__pos, 270*e4b17023SJohn Marino ios_base::out); 271*e4b17023SJohn Marino 272*e4b17023SJohn Marino // 129. Need error indication from seekp() and seekg() 273*e4b17023SJohn Marino if (__p == pos_type(off_type(-1))) 274*e4b17023SJohn Marino __err |= ios_base::failbit; 275*e4b17023SJohn Marino } 276*e4b17023SJohn Marino } 277*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 278*e4b17023SJohn Marino { 279*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 280*e4b17023SJohn Marino __throw_exception_again; 281*e4b17023SJohn Marino } 282*e4b17023SJohn Marino __catch(...) 283*e4b17023SJohn Marino { this->_M_setstate(ios_base::badbit); } 284*e4b17023SJohn Marino if (__err) 285*e4b17023SJohn Marino this->setstate(__err); 286*e4b17023SJohn Marino return *this; 287*e4b17023SJohn Marino } 288*e4b17023SJohn Marino 289*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 290*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& 291*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>:: seekp(off_type __off,ios_base::seekdir __dir)292*e4b17023SJohn Marino seekp(off_type __off, ios_base::seekdir __dir) 293*e4b17023SJohn Marino { 294*e4b17023SJohn Marino ios_base::iostate __err = ios_base::goodbit; 295*e4b17023SJohn Marino __try 296*e4b17023SJohn Marino { 297*e4b17023SJohn Marino if (!this->fail()) 298*e4b17023SJohn Marino { 299*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 300*e4b17023SJohn Marino // 136. seekp, seekg setting wrong streams? 301*e4b17023SJohn Marino const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir, 302*e4b17023SJohn Marino ios_base::out); 303*e4b17023SJohn Marino 304*e4b17023SJohn Marino // 129. Need error indication from seekp() and seekg() 305*e4b17023SJohn Marino if (__p == pos_type(off_type(-1))) 306*e4b17023SJohn Marino __err |= ios_base::failbit; 307*e4b17023SJohn Marino } 308*e4b17023SJohn Marino } 309*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 310*e4b17023SJohn Marino { 311*e4b17023SJohn Marino this->_M_setstate(ios_base::badbit); 312*e4b17023SJohn Marino __throw_exception_again; 313*e4b17023SJohn Marino } 314*e4b17023SJohn Marino __catch(...) 315*e4b17023SJohn Marino { this->_M_setstate(ios_base::badbit); } 316*e4b17023SJohn Marino if (__err) 317*e4b17023SJohn Marino this->setstate(__err); 318*e4b17023SJohn Marino return *this; 319*e4b17023SJohn Marino } 320*e4b17023SJohn Marino 321*e4b17023SJohn Marino template<typename _CharT, typename _Traits> 322*e4b17023SJohn Marino basic_ostream<_CharT, _Traits>& operator <<(basic_ostream<_CharT,_Traits> & __out,const char * __s)323*e4b17023SJohn Marino operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s) 324*e4b17023SJohn Marino { 325*e4b17023SJohn Marino if (!__s) 326*e4b17023SJohn Marino __out.setstate(ios_base::badbit); 327*e4b17023SJohn Marino else 328*e4b17023SJohn Marino { 329*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 330*e4b17023SJohn Marino // 167. Improper use of traits_type::length() 331*e4b17023SJohn Marino const size_t __clen = char_traits<char>::length(__s); 332*e4b17023SJohn Marino __try 333*e4b17023SJohn Marino { 334*e4b17023SJohn Marino struct __ptr_guard 335*e4b17023SJohn Marino { 336*e4b17023SJohn Marino _CharT *__p; 337*e4b17023SJohn Marino __ptr_guard (_CharT *__ip): __p(__ip) { } 338*e4b17023SJohn Marino ~__ptr_guard() { delete[] __p; } 339*e4b17023SJohn Marino _CharT* __get() { return __p; } 340*e4b17023SJohn Marino } __pg (new _CharT[__clen]); 341*e4b17023SJohn Marino 342*e4b17023SJohn Marino _CharT *__ws = __pg.__get(); 343*e4b17023SJohn Marino for (size_t __i = 0; __i < __clen; ++__i) 344*e4b17023SJohn Marino __ws[__i] = __out.widen(__s[__i]); 345*e4b17023SJohn Marino __ostream_insert(__out, __ws, __clen); 346*e4b17023SJohn Marino } 347*e4b17023SJohn Marino __catch(__cxxabiv1::__forced_unwind&) 348*e4b17023SJohn Marino { 349*e4b17023SJohn Marino __out._M_setstate(ios_base::badbit); 350*e4b17023SJohn Marino __throw_exception_again; 351*e4b17023SJohn Marino } 352*e4b17023SJohn Marino __catch(...) 353*e4b17023SJohn Marino { __out._M_setstate(ios_base::badbit); } 354*e4b17023SJohn Marino } 355*e4b17023SJohn Marino return __out; 356*e4b17023SJohn Marino } 357*e4b17023SJohn Marino 358*e4b17023SJohn Marino // Inhibit implicit instantiations for required instantiations, 359*e4b17023SJohn Marino // which are defined via explicit instantiations elsewhere. 360*e4b17023SJohn Marino #if _GLIBCXX_EXTERN_TEMPLATE 361*e4b17023SJohn Marino extern template class basic_ostream<char>; 362*e4b17023SJohn Marino extern template ostream& endl(ostream&); 363*e4b17023SJohn Marino extern template ostream& ends(ostream&); 364*e4b17023SJohn Marino extern template ostream& flush(ostream&); 365*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, char); 366*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, unsigned char); 367*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, signed char); 368*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, const char*); 369*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, const unsigned char*); 370*e4b17023SJohn Marino extern template ostream& operator<<(ostream&, const signed char*); 371*e4b17023SJohn Marino 372*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(long); 373*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(unsigned long); 374*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(bool); 375*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_LONG_LONG 376*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(long long); 377*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(unsigned long long); 378*e4b17023SJohn Marino #endif 379*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(double); 380*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(long double); 381*e4b17023SJohn Marino extern template ostream& ostream::_M_insert(const void*); 382*e4b17023SJohn Marino 383*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_WCHAR_T 384*e4b17023SJohn Marino extern template class basic_ostream<wchar_t>; 385*e4b17023SJohn Marino extern template wostream& endl(wostream&); 386*e4b17023SJohn Marino extern template wostream& ends(wostream&); 387*e4b17023SJohn Marino extern template wostream& flush(wostream&); 388*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, wchar_t); 389*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, char); 390*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, const wchar_t*); 391*e4b17023SJohn Marino extern template wostream& operator<<(wostream&, const char*); 392*e4b17023SJohn Marino 393*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(long); 394*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(unsigned long); 395*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(bool); 396*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_LONG_LONG 397*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(long long); 398*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(unsigned long long); 399*e4b17023SJohn Marino #endif 400*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(double); 401*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(long double); 402*e4b17023SJohn Marino extern template wostream& wostream::_M_insert(const void*); 403*e4b17023SJohn Marino #endif 404*e4b17023SJohn Marino #endif 405*e4b17023SJohn Marino 406*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 407*e4b17023SJohn Marino } // namespace std 408*e4b17023SJohn Marino 409*e4b17023SJohn Marino #endif 410