Download Reference Manual
The Developer's Library for D
About Wiki Forums Source Search Contact

Ticket #865: testapp.d

File testapp.d, 2.0 kB (added by sean, 9 months ago)
Line 
1 import tango.sys.Process;
2 import tango.io.model.IBuffer;
3 import tango.stdc.stdio;
4
5
6 void main()
7 {
8     auto foo = new Process( "echo blah", null );
9     foo.execute;
10     auto obj = foo.stdout;
11     auto ci  = obj.classinfo;
12
13     printf( "\nSupported interfaces:\n\n" );
14     do
15     {
16         for( int i = 0; i < ci.interfaces.length; ++i )
17         {
18             auto p = ci.interfaces[i];
19             if( p != p.init )
20                 printf( "%.*s\n", p.classinfo.name );
21             else
22                 printf( "{null}\n" );
23         }
24         ci = ci.base;
25     } while( ci );
26     printf( "\nAttempted cast:\n\n" );
27     d_dynamic_cast( obj, Buffered.classinfo );
28 }
29
30
31 Object d_dynamic_cast(Object o, ClassInfo c)
32 {   ClassInfo oc;
33     size_t offset = 0;
34
35     printf("_d_dynamic_cast(o = %p, c = '%.*s')\n", o, c.name);
36
37     if (o)
38     {
39         oc = o.classinfo;
40         if (d_isbaseof2(oc, c, offset))
41         {
42             printf("\toffset = %d\n", offset);
43             o = cast(Object)(cast(void*)o + offset);
44         }
45         else
46             o = null;
47     }
48     printf("\tresult = %p\n", o);
49     return o;
50 }
51
52
53 int d_isbaseof2(ClassInfo oc, ClassInfo c, inout size_t offset)
54 {   int i;
55
56     if (oc is c)
57         return 1;
58     do
59     {
60         printf( "oc: %.*s\n", oc.name );
61
62         if (oc.base is c)
63             return 1;
64         for (i = 0; i < oc.interfaces.length; i++)
65         {
66             ClassInfo ic;
67
68             ic = oc.interfaces[i].classinfo;
69             if (ic is c)
70             {   offset = oc.interfaces[i].offset;
71                 return 1;
72             }
73         }
74         for (i = 0; i < oc.interfaces.length; i++)
75         {
76             ClassInfo ic;
77
78             ic = oc.interfaces[i].classinfo;
79             if (d_isbaseof2(ic, c, offset))
80             {   offset = oc.interfaces[i].offset;
81                 return 1;
82             }
83         }
84         oc = oc.base;
85     } while (oc);
86     return 0;
87 }