1/* 2 * Copyright (c) 1999 3 * Silicon Graphics Computer Systems, Inc. 4 * 5 * Copyright (c) 1999 6 * Boris Fomitchev 7 * 8 * This material is provided "as is", with absolutely no warranty expressed 9 * or implied. Any use is at your own risk. 10 * 11 * Permission to use or copy this software for any purpose is hereby granted 12 * without fee, provided the above notices are retained on all copies. 13 * Permission to modify the code and to distribute modified code is granted, 14 * provided the above notices are retained, and a notice that the code was 15 * modified is included with the above copyright notice. 16 * 17 */ 18 19 20#ifndef _STLP_INTERNAL_OSTREAM_H 21#define _STLP_INTERNAL_OSTREAM_H 22 23#ifndef _STLP_INTERNAL_IOS_H 24# include <stl/_ios.h> // For basic_ios<>. Includes <iosfwd>. 25#endif 26 27#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H 28# include <stl/_ostreambuf_iterator.h> 29#endif 30 31#if !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) && !defined (_STLP_INTERNAL_EXCEPTION) 32# include <stl/_exception.h> 33#endif 34 35_STLP_BEGIN_NAMESPACE 36 37#if defined (_STLP_USE_TEMPLATE_EXPORT) 38template <class _CharT, class _Traits> 39class _Osentry; 40#endif 41 42_STLP_MOVE_TO_PRIV_NAMESPACE 43 44template <class _CharT, class _Traits> 45bool __init_bostr(basic_ostream<_CharT, _Traits>& __str); 46 47_STLP_MOVE_TO_STD_NAMESPACE 48 49//---------------------------------------------------------------------- 50// class basic_ostream<> 51 52template <class _CharT, class _Traits> 53class basic_ostream : virtual public basic_ios<_CharT, _Traits> { 54 typedef basic_ostream<_CharT, _Traits> _Self; 55 56#if defined (_STLP_MSVC) && (_STLP_MSVC >= 1300 && _STLP_MSVC <= 1310) 57 //explicitely defined as private to avoid warnings: 58 basic_ostream(_Self const&); 59 _Self& operator = (_Self const&); 60#endif 61 62public: // Types 63 typedef _CharT char_type; 64 typedef typename _Traits::int_type int_type; 65 typedef typename _Traits::pos_type pos_type; 66 typedef typename _Traits::off_type off_type; 67 typedef _Traits traits_type; 68 typedef basic_ios<_CharT, _Traits> _Basic_ios; 69 70public: // Constructor and destructor. 71 explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __buf); 72 ~basic_ostream(); 73 74public: // Hooks for manipulators. 75 typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&); 76 typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&); 77 typedef _Self& (_STLP_CALL *__ostream_fn)(_Self&); 78 _Self& operator<< (__ostream_fn __f) { return __f(*this); } 79 _Self & operator<< (__ios_base_fn __f) { __f(*this); return *this; } 80 _Self& operator<< (__ios_fn __ff) { __ff(*this); return *this; } 81 82private: 83 bool _M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from, 84 basic_streambuf<_CharT, _Traits>* __to); 85 bool _M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from, 86 basic_streambuf<_CharT, _Traits>* __to); 87 88public: 89 void _M_put_char(_CharT __c); 90 91 void _M_put_nowiden(const _CharT* __s); 92 void _M_put_widen(const char* __s); 93 bool _M_put_widen_aux(const char* __s, streamsize __n); 94 95public: // Unformatted output. 96 _Self& put(char_type __c); 97 _Self& write(const char_type* __s, streamsize __n); 98 99public: // Formatted output. 100 // Formatted output from a streambuf. 101 _Self& operator<<(basic_streambuf<_CharT, _Traits>* __buf); 102# ifndef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 103 // this is needed for compiling with option char = unsigned 104 _Self& operator<<(unsigned char __x) { _M_put_char(__x); return *this; } 105# endif 106 _Self& operator<<(short __x); 107 _Self& operator<<(unsigned short __x); 108 _Self& operator<<(int __x); 109#if defined (_WIN64) || !defined (_STLP_MSVC) || (_STLP_MSVC < 1300) 110 _Self& operator<<(unsigned int __x); 111#else 112/* We define this operator with size_t rather than unsigned int to avoid 113 * 64 bits warning. 114 */ 115 _Self& operator<<(size_t __x); 116#endif 117 _Self& operator<<(long __x); 118 _Self& operator<<(unsigned long __x); 119#ifdef _STLP_LONG_LONG 120 _Self& operator<< (_STLP_LONG_LONG __x); 121 _Self& operator<< (unsigned _STLP_LONG_LONG __x); 122#endif 123 _Self& operator<<(float __x); 124 _Self& operator<<(double __x); 125# ifndef _STLP_NO_LONG_DOUBLE 126 _Self& operator<<(long double __x); 127# endif 128 _Self& operator<<(const void* __x); 129# ifndef _STLP_NO_BOOL 130 _Self& operator<<(bool __x); 131# endif 132 133public: // Buffer positioning and manipulation. 134 _Self& flush() { 135 if (this->rdbuf()) 136 if (this->rdbuf()->pubsync() == -1) 137 this->setstate(ios_base::badbit); 138 return *this; 139 } 140 141 pos_type tellp() { 142 return this->rdbuf() && !this->fail() 143 ? this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out) 144 : pos_type(-1); 145 } 146 147 _Self& seekp(pos_type __pos) { 148 if (this->rdbuf() && !this->fail()) { 149 if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1)) { 150 this->setstate(ios_base::failbit); 151 } 152 } 153 return *this; 154 } 155 156 _Self& seekp(off_type __off, ios_base::seekdir __dir) { 157 if (this->rdbuf() && !this->fail()) 158 this->rdbuf()->pubseekoff(__off, __dir, ios_base::out); 159 return *this; 160 } 161 162#if defined (_STLP_USE_TEMPLATE_EXPORT) 163 // If we are using DLL specs, we have not to use inner classes 164 // end class declaration here 165 typedef _Osentry<_CharT, _Traits> sentry; 166}; 167# define sentry _Osentry 168 template <class _CharT, class _Traits> 169 class _Osentry { 170 typedef _Osentry<_CharT, _Traits> _Self; 171#else 172 class sentry { 173 typedef sentry _Self; 174#endif 175 private: 176 basic_ostream<_CharT, _Traits>& _M_str; 177 // basic_streambuf<_CharT, _Traits>* _M_buf; 178 bool _M_ok; 179 public: 180 explicit sentry(basic_ostream<_CharT, _Traits>& __str) 181 : _M_str(__str), /* _M_buf(__str.rdbuf()), */ _M_ok(_STLP_PRIV __init_bostr(__str)) 182 {} 183 184 ~sentry() { 185 if (_M_str.flags() & ios_base::unitbuf) 186#if !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) 187 if (!uncaught_exception()) 188#endif 189 _M_str.flush(); 190 } 191 192 operator bool() const { return _M_ok; } 193 private: // Disable assignment and copy constructor. 194 //Implementation is here only to avoid warning with some compilers. 195 sentry(const _Self& __s) : _M_str(__s._M_str) {} 196 _Self& operator=(const _Self&) { return *this; } 197 }; 198#if defined (_STLP_USE_TEMPLATE_EXPORT) 199# undef sentry 200#else 201 // close basic_ostream class definition here 202}; 203#endif 204 205#if defined (_STLP_USE_TEMPLATE_EXPORT) 206_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<char, char_traits<char> >; 207_STLP_EXPORT_TEMPLATE_CLASS _Osentry<char, char_traits<char> >; 208# if !defined (_STLP_NO_WCHAR_T) 209_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<wchar_t, char_traits<wchar_t> >; 210_STLP_EXPORT_TEMPLATE_CLASS _Osentry<wchar_t, char_traits<wchar_t> >; 211# endif 212#endif /* _STLP_USE_TEMPLATE_EXPORT */ 213 214_STLP_MOVE_TO_PRIV_NAMESPACE 215 216// Helper functions for istream<>::sentry constructor. 217template <class _CharT, class _Traits> 218bool __init_bostr(basic_ostream<_CharT, _Traits>& __str) { 219 if (__str.good()) { 220 // boris : check if this is needed ! 221 if (!__str.rdbuf()) 222 __str.setstate(ios_base::badbit); 223 if (__str.tie()) 224 __str.tie()->flush(); 225 return __str.good(); 226 } 227 else 228 return false; 229} 230 231template <class _CharT, class _Traits> 232inline basic_streambuf<_CharT, _Traits>* _STLP_CALL 233__get_ostreambuf(basic_ostream<_CharT, _Traits>& __St) 234{ return __St.rdbuf(); } 235 236_STLP_MOVE_TO_STD_NAMESPACE 237 238// Non-member functions. 239template <class _CharT, class _Traits> 240inline basic_ostream<_CharT, _Traits>& _STLP_CALL 241operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c){ 242 __os._M_put_char(__c); 243 return __os; 244} 245 246template <class _CharT, class _Traits> 247inline basic_ostream<_CharT, _Traits>& _STLP_CALL 248operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __s) { 249 __os._M_put_nowiden(__s); 250 return __os; 251} 252 253#if defined (_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER) 254// some specializations 255 256inline basic_ostream<char, char_traits<char> >& _STLP_CALL 257operator<<(basic_ostream<char, char_traits<char> >& __os, char __c) { 258 __os._M_put_char(__c); 259 return __os; 260} 261 262inline basic_ostream<char, char_traits<char> >& _STLP_CALL 263operator<<(basic_ostream<char, char_traits<char> >& __os, signed char __c) { 264 __os._M_put_char(__c); 265 return __os; 266} 267 268inline basic_ostream<char, char_traits<char> >& _STLP_CALL 269operator<<(basic_ostream<char, char_traits<char> >& __os, unsigned char __c) { 270 __os._M_put_char(__c); 271 return __os; 272} 273 274inline basic_ostream<char, char_traits<char> >& _STLP_CALL 275operator<<(basic_ostream<char, char_traits<char> >& __os, const char* __s) { 276 __os._M_put_nowiden(__s); 277 return __os; 278} 279 280inline basic_ostream<char, char_traits<char> >& _STLP_CALL 281operator<<(basic_ostream<char, char_traits<char> >& __os, const signed char* __s) { 282 __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s)); 283 return __os; 284} 285 286inline basic_ostream<char, char_traits<char> >& 287operator<<(basic_ostream<char, char_traits<char> >& __os, const unsigned char* __s) { 288 __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s)); 289 return __os; 290} 291 292#else 293 294// also for compilers who might use that 295template <class _CharT, class _Traits> 296inline basic_ostream<_CharT, _Traits>& _STLP_CALL 297operator<<(basic_ostream<_CharT, _Traits>& __os, char __c) { 298 __os._M_put_char(__os.widen(__c)); 299 return __os; 300} 301 302template <class _Traits> 303inline basic_ostream<char, _Traits>& _STLP_CALL 304operator<<(basic_ostream<char, _Traits>& __os, char __c) { 305 __os._M_put_char(__c); 306 return __os; 307} 308 309template <class _Traits> 310inline basic_ostream<char, _Traits>& _STLP_CALL 311operator<<(basic_ostream<char, _Traits>& __os, signed char __c) { 312 __os._M_put_char(__c); 313 return __os; 314} 315 316template <class _Traits> 317inline basic_ostream<char, _Traits>& _STLP_CALL 318operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) { 319 __os._M_put_char(__c); 320 return __os; 321} 322 323template <class _CharT, class _Traits> 324inline basic_ostream<_CharT, _Traits>& _STLP_CALL 325operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __s) { 326 __os._M_put_widen(__s); 327 return __os; 328} 329 330template <class _Traits> 331inline basic_ostream<char, _Traits>& _STLP_CALL 332operator<<(basic_ostream<char, _Traits>& __os, const char* __s) { 333 __os._M_put_nowiden(__s); 334 return __os; 335} 336 337template <class _Traits> 338inline basic_ostream<char, _Traits>& _STLP_CALL 339operator<<(basic_ostream<char, _Traits>& __os, const signed char* __s) { 340 __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s)); 341 return __os; 342} 343 344template <class _Traits> 345inline basic_ostream<char, _Traits>& 346operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __s) { 347 __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s)); 348 return __os; 349} 350#endif /* _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER */ 351 352//---------------------------------------------------------------------- 353// basic_ostream manipulators. 354 355template <class _CharT, class _Traits> 356inline basic_ostream<_CharT, _Traits>& _STLP_CALL 357endl(basic_ostream<_CharT, _Traits>& __os) { 358 __os.put(__os.widen('\n')); 359 __os.flush(); 360 return __os; 361} 362 363template <class _CharT, class _Traits> 364inline basic_ostream<_CharT, _Traits>& _STLP_CALL 365ends(basic_ostream<_CharT, _Traits>& __os) { 366 __os.put(_STLP_DEFAULT_CONSTRUCTED(_CharT)); 367 return __os; 368} 369 370template <class _CharT, class _Traits> 371inline basic_ostream<_CharT, _Traits>& _STLP_CALL 372flush(basic_ostream<_CharT, _Traits>& __os) { 373 __os.flush(); 374 return __os; 375} 376 377_STLP_END_NAMESPACE 378 379#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION) 380# include <stl/_ostream.c> 381#endif 382 383#endif /* _STLP_INTERNAL_OSTREAM_H */ 384 385// Local Variables: 386// mode:C++ 387// End: 388