usb: getting string descriptors, minor improvements
[quarnos.git] / manes / dyncast.cpp
blob34b7bdeef61bb0133e919b85f870ff210ff5d16f
1 /* Quarn OS
3 * dynamic_cast<>
5 * Copyright (C) 2009 Pawel Dziepak
7 * This program 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 of the License, or
10 * (at your option) any later version.
12 * This program 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.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include "manes/error.h"
24 #include "typeinfo"
26 typedef signed int ptrdiff_t;
27 using namespace __cxxabiv1;
28 typedef unsigned int cpu_word;
29 extern "C" void *__dynamic_cast(const void *src_ptr,
30 const __class_type_info *src_type,
31 const __class_type_info *dst_type,
32 ptrdiff_t src2dst) {
33 /* Get real source type information */
34 const int **src = (const int **)src_ptr;
35 const std::type_info *ti = (const std::type_info*)((*src)[-1]);
37 /* Get base */
38 void *pointer = (void*)src_ptr;
39 void *old_ptr = (void*)src_ptr;
41 if (!ti->__do_upcast(src_type, &old_ptr))
42 return (void*)0;
44 pointer = (void*)((cpu_word)pointer + (cpu_word)src_ptr - (cpu_word)old_ptr);
46 /* Upcast */
47 if (ti->__do_upcast(dst_type, &pointer))
48 return (void*)pointer;
49 else
50 return (void*)0;