summaryrefslogtreecommitdiff
path: root/src/typeinfo.h
diff options
context:
space:
mode:
authoranonymous <local@localhost>2010-06-27 17:13:07 +0000
committeranonymous <local@localhost>2010-06-27 17:13:07 +0000
commit7ca18cb7c08bf92db5946a66e312678c480eb819 (patch)
tree22dfcc5cf05ecad955cd15d9feb952f204a4b32b /src/typeinfo.h
downloadlibcxxrt-7ca18cb7c08bf92db5946a66e312678c480eb819.tar.gz
libcxxrt-7ca18cb7c08bf92db5946a66e312678c480eb819.tar.bz2
libcxxrt-7ca18cb7c08bf92db5946a66e312678c480eb819.tar.xz
Initial import.
Diffstat (limited to 'src/typeinfo.h')
-rw-r--r--src/typeinfo.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/typeinfo.h b/src/typeinfo.h
new file mode 100644
index 0000000..f8b6079
--- /dev/null
+++ b/src/typeinfo.h
@@ -0,0 +1,108 @@
+#include <stddef.h>
+#include "abi_namespace.h"
+#include "typeinfo"
+
+namespace ABI_NAMESPACE
+{
+ // Primitive type info
+ struct __fundamental_type_info : public std::type_info
+ {
+ virtual ~__fundamental_type_info();
+ };
+ struct __array_type_info : public std::type_info
+ {
+ virtual ~__array_type_info();
+ };
+ struct __function_type_info : public std::type_info
+ {
+ virtual ~__function_type_info();
+ };
+ struct __enum_type_info : public std::type_info
+ {
+ virtual ~__enum_type_info();
+ };
+
+ // Base class for class type info. Used only for tentative definitions.
+ struct __class_type_info : public std::type_info
+ {
+ virtual ~__class_type_info();
+ virtual void *cast_to(void *obj, const struct __class_type_info *other) const;
+ };
+
+ // Single-inheritance class.
+ struct __si_class_type_info : public __class_type_info
+ {
+ virtual ~__si_class_type_info();
+ const __class_type_info *__base_type;
+ virtual void *cast_to(void *obj, const struct __class_type_info *other) const;
+ };
+
+ struct __base_class_type_info
+ {
+ const __class_type_info *__base_type;
+ private:
+ long __offset_flags;
+
+ enum __offset_flags_masks
+ {
+ __virtual_mask = 0x1,
+ __public_mask = 0x2,
+ __offset_shift = 8
+ };
+ public:
+ long offset() const
+ {
+ return __offset_flags >> __offset_shift;
+ }
+ long flags() const
+ {
+ return __offset_flags & ((1 << __offset_shift) - 1);
+ }
+ bool isPublic() const { return flags() & __public_mask; }
+ bool isVirtual() const { return flags() & __virtual_mask; }
+ };
+
+
+ struct __vmi_class_type_info : public __class_type_info
+ {
+ virtual ~__vmi_class_type_info();
+ unsigned int __flags;
+ unsigned int __base_count;
+ __base_class_type_info __base_info[1];
+
+ enum __flags_masks
+ {
+ __non_diamond_repeat_mask = 0x1,
+ __diamond_shaped_mask = 0x2
+ };
+ virtual void *cast_to(void *obj, const struct __class_type_info *other) const;
+ };
+
+ struct __pbase_type_info : public std::type_info
+ {
+ virtual ~__pbase_type_info();
+ unsigned int __flags;
+ const std::type_info *__pointee;
+
+ enum __masks
+ {
+ __const_mask = 0x1,
+ __volatile_mask = 0x2,
+ __restrict_mask = 0x4,
+ __incomplete_mask = 0x8,
+ __incomplete_class_mask = 0x10
+ };
+ };
+
+ struct __pointer_type_info : public __pbase_type_info
+ {
+ virtual ~__pointer_type_info();
+ };
+
+ struct __pointer_to_member_type_info : public __pbase_type_info
+ {
+ virtual ~__pointer_to_member_type_info();
+ const __class_type_info *__context;
+ };
+
+}