1// RTTI support for -*- C++ -*- 2// Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002 3// Free Software Foundation 4// 5// This file is part of GNU CC. 6// 7// GNU CC is free software; you can redistribute it and/or modify 8// it under the terms of the GNU General Public License as published by 9// the Free Software Foundation; either version 2, or (at your option) 10// any later version. 11// 12// GNU CC is distributed in the hope that it will be useful, 13// but WITHOUT ANY WARRANTY; without even the implied warranty of 14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15// GNU General Public License for more details. 16// 17// You should have received a copy of the GNU General Public License 18// along with GNU CC; see the file COPYING. If not, write to 19// the Free Software Foundation, 59 Temple Place - Suite 330, 20// Boston, MA 02111-1307, USA. 21 22// As a special exception, you may use this file as part of a free software 23// library without restriction. Specifically, if other files instantiate 24// templates or use macros or inline functions from this file, or you compile 25// this file and link it with other files to produce an executable, this 26// file does not by itself cause the resulting executable to be covered by 27// the GNU General Public License. This exception does not however 28// invalidate any other reasons why the executable file might be covered by 29// the GNU General Public License. 30 31/** @file typeinfo 32 * This header provides RTTI support. 33 */ 34 35#ifndef __TYPEINFO__ 36#define __TYPEINFO__ 37 38#include <exception> 39 40extern "C++" { 41 42namespace __cxxabiv1 43{ 44 class __class_type_info; 45} // namespace __cxxabiv1 46 47#if !__GXX_WEAK__ 48 // If weak symbols are not supported, typeinfo names are not merged. 49 #define __GXX_MERGED_TYPEINFO_NAMES 0 50#else 51 // On platforms that support weak symbols, typeinfo names are merged. 52 #define __GXX_MERGED_TYPEINFO_NAMES 1 53#endif 54 55namespace std 56{ 57 /** 58 * @brief Part of RTTI. 59 * 60 * The @c type_info class describes type information generated by 61 * an implementation. 62 */ 63 class type_info 64 { 65 public: 66 /** Destructor. Being the first non-inline virtual function, this 67 * controls in which translation unit the vtable is emitted. The 68 * compiler makes use of that information to know where to emit 69 * the runtime-mandated type_info structures in the new-abi. */ 70 virtual ~type_info(); 71 72 private: 73 /// Assigning type_info is not supported. Made private. 74 type_info& operator=(const type_info&); 75 type_info(const type_info&); 76 77 protected: 78 const char *__name; 79 80 protected: 81 explicit type_info(const char *__n): __name(__n) { } 82 83 public: 84 // the public interface 85 /** Returns an @e implementation-defined byte string; this is not 86 * portable between compilers! */ 87 const char* name() const 88 { return __name; } 89 90#if !__GXX_MERGED_TYPEINFO_NAMES 91 bool before(const type_info& __arg) const; 92 // In old abi, or when weak symbols are not supported, there can 93 // be multiple instances of a type_info object for one 94 // type. Uniqueness must use the _name value, not object address. 95 bool operator==(const type_info& __arg) const; 96#else 97 /** Returns true if @c *this precedes @c __arg in the implementation's 98 * collation order. */ 99 // In new abi we can rely on type_info's NTBS being unique, 100 // and therefore address comparisons are sufficient. 101 bool before(const type_info& __arg) const 102 { return __name < __arg.__name; } 103 bool operator==(const type_info& __arg) const 104 { return __name == __arg.__name; } 105#endif 106 bool operator!=(const type_info& __arg) const 107 { return !operator==(__arg); } 108 109 // the internal interface 110 public: 111 // return true if this is a pointer type of some kind 112 virtual bool __is_pointer_p() const; 113 // return true if this is a function type 114 virtual bool __is_function_p() const; 115 116 // Try and catch a thrown type. Store an adjusted pointer to the 117 // caught type in THR_OBJ. If THR_TYPE is not a pointer type, then 118 // THR_OBJ points to the thrown object. If THR_TYPE is a pointer 119 // type, then THR_OBJ is the pointer itself. OUTER indicates the 120 // number of outer pointers, and whether they were const 121 // qualified. 122 virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj, 123 unsigned __outer) const; 124 125 // internally used during catch matching 126 virtual bool __do_upcast(const __cxxabiv1::__class_type_info *__target, 127 void **__obj_ptr) const; 128 }; 129 130 /** 131 * @brief Thrown during incorrect typecasting. 132 * 133 * If you attempt an invalid @c dynamic_cast expression, an instance of 134 * this class (or something derived from this class) is thrown. */ 135 class bad_cast : public exception 136 { 137 public: 138 bad_cast() throw() { } 139 // This declaration is not useless: 140 // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 141 virtual ~bad_cast() throw(); 142 }; 143 144 /** If you use a NULL pointer in a @c typeid expression, this is thrown. */ 145 class bad_typeid : public exception 146 { 147 public: 148 bad_typeid () throw() { } 149 // This declaration is not useless: 150 // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 151 virtual ~bad_typeid() throw(); 152 }; 153} // namespace std 154 155} // extern "C++" 156#endif 157