// -*- C++ -*- /*************************************************************************** * * _basic_ios.h - definition of the class template basic_ios * * $Id: _basic_ios.h 637130 2008-03-14 15:16:33Z faridz $ * *************************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * * Copyright 1994-2006 Rogue Wave Software. * **************************************************************************/ #ifndef _RWSTD_RW_BASIC_IOS_H_INCLUDED #define _RWSTD_RW_BASIC_IOS_H_INCLUDED #if __GNUG__ >= 3 # pragma GCC system_header #endif // gcc >= 3 #ifndef _RWSTD_NO_REDUNDANT_DEFINITIONS # include #endif // _RWSTD_NO_REDUNDANT_DEFINITIONS #include // for ctype #ifndef _RWSTD_RW_IOSBASE_H_INCLUDED # include // for ios_base #endif // _RWSTD_RW_IOSBASE_H_INCLUDED #ifndef _RWSTD_RW_IOSFWD_H_INCLUDED # include #endif // _RWSTD_RW_IOSFWD_H_INCLUDED _RWSTD_NAMESPACE (std) { #ifndef _RWSTD_IOSFWD_INCLUDED _EXPORT template > class basic_ios; typedef basic_ios ios; # ifndef _RWSTD_NO_WCHAR_T typedef basic_ios wios; # endif // _RWSTD_NO_WCHAR_T #endif // _RWSTD_IOSFWD_INCLUDED _EXPORT template class basic_ios: public ios_base { public: typedef _CharT char_type; typedef _Traits traits_type; typedef _TYPENAME traits_type::int_type int_type; typedef _TYPENAME traits_type::pos_type pos_type; typedef _TYPENAME traits_type::int_type off_type; protected: typedef basic_streambuf streambuf_type; typedef basic_ostream ostream_type; public: // 27.4.4.1, p1 - NOTE: `sb' may point to a yet uninitialized // object; it is unsafe to reference any of its members _EXPLICIT basic_ios (streambuf_type *__sb) { init (__sb); } // 27.4.4.3, p1 #ifndef _RWSTD_NO_EXT_IOS_SAFE_CONVERSION private: # if !defined (__INTEL_COMPILER) || !defined (_WIN32) // SunPro 5.7 needs a data pointer and misoptimizes the conversion // operator when this is a pointer to a member function (bug #446) struct _C_uniq_type { int _C_foo; /* never used */ }; typedef int _C_uniq_type::*_C_uniq_ptr; # else // if __INTEL_COMPILER && _WIN32 // working around Intel C++ 8.1 -Zi bug #570 on Win32 struct _C_uniq_type { void _C_foo () { }; /* never used */ }; typedef void (_C_uniq_type::*_C_uniq_ptr)(); # endif // __INTEL_COMPILER/_WIN32 public: operator _C_uniq_ptr () const { return fail () ? _C_uniq_ptr (0) : &_C_uniq_type::_C_foo; } #else // if defined (_RWSTD_NO_EXT_IOS_SAFE_CONVERSION) operator void*() const { return fail () ? (void*)0 : (void*)1; } #endif // _RWSTD_NO_EXT_IOS_SAFE_CONVERSION // 27.4.4.3, p2 bool operator! () const { return fail (); } // 27.4.4.3, p3 iostate rdstate () const { return iostate (_C_state); } // 27.4.4.3, p4 void clear (iostate __state = goodbit) { _C_set (__state, _C_except, rdbuf ()); } // 27.4.4.3, p6 void setstate (iostate __st) { clear (rdstate () | __st); } // 27.4.4.3, p7 bool good () const { return goodbit == rdstate (); } // 27.4.4.3, p8 bool eof () const { return 0 != (rdstate () & eofbit); } // 27.4.4.3, p9 bool fail () const { return 0 != (rdstate () & (failbit | badbit)); } // 27.4.4.3, p10 bool bad () const { return 0 != (rdstate () & badbit); } // 27.4.4.3, p11 iostate exceptions () const { return iostate (_C_except); } // 27.4.4.3, p12 void exceptions (iostate __state) { _C_set (rdstate (), __state, rdbuf ()); } // 27.4.4.2, p1 ostream_type* tie () const { return _C_usr ? _RWSTD_STATIC_CAST (ostream_type*, _C_tie ()) : 0; } // 27.4.4.2, p2 ostream_type* tie (ostream_type *__strm) { return _RWSTD_STATIC_CAST (ostream_type*, _C_tie (__strm)); } // 27.4.4.2, p4 - NOTE: the pointer returned from rdbuf() in derived // classes may be different from the one passed to rdbuf (streambuf_type*) streambuf_type* rdbuf () const { return _RWSTD_STATIC_CAST (streambuf_type*, _C_rdbuf); } // 27.4.4.2, p5 streambuf_type* rdbuf (streambuf_type *__rdbuf) { return _RWSTD_STATIC_CAST (streambuf_type*, _C_set (goodbit, _C_except, __rdbuf)); } // 27.4.4.2, p15 basic_ios& copyfmt (const basic_ios &__x) { return _C_copyfmt (__x, &_C_fill, &__x._C_fill, sizeof _C_fill), *this; } // 27.4.4.2, p12 char_type fill () const; // 27.4.4.2, p13 char_type fill (char_type); // 27.4.4.2, p8 locale imbue (const locale&); // 27.4.4.2, p10 char narrow (char_type __c, char __dflt) const { return _USE_FACET (ctype, getloc ()).narrow (__c, __dflt); } // 27.4.4.2, p11 char_type widen (char __c) const { return _USE_FACET (ctype, getloc ()).widen (__c); } protected: // initialization of standard iostream objects may depend on // the default ctor not to re-initialize the object basic_ios () { /* no-op as per 27.4.4.1, p2 */ } // 27.4.4.1, p3 void init (streambuf_type*); // (conditionally) returns a pointer to a mutex in the associated // basic_streambuf object _RW::__rw_mutex* _C_bufmutex () const; private: basic_ios (const basic_ios&); // not defined basic_ios& operator= (const basic_ios&); // not defined int_type _C_fill; // fill character (space by default) }; template inline _TYPENAME basic_ios<_CharT, _Traits>::char_type basic_ios<_CharT, _Traits>::fill () const { // delayed initialization used to allow objects of stream types other // than those whose char_type is char or wchar_t to be successfully // constructed even if the global locale doesn't contain a ctype facet // specialized on the stream type's char_type if (traits_type::eq_int_type (traits_type::eof (), _C_fill)) _RWSTD_CONST_CAST (basic_ios*, this)->fill (widen (' ')); return traits_type::to_char_type (_C_fill); } template inline _TYPENAME basic_ios<_CharT, _Traits>::char_type basic_ios<_CharT, _Traits>::fill (char_type __ch) { // convert to int type before swapping const int_type __c = traits_type::to_int_type (__ch); _RWSTD_MT_GUARD (flags () & _RWSTD_IOS_NOLOCK ? 0 : &_C_mutex); // save the previous value of the fill character traits_type::assign (__ch, traits_type::to_char_type (_C_fill)); _C_fill = __c; return __ch; } template inline locale basic_ios<_CharT, _Traits>::imbue (const locale& __loc) { _RWSTD_MT_GUARD (flags () & _RWSTD_IOS_NOLOCK ? 0 : &_C_mutex); const locale __tmp = _C_unsafe_imbue (__loc); if (rdbuf ()) rdbuf ()->pubimbue (__loc); return __tmp; } template inline void basic_ios<_CharT, _Traits>::init (streambuf_type *__sb) { // invalidate the fill character // the character will be initialized the first time fill() is called // so that objects of stream types other than those specialized on char // and wchar_t can be successfully constructed even if the global locale // doesn't contain a ctype facet specialized on the stream type's // char_type _C_fill = traits_type::eof (); _C_init (__sb); } template inline _RW::__rw_mutex* basic_ios<_CharT, _Traits>::_C_bufmutex () const { #if !defined (_RWSTD_REENTRANT) || defined (_RWSTD_NO_EXT_REENTRANT_IO) // unconditionally return pointer to buffer's mutex // (real or fake if not in an MT environment) return rdbuf () ? &rdbuf ()->_C_mutex : 0; #else // return pointer to buffer's mutex unless the object is in // a state where buffer locking is disabled) return flags () & _RWSTD_IOS_NOLOCKBUF || !rdbuf () ? 0 : &rdbuf ()->_C_mutex; #endif // !_RWSTD_REENTRANT || !_RWSTD_NO_EXT_REENTRANT_IO } } // namespace std #if _RWSTD_DEFINE_TEMPLATE_FIRST (_BASIC_IOS) # include #endif // _RWSTD_DEFINE_TEMPLATE_FIRST (_BASIC_IOS) _RWSTD_NAMESPACE (std) { #if _RWSTD_INSTANTIATE (_BASIC_IOS, _CHAR) _RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT basic_ios >); #endif // _RWSTD_INSTANTIATE (_BASIC_IOS, _CHAR) #if _RWSTD_INSTANTIATE (_BASIC_IOS, _WCHAR_T) _RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT basic_ios >); #endif // _RWSTD_INSTANTIATE (_BASIC_IOS, _WCHAR_T) } // namespace std #if _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_IOS) # include #endif // _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_IOS) #endif // _RWSTD_RW_BASIC_IOS_H_INCLUDED