43 std::bad_cast::~bad_cast() throw() { }
44 std::bad_typeid::~bad_typeid() throw() { }
46 #if !__GXX_MERGED_TYPEINFO_NAMES
52 return (&arg ==
this) || (__builtin_strcmp (name (), arg.name ()) == 0);
61 __is_pointer_p ()
const
68 __is_function_p ()
const
75 __do_catch (
const type_info *thr_type,
void **,
unsigned)
const
77 return *
this == *thr_type;
82 __do_upcast (
const abi::__class_type_info *,
void **)
const
96 struct vtable_prefix {
97 ptrdiff_t whole_object;
98 const __class_type_info *whole_type;
102 template <
typename T>
104 adjust_pointer (
const void *base, ptrdiff_t offset)
106 return reinterpret_cast <
const T *>
107 (reinterpret_cast <
const char *> (base) + offset);
113 convert_to_base (
void const *addr,
bool is_virtual, ptrdiff_t offset)
117 const void *vtable = *static_cast <
const void *
const *> (addr);
119 offset = *adjust_pointer<ptrdiff_t> (vtable, offset);
122 return adjust_pointer<void> (addr, offset);
126 inline bool contained_p (__class_type_info::__sub_kind access_path)
128 return access_path >= __class_type_info::__contained_mask;
130 inline bool public_p (__class_type_info::__sub_kind access_path)
132 return access_path & __class_type_info::__contained_public_mask;
134 inline bool virtual_p (__class_type_info::__sub_kind access_path)
136 return (access_path & __class_type_info::__contained_virtual_mask);
138 inline bool contained_public_p (__class_type_info::__sub_kind access_path)
140 return ((access_path & __class_type_info::__contained_public)
141 == __class_type_info::__contained_public);
143 inline bool contained_nonpublic_p (__class_type_info::__sub_kind access_path)
145 return ((access_path & __class_type_info::__contained_public)
146 == __class_type_info::__contained_mask);
148 inline bool contained_nonvirtual_p (__class_type_info::__sub_kind access_path)
150 return ((access_path & (__class_type_info::__contained_mask
151 | __class_type_info::__contained_virtual_mask))
152 == __class_type_info::__contained_mask);
155 static const __class_type_info *
const nonvirtual_base_type =
156 static_cast <
const __class_type_info *> (0) + 1;
164 ~__class_type_info ()
167 __si_class_type_info::
168 ~__si_class_type_info ()
171 __vmi_class_type_info::
172 ~__vmi_class_type_info ()
188 :dst_ptr (NULL), part2dst (__unknown), src_details (d), base_type (NULL)
204 :dst_ptr (NULL), whole2dst (__unknown),
205 whole2src (__unknown), dst2src (__unknown),
206 whole_details (details_)
210 bool __class_type_info::
211 __do_catch (
const type_info *thr_type,
213 unsigned outer)
const
215 if (*
this == *thr_type)
220 return thr_type->__do_upcast (
this, thr_obj);
223 bool __class_type_info::
224 __do_upcast (
const __class_type_info *dst_type,
225 void **obj_ptr)
const
227 __upcast_result result (__vmi_class_type_info::__flags_unknown_mask);
229 __do_upcast (dst_type, *obj_ptr, result);
230 if (!contained_public_p (result.part2dst))
232 *obj_ptr = const_cast <
void *> (result.dst_ptr);
236 inline __class_type_info::__sub_kind __class_type_info::
237 __find_public_src (ptrdiff_t src2dst,
239 const __class_type_info *src_type,
240 const void *src_ptr)
const
243 return adjust_pointer <void> (obj_ptr, src2dst) == src_ptr
244 ? __contained_public : __not_contained;
246 return __not_contained;
247 return __do_find_public_src (src2dst, obj_ptr, src_type, src_ptr);
250 __class_type_info::__sub_kind __class_type_info::
251 __do_find_public_src (ptrdiff_t,
253 const __class_type_info *,
254 const void *src_ptr)
const
256 if (src_ptr == obj_ptr)
258 return __contained_public;
259 return __not_contained;
262 __class_type_info::__sub_kind __si_class_type_info::
263 __do_find_public_src (ptrdiff_t src2dst,
265 const __class_type_info *src_type,
266 const void *src_ptr)
const
268 if (src_ptr == obj_ptr && *
this == *src_type)
269 return __contained_public;
270 return __base_type->__do_find_public_src (src2dst, obj_ptr, src_type, src_ptr);
273 __class_type_info::__sub_kind __vmi_class_type_info::
274 __do_find_public_src (ptrdiff_t src2dst,
276 const __class_type_info *src_type,
277 const void *src_ptr)
const
279 if (obj_ptr == src_ptr && *
this == *src_type)
280 return __contained_public;
282 for (std::size_t
i = __base_count;
i--;)
284 if (!__base_info[
i].__is_public_p ())
287 const void *base = obj_ptr;
288 ptrdiff_t offset = __base_info[
i].__offset ();
289 bool is_virtual = __base_info[
i].__is_virtual_p ();
296 base = convert_to_base (base, is_virtual, offset);
298 __sub_kind base_kind = __base_info[
i].__base_type->__do_find_public_src
299 (src2dst, base, src_type, src_ptr);
300 if (contained_p (base_kind))
303 base_kind = __sub_kind (base_kind | __contained_virtual_mask);
308 return __not_contained;
311 bool __class_type_info::
312 __do_dyncast (ptrdiff_t,
313 __sub_kind access_path,
314 const __class_type_info *dst_type,
316 const __class_type_info *src_type,
318 __dyncast_result &__restrict result)
const
320 if (obj_ptr == src_ptr && *
this == *src_type)
324 result.whole2src = access_path;
327 if (*
this == *dst_type)
329 result.dst_ptr = obj_ptr;
330 result.whole2dst = access_path;
331 result.dst2src = __not_contained;
337 bool __si_class_type_info::
338 __do_dyncast (ptrdiff_t src2dst,
339 __sub_kind access_path,
340 const __class_type_info *dst_type,
342 const __class_type_info *src_type,
344 __dyncast_result &__restrict result)
const
346 if (*
this == *dst_type)
348 result.dst_ptr = obj_ptr;
349 result.whole2dst = access_path;
351 result.dst2src = adjust_pointer <void> (obj_ptr, src2dst) == src_ptr
352 ? __contained_public : __not_contained;
353 else if (src2dst == -2)
354 result.dst2src = __not_contained;
357 if (obj_ptr == src_ptr && *
this == *src_type)
361 result.whole2src = access_path;
364 return __base_type->__do_dyncast (src2dst, access_path, dst_type, obj_ptr,
365 src_type, src_ptr, result);
377 bool __vmi_class_type_info::
378 __do_dyncast (ptrdiff_t src2dst,
379 __sub_kind access_path,
380 const __class_type_info *dst_type,
382 const __class_type_info *src_type,
384 __dyncast_result &__restrict result)
const
386 if (result.whole_details & __flags_unknown_mask)
387 result.whole_details = __flags;
389 if (obj_ptr == src_ptr && *
this == *src_type)
393 result.whole2src = access_path;
396 if (*
this == *dst_type)
398 result.dst_ptr = obj_ptr;
399 result.whole2dst = access_path;
401 result.dst2src = adjust_pointer <void> (obj_ptr, src2dst) == src_ptr
402 ? __contained_public : __not_contained;
403 else if (src2dst == -2)
404 result.dst2src = __not_contained;
408 bool result_ambig =
false;
409 for (std::size_t
i = __base_count;
i--;)
411 __dyncast_result result2 (result.whole_details);
412 void const *base = obj_ptr;
413 __sub_kind base_access = access_path;
414 ptrdiff_t offset = __base_info[
i].__offset ();
415 bool is_virtual = __base_info[
i].__is_virtual_p ();
418 base_access = __sub_kind (base_access | __contained_virtual_mask);
419 base = convert_to_base (base, is_virtual, offset);
421 if (!__base_info[
i].__is_public_p ())
424 !(result.whole_details
425 & (__non_diamond_repeat_mask | __diamond_shaped_mask)))
431 base_access = __sub_kind (base_access & ~__contained_public_mask);
435 = __base_info[
i].__base_type->__do_dyncast (src2dst, base_access,
437 src_type, src_ptr, result2);
438 result.whole2src = __sub_kind (result.whole2src | result2.whole2src);
439 if (result2.dst2src == __contained_public
440 || result2.dst2src == __contained_ambig)
442 result.dst_ptr = result2.dst_ptr;
443 result.whole2dst = result2.whole2dst;
444 result.dst2src = result2.dst2src;
447 return result2_ambig;
450 if (!result_ambig && !result.dst_ptr)
453 result.dst_ptr = result2.dst_ptr;
454 result.whole2dst = result2.whole2dst;
455 result_ambig = result2_ambig;
456 if (result.dst_ptr && result.whole2src != __unknown
457 && !(__flags & __non_diamond_repeat_mask))
461 else if (result.dst_ptr && result.dst_ptr == result2.dst_ptr)
466 __sub_kind (result.whole2dst | result2.whole2dst);
468 else if ((result.dst_ptr != 0 & result2.dst_ptr != 0)
469 || (result.dst_ptr != 0 & result2_ambig)
470 || (result2.dst_ptr != 0 & result_ambig))
480 __sub_kind new_sub_kind = result2.dst2src;
481 __sub_kind old_sub_kind = result.dst2src;
483 if (contained_p (result.whole2src)
484 && (!virtual_p (result.whole2src)
485 || !(result.whole_details & __diamond_shaped_mask)))
491 if (old_sub_kind == __unknown)
492 old_sub_kind = __not_contained;
493 if (new_sub_kind == __unknown)
494 new_sub_kind = __not_contained;
498 if (old_sub_kind >= __not_contained)
500 else if (contained_p (new_sub_kind)
501 && (!virtual_p (new_sub_kind)
502 || !(__flags & __diamond_shaped_mask)))
505 old_sub_kind = __not_contained;
507 old_sub_kind = dst_type->__find_public_src
508 (src2dst, result.dst_ptr, src_type, src_ptr);
510 if (new_sub_kind >= __not_contained)
512 else if (contained_p (old_sub_kind)
513 && (!virtual_p (old_sub_kind)
514 || !(__flags & __diamond_shaped_mask)))
517 new_sub_kind = __not_contained;
519 new_sub_kind = dst_type->__find_public_src
520 (src2dst, result2.dst_ptr, src_type, src_ptr);
525 if (contained_p (__sub_kind (new_sub_kind ^ old_sub_kind)))
528 if (contained_p (new_sub_kind))
531 result.dst_ptr = result2.dst_ptr;
532 result.whole2dst = result2.whole2dst;
533 result_ambig =
false;
534 old_sub_kind = new_sub_kind;
536 result.dst2src = old_sub_kind;
537 if (public_p (result.dst2src))
539 if (!virtual_p (result.dst2src))
542 else if (contained_p (__sub_kind (new_sub_kind & old_sub_kind)))
545 result.dst_ptr = NULL;
546 result.dst2src = __contained_ambig;
554 result.dst_ptr = NULL;
555 result.dst2src = __not_contained;
560 if (result.whole2src == __contained_private)
570 bool __class_type_info::
571 __do_upcast (
const __class_type_info *dst,
const void *obj,
572 __upcast_result &__restrict result)
const
576 result.dst_ptr = obj;
577 result.base_type = nonvirtual_base_type;
578 result.part2dst = __contained_public;
584 bool __si_class_type_info::
585 __do_upcast (
const __class_type_info *dst,
const void *obj_ptr,
586 __upcast_result &__restrict result)
const
588 if (__class_type_info::__do_upcast (dst, obj_ptr, result))
591 return __base_type->__do_upcast (dst, obj_ptr, result);
594 bool __vmi_class_type_info::
595 __do_upcast (
const __class_type_info *dst,
const void *obj_ptr,
596 __upcast_result &__restrict result)
const
598 if (__class_type_info::__do_upcast (dst, obj_ptr, result))
601 int src_details = result.src_details;
602 if (src_details & __flags_unknown_mask)
603 src_details = __flags;
605 for (std::size_t
i = __base_count;
i--;)
607 __upcast_result result2 (src_details);
608 const void *base = obj_ptr;
609 ptrdiff_t offset = __base_info[
i].__offset ();
610 bool is_virtual = __base_info[
i].__is_virtual_p ();
611 bool is_public = __base_info[
i].__is_public_p ();
613 if (!is_public && !(src_details & __non_diamond_repeat_mask))
618 base = convert_to_base (base, is_virtual, offset);
620 if (__base_info[
i].__base_type->__do_upcast (dst, base, result2))
622 if (result2.base_type == nonvirtual_base_type && is_virtual)
623 result2.base_type = __base_info[
i].__base_type;
624 if (contained_p (result2.part2dst) && !is_public)
625 result2.part2dst = __sub_kind (result2.part2dst & ~__contained_public_mask);
627 if (!result.base_type)
630 if (!contained_p (result.part2dst))
633 if (result.part2dst & __contained_public_mask)
635 if (!(__flags & __non_diamond_repeat_mask))
640 if (!virtual_p (result.part2dst))
642 if (!(__flags & __diamond_shaped_mask))
646 else if (result.dst_ptr != result2.dst_ptr)
649 result.dst_ptr = NULL;
650 result.part2dst = __contained_ambig;
653 else if (result.dst_ptr)
657 = __sub_kind (result.part2dst | result2.part2dst);
663 if (result2.base_type == nonvirtual_base_type
664 || result.base_type == nonvirtual_base_type
665 || !(*result2.base_type == *result.base_type))
669 result.part2dst = __contained_ambig;
673 = __sub_kind (result.part2dst | result2.part2dst);
677 return result.part2dst != __unknown;
683 const __class_type_info *src_type,
684 const __class_type_info *dst_type,
687 const void *vtable = *static_cast <
const void *
const *> (src_ptr);
688 const vtable_prefix *prefix =
689 adjust_pointer <vtable_prefix> (vtable,
690 -offsetof (vtable_prefix, origin));
691 const void *whole_ptr =
692 adjust_pointer <void> (src_ptr, prefix->whole_object);
693 const __class_type_info *whole_type = prefix->whole_type;
696 whole_type->__do_dyncast (src2dst, __class_type_info::__contained_public,
697 dst_type, whole_ptr, src_type, src_ptr, result);
700 if (contained_public_p (result.
dst2src))
702 return const_cast <
void *> (result.
dst_ptr);
703 if (contained_public_p (__class_type_info::__sub_kind (result.
whole2src & result.
whole2dst)))
706 return const_cast <void *> (result.
dst_ptr);
707 if (contained_nonvirtual_p (result.
whole2src))
712 if (result.
dst2src == __class_type_info::__unknown)
713 result.
dst2src = dst_type->__find_public_src (src2dst, result.
dst_ptr,
715 if (contained_public_p (result.
dst2src))
717 return const_cast <
void *> (result.
dst_ptr);
void * __dynamic_cast(const void *src_ptr, const __class_type_info *src_type, const __class_type_info *dst_type, ptrdiff_t src2dst)
__dyncast_result(int details_=__vmi_class_type_info::__flags_unknown_mask)
bool operator==(const GaudiUtils::Allocator< T1 > &, const GaudiUtils::Allocator< T2 > &)
const __class_type_info * base_type