libcxxrt

git clone https://git.neptards.moe/neptards/libcxxrt.git
Log | Files | Refs | README | LICENSE

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 = &diamond;
     82 	Root *up = &diamond;
     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