2 This test demonstrates director classes when the types are classes.
3 Shown are virtual function calls which use classes passed by:
7 as both parameters and return values.
8 The test also demonstrates directors used with:
11 Note: Methods with default parameters that call up from C++ cannot call
12 the overloaded C# methods, see DefaultParms method.
14 Expected output if PrintDebug enabled:
15 ------------ Start ------------
19 Base - FullyOverloaded(int 10)
20 Base - FullyOverloaded(bool 1)
21 Base - SemiOverloaded(int -678)
22 Base - SemiOverloaded(bool 1)
23 Base - DefaultParms(10, 2.2)
24 Base - DefaultParms(10, 1.1)
25 --------------------------------
26 Derived - Val(444.555)
27 Derived - Ref(444.555)
28 Derived - Ptr(444.555)
29 Derived - FullyOverloaded(int 10)
30 Derived - FullyOverloaded(bool 1)
31 Derived - SemiOverloaded(int -678)
32 Base - SemiOverloaded(bool 1)
33 Derived - DefaultParms(10, 2.2)
34 Derived - DefaultParms(10, 1.1)
35 --------------------------------
36 CSharpDerived - Val(444.555)
37 CSharpDerived - Ref(444.555)
38 CSharpDerived - Ptr(444.555)
39 CSharpDerived - FullyOverloaded(int 10)
40 CSharpDerived - FullyOverloaded(bool True)
41 CSharpDerived - SemiOverloaded(-678)
42 Base - SemiOverloaded(bool 1)
43 CSharpDerived - DefaultParms(10, 2.2)
44 CSharpDerived - DefaultParms(10, 1.1)
45 ------------ Finish ------------
50 namespace director_classesNamespace {
56 runme r = new runme();
62 if (director_classes.PrintDebug) Console.WriteLine("------------ Start ------------ ");
64 Caller myCaller = new Caller();
66 // test C++ base class
67 using (Base myBase = new Base(100.0))
69 makeCalls(myCaller, myBase);
72 if (director_classes.PrintDebug) Console.WriteLine("--------------------------------");
74 // test vanilla C++ wrapped derived class
75 using (Base myBase = new Derived(200.0))
77 makeCalls(myCaller, myBase);
80 if (director_classes.PrintDebug) Console.WriteLine("--------------------------------");
82 // test director / C# derived class
83 using (Base myBase = new CSharpDerived(300.0))
85 makeCalls(myCaller, myBase);
88 if (director_classes.PrintDebug) Console.WriteLine("------------ Finish ------------ ");
91 void makeCalls(Caller myCaller, Base myBase)
93 string NAMESPACE = "director_classesNamespace.";
96 DoubleHolder dh = new DoubleHolder(444.555);
98 // Class pointer, reference and pass by value tests
99 if (myCaller.ValCall(dh).val != dh.val) throw new Exception("failed");
100 if (myCaller.RefCall(dh).val != dh.val) throw new Exception("failed");
101 if (myCaller.PtrCall(dh).val != dh.val) throw new Exception("failed");
103 // Fully overloaded method test (all methods in base class are overloaded)
104 if (NAMESPACE + myCaller.FullyOverloadedCall(10) != myBase.GetType() + "::FullyOverloaded(int)") throw new Exception("failed");
105 if (NAMESPACE + myCaller.FullyOverloadedCall(true) != myBase.GetType() + "::FullyOverloaded(bool)") throw new Exception("failed");
107 // Semi overloaded method test (some methods in base class are overloaded)
108 if (NAMESPACE + myCaller.SemiOverloadedCall(-678) != myBase.GetType() + "::SemiOverloaded(int)") throw new Exception("failed");
109 if (myCaller.SemiOverloadedCall(true) != "Base" + "::SemiOverloaded(bool)") throw new Exception("failed");
111 // Default parameters methods test
112 if (NAMESPACE + myCaller.DefaultParmsCall(10, 2.2) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed");
113 if (myBase.GetType() == typeof(CSharpDerived)) { // special handling for C# derived classes, there is no way to do this any other way
114 if (NAMESPACE + myCaller.DefaultParmsCall(10) != myBase.GetType() + "::DefaultParms(int, double)") throw new Exception("failed");
116 if (NAMESPACE + myCaller.DefaultParmsCall(10) != myBase.GetType() + "::DefaultParms(int)") throw new Exception("failed");
123 public class CSharpDerived : Base
125 public CSharpDerived(double dd)
130 public override DoubleHolder Val(DoubleHolder x)
132 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - Val({0})", x.val);
135 public override DoubleHolder Ref(DoubleHolder x)
137 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - Ref({0})", x.val);
140 public override DoubleHolder Ptr(DoubleHolder x)
142 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - Ptr({0})", x.val);
145 public override String FullyOverloaded(int x)
147 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - FullyOverloaded(int {0})", x);
148 return "CSharpDerived::FullyOverloaded(int)";
150 public override String FullyOverloaded(bool x)
152 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - FullyOverloaded(bool {0})", x);
153 return "CSharpDerived::FullyOverloaded(bool)";
155 // Note no SemiOverloaded(bool x) method
156 public override String SemiOverloaded(int x)
158 String ret = "CSharpDerived::SemiOverloaded(int)";
159 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - SemiOverloaded({0})", x);
162 public override String DefaultParms(int x, double y)
164 String ret = "CSharpDerived::DefaultParms(int, double)";
165 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - DefaultParms({0}, {1})", x, y);
168 // Note the following method can never be called from unmanaged code.
169 // It is here only for code that calls it directly from managed code.
170 // But should always be defined to ensure behaviour is consistent
171 // independent of where DefaultParsms is called from (managed or unmanaged code).
172 // Note this method can never be called from unmanaged code
173 public override String DefaultParms(int x)
175 if (director_classes.PrintDebug) Console.WriteLine("CSharpDerived - DefaultParms({0})", x);
176 return DefaultParms(x, 1.1/*use C++ default here*/);