Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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.  
  40. extern "C++" {
  41.  
  42. namespace __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.  
  55. namespace 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.