test_typeinfo.cc (2458B)
1 #include "../src/typeinfo.h" 2 #include "test.h" 3 #include <stdio.h> 4 5 struct Virt1; 6 struct Virt2; 7 struct Diamond; 8 struct Virt1a; 9 struct Virt2a; 10 struct Diamond2; 11 12 struct Root 13 { 14 int test; 15 void * foo; 16 virtual Virt1 *as_v1() { return 0; } 17 virtual Virt2 *as_v2() { return 0; } 18 virtual Diamond *as_diamond() { return 0; } 19 virtual Virt1a *as_v1a() { return 0; } 20 virtual Virt2a *as_v2a() { return 0; } 21 virtual Diamond2 *as_diamond2() { return 0; } 22 }; 23 24 struct Sub1 : public Root 25 { 26 double a; 27 }; 28 29 struct Sub2 : public Sub1 30 { 31 float ignored; 32 }; 33 34 struct Virt1a : public virtual Root 35 { 36 int b; 37 virtual Virt1a *as_v1a() { return this; } 38 }; 39 40 struct Virt2a : public virtual Root 41 { 42 int b; 43 virtual Virt2a *as_v2a() { return this; } 44 }; 45 46 struct Virt1 : public virtual Virt1a 47 { 48 double a; 49 virtual Virt1 *as_v1() { return this; } 50 }; 51 52 struct Virt2 : public virtual Virt2a 53 { 54 double b; 55 virtual Virt2 *as_v2() { return this; } 56 }; 57 58 struct Diamond : public virtual Virt1, public virtual Virt2 59 { 60 int c; 61 virtual Diamond *as_diamond() { return this; } 62 }; 63 64 struct Diamond2 : public virtual Virt1a, public virtual Virt2a 65 { 66 int c; 67 virtual Diamond2 *as_diamond2() { return this; } 68 }; 69 70 void test_type_info(void) 71 { 72 Sub2 sub2; 73 Root root; 74 Virt1 virt1; 75 Diamond diamond; 76 Root *b = &sub2; 77 Root *f = &sub2; 78 Root *s2 = &sub2; 79 Root *b2 = &root; 80 Root *v1 = &virt1; 81 Virt1 *d1 = ⋄ 82 Root *up = ⋄ 83 b->test = 12; 84 f->test = 12; 85 b2->test = 12; 86 s2->test = 12; 87 TEST(12 == b->test, "Setting field"); 88 b = dynamic_cast<Root*>(f); 89 90 TEST(12 == b->test, "Casting Sub1 to superclass"); 91 ((Sub1*)(s2))->a = 12; 92 TEST(12 == dynamic_cast<Sub1*>(s2)->a, "Casting Sub2 -> Sub1"); 93 94 v1->as_v1()->a = 12; 95 TEST(12 == dynamic_cast<Virt1*>(v1)->a, "Casting Root (Virt1) -> Virt1"); 96 97 d1->as_v1()->test = 12; 98 TEST(12 == d1->as_v2()->test, "Accessing virt2 via vtable method"); 99 TEST(12 == dynamic_cast<Virt2*>(d1)->test, "Casting diamond to virt2"); 100 TEST(12 == dynamic_cast<Diamond*>(d1)->test, "casting diamond to diamond"); 101 102 Diamond2 diamond2; 103 Root *d2 = &diamond2; 104 d2->test = 12; 105 TEST(12 == dynamic_cast<Diamond2*>(d2)->test, "Casting Diamond2 to Diamond2"); 106 TEST(12 == dynamic_cast<Virt2a*>(d2)->test, "Casting Diamond2 to Virt2a"); 107 TEST(&diamond == dynamic_cast<Diamond*>(up), "Downcasting root-pointer to diamond"); 108 TEST(0 == dynamic_cast<Diamond*>(&root), "Downcasting root to diamond"); 109 110 TEST(0 == dynamic_cast<Sub1*>(b2), "Casting Root to Sub1 (0 expected)"); 111 } 112