blob: a3310b7481aecaeac2f5812a4f0f5de11b1dd024 [file] [log] [blame]
/***************************************************************************
*
* typeinfo.cpp - definitions of the Standard Library type_info
* and bad_cast class members
*
* $Id$
*
***************************************************************************
*
* 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.
*
**************************************************************************/
#define _RWSTD_LIB_SRC
#include <rw/_defs.h>
#include <typeinfo>
#include <string.h>
_RWSTD_NAMESPACE (__rw) {
inline int
__rw_ticmp (const _STD::type_info &lhs, const _STD::type_info &rhs)
{
const char* const n1 = lhs.name ();
const char* const n2 = rhs.name ();
return strcmp (n1 ? n1 : "", n2 ? n2 : "");
}
} // namespace __rw
/**************************************************************************/
// class type_info members
#if defined _RWSTD_TYPEINFO_INCLUDED
// define type_info members only if our own <typeinfo> header
// (as opposed to the compiler's native) has been included
// SunPro always #includes its own, regardless of options
# if !defined (_RWSTD_NO_STD_TYPE_INFO) \
|| !defined (_RWSTD_NO_GLOBAL_TYPE_INFO)
// at least one of the config tests above succeeded,
// rely on config tests for each individual member
# ifndef _RWSTD_NO_STD_TYPE_INFO
// define type_info et al in namespace std iff they are found to be
// defined in namespace std in the compiler's language support library
// or if they are not found to be defined in either namespace std or
// in the global namespace
_RWSTD_NAMESPACE (std) {
# endif // _RWSTD_NO_STD_TYPE_INFO
# ifdef _RWSTD_NO_TYPE_INFO_DTOR
type_info::~type_info () { }
# endif // _RWSTD_NO_TYPE_INFO_DTOR
# ifdef _RWSTD_NO_TYPE_INFO_BEFORE
bool type_info::before (const type_info &rhs) const
{
return 0 > _RW::__rw_ticmp (*this, rhs);
}
# endif // _RWSTD_NO_TYPE_INFO_BEFORE
# ifdef _RWSTD_NO_TYPE_INFO_NAME
// used in type_info::name() when the class has no member called _C_name
static const char _C_name[] = "";
const char* type_info::name () const
{
// silence warning: _C_name declared but never used
#ifdef _RWSTD_NO_STD_TYPE_INFO
_RWSTD_UNUSED (::_C_name);
#else
_RWSTD_UNUSED (std::_C_name);
#endif // _RWSTD_NO_STD_TYPE_INFO
return _C_name;
}
# endif // _RWSTD_NO_TYPE_INFO_NAME
# ifdef _RWSTD_NO_TYPE_INFO_EQUALITY
bool type_info::operator== (const type_info &rhs) const
{
return !before (rhs) && !rhs.before (*this);
}
# endif // _RWSTD_NO_TYPE_INFO_EQUALITY
# ifdef _RWSTD_NO_TYPE_INFO_INEQUALITY
bool type_info::operator!= (const type_info &rhs) const
{
return !(*this == rhs);
}
# endif // _RWSTD_NO_TYPE_INFO_INEQUALITY
# ifndef _RWSTD_NO_STD_TYPE_INFO
} // namespace std
# endif // _RWSTD_NO_STD_TYPE_INFO
# else // if _RWSTD_NO_STD_TYPEINFO && _RWSTD_NO_GLOBAL_TYPEINFO
// both config tests for class type_info failed so config test
// results for each individual member are likely to be unreliable
// rely on platform knowledge instead
# ifndef _RWSTD_NO_RUNTIME_IN_STD
_RWSTD_NAMESPACE (std) {
# endif // _RWSTD_NO_RUNTIME_IN_STD
# if defined (__HP_aCC)
const char* type_info::name () const
{
return _C_name;
}
# ifdef _HP_IA64ABI
bool type_info::before (const type_info &rhs) const
{
return name () < rhs.name ();
}
bool type_info::operator== (const type_info &rhs) const
{
return name () == rhs.name ();
}
bool type_info::operator!= (const type_info &rhs) const
{
return !(*this == rhs);
}
# endif // _HP_IA64ABI
# elif defined (__INTEL_COMPILER) && !defined (_MSC_VER)
const char* type_info::name () const
{
return _C_name;
}
bool type_info::before (const type_info &rhs) const
{
return name () < rhs.name ();
}
bool type_info::operator== (const type_info &rhs) const
{
return name () == rhs.name ();
}
bool type_info::operator!= (const type_info &rhs) const
{
return !(*this == rhs);
}
# elif defined (__GNUG__) && !defined (_RWSTD_NO_HONOR_STD)
// define member functions inline in namespace std (they are defined
// as members of ::type_info (as opposed to std::type_info) in libstdc++
// unless lib is built with -fhonor-std
const char* type_info::name () const
{
return _C_name;
}
bool type_info::operator== (const type_info &rhs) const
{
return !this->before (rhs) && !rhs.before (*this);
}
bool type_info::operator!= (const type_info &rhs) const
{
return !(*this == rhs);
}
# elif defined (__IBMCPP__)
const char* type_info::name () const
{
return _C_typeName;
}
bool type_info::operator== (const type_info &rhs) const
{
return !this->before (rhs) && !rhs.before (*this);
}
bool type_info::operator!= (const type_info &rhs) const
{
return !(*this == rhs);
}
# endif // __IBMCPP__
# if defined (__GNUG__) && !defined (_RWSTD_NO_HONOR_STD)
// define member function in namespace std (it is defined as a member
// of ::type_info (as opposed to std::type_info) in libstdc++
// unless lib is built with -fhonor-std
bool type_info::before (const type_info &rhs) const
{
return 0 > _RW::__rw_ticmp (*this, rhs);
}
# elif defined (__IBMCPP__)
bool type_info::before (const type_info &rhs) const
{
return 0 > _RW::__rw_ticmp (*this, rhs);
}
# endif // __GNUG__ && !_RWSTD_NO_HONOR_STD
# ifdef _MSC_VER
const char* type_info::name () const
{
return _C_name;
}
// define in global namespace just like MSVC wants it
bool type_info::before (const type_info &rhs) const
{
return 0 > _RW::__rw_ticmp (*this, rhs);
}
bool type_info::operator== (const type_info &rhs) const
{
return 0 == _RW::__rw_ticmp (*this, rhs);
}
bool type_info::operator!= (const type_info &rhs) const
{
return !(*this == rhs);
}
# endif // _MSC_VER
# ifndef _RWSTD_NO_RUNTIME_IN_STD
} // namespace std
# endif // _RWSTD_NO_RUNTIME_IN_STD
# endif // !_RWSTD_NO_STD_TYPEINFO || !_RWSTD_NO_GLOBAL_TYPEINFO
//**************************************************************************
// class bad_cast members
# ifndef _RWSTD_NO_STD_BAD_CAST
_RWSTD_NAMESPACE (std) {
# endif // _RWSTD_NO_STD_BAD_CAST
# ifdef _RWSTD_NO_BAD_CAST_DEFAULT_CTOR
bad_cast::bad_cast () _THROWS (())
{
// empty
}
# endif // _RWSTD_NO_BAD_CAST_DEFAULT_CTOR
# ifdef _RWSTD_NO_BAD_CAST_COPY_CTOR
bad_cast::bad_cast (const bad_cast &rhs) _THROWS (())
: exception (rhs)
{
// empty
}
# endif // _RWSTD_NO_BAD_CAST_COPY_CTOR
# ifdef _RWSTD_NO_BAD_CAST_DTOR
bad_cast::~bad_cast () _THROWS (())
{
// empty
}
# endif // _RWSTD_NO_BAD_CAST_DTOR
# ifdef _RWSTD_NO_BAD_CAST_ASSIGNMENT
bad_cast&
bad_cast::operator= (const bad_cast &rhs) _THROWS (())
{
exception::operator= (rhs);
return *this;
}
# endif // _RWSTD_NO_BAD_CAST_ASSIGNMENT
# ifdef _RWSTD_NO_BAD_CAST_WHAT
const char* bad_cast::what () const _THROWS (())
{
return "bad_cast";
}
# endif // _RWSTD_NO_BAD_CAST_WHAT
# ifndef _RWSTD_NO_STD_BAD_CAST
} // namespace std
# endif // _RWSTD_NO_STD_BAD_CAST
//**************************************************************************
// class bad_typeid members
# ifndef _RWSTD_NO_STD_BAD_TYPEID
_RWSTD_NAMESPACE (std) {
# endif // _RWSTD_NO_STD_BAD_TYPEID
# ifdef _RWSTD_NO_BAD_TYPEID_DEFAULT_CTOR
bad_typeid::bad_typeid () _THROWS (())
{
// empty
}
# endif // _RWSTD_NO_BAD_TYPEID_DEFAULT_CTOR
# ifdef _RWSTD_NO_BAD_TYPEID_COPY_CTOR
bad_typeid::bad_typeid (const bad_typeid &rhs) _THROWS (())
: exception (rhs)
{
// empty
}
# endif // _RWSTD_NO_BAD_TYPEID_COPY_CTOR
# ifdef _RWSTD_NO_BAD_TYPEID_DTOR
bad_typeid::~bad_typeid () _THROWS (())
{
// empty
}
# endif // _RWSTD_NO_BAD_TYPEID_DTOR
# ifdef _RWSTD_NO_BAD_TYPEID_ASSIGNMENT
bad_typeid&
bad_typeid::operator= (const bad_typeid &rhs) _THROWS (())
{
exception::operator= (rhs);
return *this;
}
# endif // _RWSTD_NO_BAD_TYPEID_ASSIGNMENT
# ifdef _RWSTD_NO_BAD_TYPEID_WHAT
const char* bad_typeid::what () const _THROWS (())
{
return "bad_typeid";
}
# endif // _RWSTD_NO_BAD_TYPEID_WHAT
# ifndef _RWSTD_NO_STD_BAD_TYPEID
} // namespace std
# endif // _RWSTD_NO_STD_BAD_TYPEID
#endif // _RWSTD_TYPEINFO_INCLUDED