// -*- C++ -*-
/***************************************************************************
 *
 * typeinfo - declarations for the C++ Standard Library RTTI support
 *
 * $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.
 * 
 **************************************************************************/

#ifndef _RWSTD_TYPEINFO_INCLUDED
#define _RWSTD_TYPEINFO_INCLUDED

#include <exception>
#include <rw/_defs.h>


#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


#ifndef _RWSTD_NO_NAMESPACE
#  if    defined (_RWSTD_EDG_ECCP) || defined (_RWSTD_SGI_MIPSPRO) \
      || defined (__DECCXX)
      // let EDG (and its derivatives) know about class type_info
      // do not use with Intel C++ on Linux or Windows
#    pragma define_type_info
#  endif   // EDG eccp || Compaq C++ || SGI MIPSpro
#endif   // _RWSTD_NO_NAMESPACE


// 18.5.1
class type_info
{
public:
    // individual members rather than the entire class exported
    // to prevent compiler errors (see PR #25603); this prevents
    // type_info virtuals from being overriden

    _RWSTD_EXPORT virtual ~type_info ();
    
    _RWSTD_EXPORT bool before (const type_info&) const;

    _RWSTD_EXPORT const char* name () const;

    _RWSTD_EXPORT bool operator== (const type_info&) const;

    _RWSTD_EXPORT bool operator!= (const type_info&) const;

protected:

    // prevent g++ warnings about private ctor and no friends
    explicit type_info (const char*);

private:

#ifdef __HP_aCC

    const char *_C_name;

#  ifndef _HP_IA64ABI

    void       *_C_baseClassTable;
    unsigned    _C_hashValue;

#  endif   // _HP_IA64ABI

#elif defined (__INTEL_COMPILER) && !defined (_MSC_VER)

    const char *_C_name;

#elif defined (__GNUG__)

    const char *_C_name;   // mangled name

#elif defined (_MSC_VER)

    void *_C_data;
    char  _C_name [1];

#elif defined (__SUNPRO_CC)

    const void *_C_data;

#elif defined (__IBMCPP__)

#  ifdef _RWSTD_OS_LINUX

    char *_C_name;   // mangled name (same as gcc libsupc++)

#  else   // not Linux

    char *_C_type_name;   // human readable name
    char *_C_name;        // mangled name

#  endif   // 

#else   // DEC cxx, SGI MIPSpro, SNI CDS++, and other EDG derivatives

    // no data

#endif

    type_info& operator= (const type_info&);   // undefined
    type_info (const type_info&);              // undefined
};


#ifndef _RWSTD_NO_STD_TYPE_INFO

}   // namespace std

#else   // if defined (_RWSTD_NO_STD_TYPE_INFO)
#  ifndef _RWSTD_NO_NAMESPACE

namespace std {

using ::type_info;

}   // namespace std

#  endif   // _RWSTD_NO_NAMESPACE
#endif   // _RWSTD_NO_STD_TYPE_INFO


#ifndef _RWSTD_NO_STD_BAD_CAST

_RWSTD_NAMESPACE (std) { 

#endif   // _RWSTD_NO_STD_BAD_CAST


// 18.5.2
class _RWSTD_EXPORT bad_cast: public _STD::exception
{
public:
    // 18.5.2, p2
    bad_cast () _THROWS (());

    // 18.5.2, p4
    bad_cast (const bad_cast&) _THROWS (());

    // 18.5.2, p4
    bad_cast& operator= (const bad_cast&) _THROWS (());

    virtual ~bad_cast() _THROWS (());

    // 18.5.2, p5
    virtual const char* what () const _THROWS (());
};

#ifndef _RWSTD_NO_STD_BAD_CAST

}   // namespace std

#else   // if defined (_RWSTD_NO_STD_BAD_CAST)
#  ifndef _RWSTD_NO_NAMESPACE

namespace std {

using ::bad_cast;

}   // namespace std

#  endif   // _RWSTD_NO_NAMESPACE
#endif   // _RWSTD_NO_STD_BAD_CAST


#ifndef _RWSTD_NO_STD_BAD_TYPEID

_RWSTD_NAMESPACE (std) {

#endif   // _RWSTD_NO_BAD_NO_TYPEID


// 18.5.3
class _RWSTD_EXPORT bad_typeid: public _STD::exception
{
public:
    // 18.5.3, p2
    bad_typeid () _THROWS (());

    // 18.5.3, p4
    bad_typeid (const bad_typeid &__rhs) _THROWS (());

    virtual ~bad_typeid () _THROWS (());

    // 18.5.3, p4
    bad_typeid& operator= (const bad_typeid &__rhs) _THROWS (());

    // 18.5.3, p5
    virtual const char* what () const _THROWS (());
};


#ifndef _RWSTD_NO_STD_BAD_TYPEID

}   // namespace std

#else   // if defined (_RWSTD_NO_STD_BAD_TYPEID)
#  ifndef _RWSTD_NO_NAMESPACE

namespace std {

using ::bad_typeid;

}   // namespace std

#  endif   // _RWSTD_NO_NAMESPACE
#endif   // _RWSTD_NO_STD_BAD_TYPEID



#endif   // _RWSTD_TYPEINFO_INCLUDED
