first commit
This commit is contained in:
367
extern/stdcxx/4.2.1/include/rw/_basic_ios.h
vendored
Normal file
367
extern/stdcxx/4.2.1/include/rw/_basic_ios.h
vendored
Normal file
@@ -0,0 +1,367 @@
|
||||
// -*- 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 <streambuf>
|
||||
#endif // _RWSTD_NO_REDUNDANT_DEFINITIONS
|
||||
|
||||
#include <loc/_ctype.h> // for ctype
|
||||
|
||||
#ifndef _RWSTD_RW_IOSBASE_H_INCLUDED
|
||||
# include <rw/_iosbase.h> // for ios_base
|
||||
#endif // _RWSTD_RW_IOSBASE_H_INCLUDED
|
||||
|
||||
#ifndef _RWSTD_RW_IOSFWD_H_INCLUDED
|
||||
# include <rw/_iosfwd.h>
|
||||
#endif // _RWSTD_RW_IOSFWD_H_INCLUDED
|
||||
|
||||
|
||||
_RWSTD_NAMESPACE (std) {
|
||||
|
||||
#ifndef _RWSTD_IOSFWD_INCLUDED
|
||||
|
||||
_EXPORT
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class basic_ios;
|
||||
|
||||
typedef basic_ios<char> ios;
|
||||
|
||||
# ifndef _RWSTD_NO_WCHAR_T
|
||||
|
||||
typedef basic_ios<wchar_t> wios;
|
||||
|
||||
# endif // _RWSTD_NO_WCHAR_T
|
||||
#endif // _RWSTD_IOSFWD_INCLUDED
|
||||
|
||||
|
||||
_EXPORT
|
||||
template <class _CharT, class _Traits>
|
||||
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<char_type, traits_type> streambuf_type;
|
||||
typedef basic_ostream<char_type, traits_type> 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<char_type>, getloc ()).narrow (__c, __dflt);
|
||||
}
|
||||
|
||||
// 27.4.4.2, p11
|
||||
char_type widen (char __c) const {
|
||||
return _USE_FACET (ctype<char_type>, 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<class _CharT, class _Traits>
|
||||
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<class _CharT, class _Traits>
|
||||
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<class _CharT, class _Traits>
|
||||
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<class _CharT, class _Traits>
|
||||
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<class _CharT, class _Traits>
|
||||
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 <rw/_basic_ios.cc>
|
||||
#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<char, char_traits<char> >);
|
||||
|
||||
#endif // _RWSTD_INSTANTIATE (_BASIC_IOS, _CHAR)
|
||||
|
||||
#if _RWSTD_INSTANTIATE (_BASIC_IOS, _WCHAR_T)
|
||||
|
||||
_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT
|
||||
basic_ios<wchar_t, char_traits<wchar_t> >);
|
||||
|
||||
#endif // _RWSTD_INSTANTIATE (_BASIC_IOS, _WCHAR_T)
|
||||
|
||||
} // namespace std
|
||||
|
||||
|
||||
#if _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_IOS)
|
||||
# include <rw/_basic_ios.cc>
|
||||
#endif // _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_IOS)
|
||||
|
||||
|
||||
#endif // _RWSTD_RW_BASIC_IOS_H_INCLUDED
|
||||
Reference in New Issue
Block a user