]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libcxxrt/typeinfo.h
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / libcxxrt / typeinfo.h
1 /* 
2  * Copyright 2010-2011 PathScale, Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice,
8  *    this list of conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  * 
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
15  * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include <stddef.h>
28 #include "abi_namespace.h"
29
30 namespace ABI_NAMESPACE
31 {
32         struct __class_type_info;
33 }
34 namespace std
35 {
36         /**
37           * Standard type info class.  The layout of this class is specified by the
38           * ABI.  The layout of the vtable is not, but is intended to be
39           * compatible with the GNU ABI.
40           *
41           * Unlike the GNU version, the vtable layout is considered semi-private.
42           */
43         class type_info
44         {
45                 public:
46                 /**
47                  * Virtual destructor.  This class must have one virtual function to
48                  * ensure that it has a vtable.
49                  */
50                 virtual ~type_info();
51                 bool operator==(const type_info &) const;
52                 bool operator!=(const type_info &) const;
53                 bool before(const type_info &) const;
54                 const char* name() const;
55                 type_info();
56                 private:
57                 type_info(const type_info& rhs);
58                 type_info& operator= (const type_info& rhs);
59                 const char *__type_name;
60                 /*
61                  * The following functions are in this order to match the
62                  * vtable layout of libsupc++.  This allows libcxxrt to be used
63                  * with libraries that depend on this.
64                  *
65                  * These functions are in the public headers for libstdc++, so
66                  * we have to assume that someone will probably call them and
67                  * expect them to work.  Their names must also match the names used in
68                  * libsupc++, so that code linking against this library can subclass
69                  * type_info and correctly fill in the values in the vtables.
70                  */
71                 public:
72                 /**
73                  * Returns true if this is some pointer type, false otherwise.
74                  */
75                 virtual bool __is_pointer_p() const { return false; }
76                 /**
77                  * Returns true if this is some function type, false otherwise.
78                  */
79                 virtual bool __is_function_p() const { return false; }
80                 /**
81                  * Catch function.  Allows external libraries to implement
82                  * their own basic types.  This is used, for example, in the
83                  * GNUstep Objective-C runtime to allow Objective-C types to be
84                  * caught in G++ catch blocks.
85                  *
86                  * The outer parameter indicates the number of outer pointers
87                  * in the high bits.  The low bit indicates whether the
88                  * pointers are const qualified.
89                  */
90                 virtual bool __do_catch(const type_info *thrown_type,
91                                         void **thrown_object,
92                                         unsigned outer) const;
93                 /**
94                  * Performs an upcast.  This is used in exception handling to
95                  * cast from subclasses to superclasses.  If the upcast is
96                  * possible, it returns true and adjusts the pointer.  If the
97                  * upcast is not possible, it returns false and does not adjust
98                  * the pointer.
99                  */
100                 virtual bool __do_upcast(
101                                 const ABI_NAMESPACE::__class_type_info *target,
102                                 void **thrown_object) const
103                 {
104                         return false;
105                 }
106         };
107 }
108
109
110 namespace ABI_NAMESPACE
111 {
112         /**
113          * Primitive type info, for intrinsic types.
114          */
115         struct __fundamental_type_info : public std::type_info
116         {
117                 virtual ~__fundamental_type_info();
118         };
119         /**
120          * Type info for arrays.  
121          */
122         struct __array_type_info : public std::type_info
123         {
124                 virtual ~__array_type_info();
125         };
126         /**
127          * Type info for functions.
128          */
129         struct __function_type_info : public std::type_info
130         {
131                 virtual ~__function_type_info();
132                 virtual bool __is_function_p() const { return true; }
133         };
134         /**
135          * Type info for enums.
136          */
137         struct __enum_type_info : public std::type_info
138         {
139                 virtual ~__enum_type_info();
140         };
141
142         /**
143          * Base class for class type info.  Used only for tentative definitions.
144          */
145         struct __class_type_info : public std::type_info
146         {
147                 virtual ~__class_type_info();
148                 /**
149                  * Function implementing dynamic casts.
150                  */
151                 virtual void *cast_to(void *obj, const struct __class_type_info *other) const;
152                 virtual bool __do_upcast(const __class_type_info *target,
153                                        void **thrown_object) const
154                 {
155                         return this == target;
156                 }
157         };
158
159         /**
160          * Single-inheritance class type info.  This is used for classes containing
161          * a single non-virtual base class at offset 0.
162          */
163         struct __si_class_type_info : public __class_type_info
164         {
165                 virtual ~__si_class_type_info();
166                 const __class_type_info *__base_type;
167                 virtual bool __do_upcast(
168                                 const ABI_NAMESPACE::__class_type_info *target,
169                                 void **thrown_object) const;
170                 virtual void *cast_to(void *obj, const struct __class_type_info *other) const;
171         };
172
173         /**
174          * Type info for base classes.  Classes with multiple bases store an array
175          * of these, one for each superclass.
176          */
177         struct __base_class_type_info
178         {
179                 const __class_type_info *__base_type;
180                 private:
181                         /**
182                          * The high __offset_shift bits of this store the (signed) offset
183                          * of the base class.  The low bits store flags from
184                          * __offset_flags_masks.
185                          */
186                         long __offset_flags;
187                         /**
188                          * Flags used in the low bits of __offset_flags.
189                          */
190                         enum __offset_flags_masks
191                         {
192                                 /** This base class is virtual. */
193                                 __virtual_mask = 0x1,
194                                 /** This base class is public. */
195                                 __public_mask = 0x2,
196                                 /** The number of bits reserved for flags. */
197                                 __offset_shift = 8
198                         };
199                 public:
200                         /**
201                          * Returns the offset of the base class.
202                          */
203                         long offset() const
204                         {
205                                 return __offset_flags >> __offset_shift;
206                         }
207                         /**
208                          * Returns the flags.
209                          */
210                         long flags() const
211                         {
212                                 return __offset_flags & ((1 << __offset_shift) - 1);
213                         }
214                         /**
215                          * Returns whether this is a public base class.
216                          */
217                         bool isPublic() const { return flags() & __public_mask; }
218                         /**
219                          * Returns whether this is a virtual base class.
220                          */
221                         bool isVirtual() const { return flags() & __virtual_mask; }
222         };
223
224         /**
225          * Type info for classes with virtual bases or multiple superclasses.
226          */
227         struct __vmi_class_type_info : public __class_type_info
228         {
229                 virtual ~__vmi_class_type_info();
230                 /** Flags describing this class.  Contains values from __flags_masks. */
231                 unsigned int __flags;
232                 /** The number of base classes. */
233                 unsigned int __base_count;
234                 /** 
235                  * Array of base classes - this actually has __base_count elements, not
236                  * 1.
237                  */
238                 __base_class_type_info __base_info[1];
239
240                 /**
241                  * Flags used in the __flags field.
242                  */
243                 enum __flags_masks
244                 {
245                         /** The class has non-diamond repeated inheritance. */
246                         __non_diamond_repeat_mask = 0x1,
247                         /** The class is diamond shaped. */
248                         __diamond_shaped_mask = 0x2
249                 };
250                 virtual bool __do_upcast(
251                                 const ABI_NAMESPACE::__class_type_info *target,
252                                 void **thrown_object) const;
253                 virtual void *cast_to(void *obj, const struct __class_type_info *other) const;
254         };
255
256         /**
257          * Base class used for both pointer and pointer-to-member type info.
258          */
259         struct __pbase_type_info : public std::type_info
260         {
261                 virtual ~__pbase_type_info();
262                 /**
263                  * Flags.  Values from __masks.
264                  */
265                 unsigned int __flags;
266                 /**
267                  * The type info for the pointee.
268                  */
269                 const std::type_info *__pointee;
270
271                 /**
272                  * Masks used for qualifiers on the pointer.
273                  */
274                 enum __masks
275                 {
276                         /** Pointer has const qualifier. */
277                         __const_mask = 0x1,
278                         /** Pointer has volatile qualifier. */
279                         __volatile_mask = 0x2,
280                         /** Pointer has restrict qualifier. */
281                         __restrict_mask = 0x4,
282                         /** Pointer points to an incomplete type. */
283                         __incomplete_mask = 0x8,
284                         /** Pointer is a pointer to a member of an incomplete class. */
285                         __incomplete_class_mask = 0x10
286                 };
287                 virtual bool __do_catch(const type_info *thrown_type,
288                                         void **thrown_object,
289                                         unsigned outer) const;
290         };
291
292         /**
293          * Pointer type info.
294          */
295         struct __pointer_type_info : public __pbase_type_info
296         {
297                 virtual ~__pointer_type_info();
298                 virtual bool __is_pointer_p() const { return true; }
299         };
300
301         /**
302          * Pointer to member type info.
303          */
304         struct __pointer_to_member_type_info : public __pbase_type_info
305         {
306                 virtual ~__pointer_to_member_type_info();
307                 /**
308                  * Pointer to the class containing this member.
309                  */
310                 const __class_type_info *__context;
311         };
312
313 }