PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/trunk/Examples/test-suite/d/director_classes_runme.1.d

#
D | 168 lines | 86 code | 24 blank | 58 comment | 35 complexity | 04e12d9ed4853a19a4f769f6601f4cce MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
  1. /**
  2. * This test demonstrates director classes when the types are classes. Shown are
  3. * virtual function calls which use classes passed by
  4. * - Value
  5. * - Reference
  6. * - Pointer
  7. * as both parameters and return values
  8. *
  9. * The test also demonstrates directors used with:
  10. * - method overloading
  11. * - default parameters
  12. *
  13. * Note: Methods with default parameters that call up from C++ cannot call the
  14. * overloaded D methods, see DefaultParms method.
  15. * Expected output if PrintDebug enabled:
  16. * ------------ Start ------------
  17. * Base - Val(444.555)
  18. * Base - Ref(444.555)
  19. * Base - Ptr(444.555)
  20. * Base - FullyOverloaded(int 10)
  21. * Base - FullyOverloaded(bool 1)
  22. * Base - SemiOverloaded(int -678)
  23. * Base - SemiOverloaded(bool 1)
  24. * Base - DefaultParms(10, 2.2)
  25. * Base - DefaultParms(10, 1.1)
  26. * --------------------------------
  27. * Derived - Val(444.555)
  28. * Derived - Ref(444.555)
  29. * Derived - Ptr(444.555)
  30. * Derived - FullyOverloaded(int 10)
  31. * Derived - FullyOverloaded(bool 1)
  32. * Derived - SemiOverloaded(int -678)
  33. * Base - SemiOverloaded(bool 1)
  34. * Derived - DefaultParms(10, 2.2)
  35. * Derived - DefaultParms(10, 1.1)
  36. * --------------------------------
  37. * DDerived - Val(444.555)
  38. * DDerived - Ref(444.555)
  39. * DDerived - Ptr(444.555)
  40. * DDerived - FullyOverloaded(int 10)
  41. * DDerived - FullyOverloaded(bool True)
  42. * DDerived - SemiOverloaded(-678)
  43. * Base - SemiOverloaded(bool 1)
  44. * DDerived - DefaultParms(10, 2.2)
  45. * DDerived - DefaultParms(10, 1.1)
  46. * ------------ Finish ------------
  47. */
  48. module director_classes_runme;
  49. import tango.io.Stdout;
  50. import tango.text.Util;
  51. import director_classes.director_classes;
  52. import director_classes.Caller;
  53. import director_classes.Base;
  54. import director_classes.Derived;
  55. import director_classes.DoubleHolder;
  56. void main() {
  57. if (PrintDebug) Stdout.formatln("------------ Start ------------ ");
  58. auto myCaller = new Caller();
  59. // Test C++ base class.
  60. {
  61. scope myBase = new Base(100.0);
  62. makeCalls(myCaller, myBase);
  63. }
  64. if (PrintDebug) Stdout.formatln("--------------------------------");
  65. // Test vanilla C++ wrapped derived class.
  66. {
  67. scope myBase = new Derived(200.0);
  68. makeCalls(myCaller, myBase);
  69. }
  70. if (PrintDebug) Stdout.formatln("--------------------------------");
  71. // Test director / D derived class.
  72. {
  73. scope myBase = new DDerived(300.0);
  74. makeCalls(myCaller, myBase);
  75. }
  76. if (PrintDebug) Stdout.formatln("------------ Finish ------------ ");
  77. }
  78. void makeCalls(Caller myCaller, Base myBase) {
  79. char[] myBaseType = myBase.classinfo.name.split(".")[$-1];
  80. myCaller.set(myBase);
  81. DoubleHolder dh = new DoubleHolder(444.555);
  82. // Class pointer, reference and pass by value tests
  83. if (myCaller.ValCall(dh).val != dh.val) throw new Exception("[1] failed");
  84. if (myCaller.RefCall(dh).val != dh.val) throw new Exception("[2] failed");
  85. if (myCaller.PtrCall(dh).val != dh.val) throw new Exception("[3] failed");
  86. // Fully overloaded method test (all methods in base class are overloaded)
  87. if (myCaller.FullyOverloadedCall(10) != myBaseType ~ "::FullyOverloaded(int)") throw new Exception("[4] failed");
  88. if (myCaller.FullyOverloadedCall(true) != myBaseType ~ "::FullyOverloaded(bool)") throw new Exception("[5] failed");
  89. // Semi overloaded method test (some methods in base class are overloaded)
  90. if (myCaller.SemiOverloadedCall(-678) != myBaseType ~ "::SemiOverloaded(int)") throw new Exception("[6] failed");
  91. if (myCaller.SemiOverloadedCall(true) != "Base" ~ "::SemiOverloaded(bool)") throw new Exception("[7] failed");
  92. // Default parameters methods test
  93. if (myCaller.DefaultParmsCall(10, 2.2) != myBaseType ~ "::DefaultParms(int, double)") throw new Exception("[8] failed");
  94. if (myBase.classinfo == DDerived.classinfo) { // special handling for D derived classes, there is no way to do this any other way
  95. if (myCaller.DefaultParmsCall(10) != myBaseType ~ "::DefaultParms(int, double)") throw new Exception("[9] failed");
  96. } else {
  97. if (myCaller.DefaultParmsCall(10) != myBaseType ~ "::DefaultParms(int)") throw new Exception("[10] failed");
  98. }
  99. myCaller.reset();
  100. }
  101. public class DDerived : Base {
  102. public this(double dd) {
  103. super(dd);
  104. }
  105. public override DoubleHolder Val(DoubleHolder x) {
  106. if (PrintDebug) Stdout.formatln("DDerived - Val({0:d3})", x.val);
  107. return x;
  108. }
  109. public override DoubleHolder Ref(DoubleHolder x) {
  110. if (PrintDebug) Stdout.formatln("DDerived - Ref({0:d3})", x.val);
  111. return x;
  112. }
  113. public override DoubleHolder Ptr(DoubleHolder x) {
  114. if (PrintDebug) Stdout.formatln("DDerived - Ptr({0:d3})", x.val);
  115. return x;
  116. }
  117. public override char[] FullyOverloaded(int x) {
  118. if (PrintDebug) Stdout.formatln("DDerived - FullyOverloaded(int {0})", x);
  119. return "DDerived::FullyOverloaded(int)";
  120. }
  121. public override char[] FullyOverloaded(bool x) {
  122. if (PrintDebug) Stdout.formatln("DDerived - FullyOverloaded(bool {0})", x);
  123. return "DDerived::FullyOverloaded(bool)";
  124. }
  125. public override char[] SemiOverloaded(int x) {
  126. char[] ret = "DDerived::SemiOverloaded(int)";
  127. if (PrintDebug) Stdout.formatln("DDerived - SemiOverloaded({0})", x);
  128. return ret;
  129. }
  130. alias Base.SemiOverloaded SemiOverloaded; // Alias in SemiOverloaded(bool x).
  131. public override char[] DefaultParms(int x, double y) {
  132. char[] ret = "DDerived::DefaultParms(int, double)";
  133. if (PrintDebug) Stdout.formatln("DDerived - DefaultParms({0}, {1:d1})", x, y);
  134. return ret;
  135. }
  136. // This method will never be called from C++ code because the two-parameter
  137. // DefaultParams() has a default value for the second parameter there. It is
  138. // only here to ensure consistent behavior for calls from C++ and D code.
  139. public override char[] DefaultParms(int x) {
  140. if (PrintDebug) Stdout.formatln("DDerived - DefaultParms({0})", x);
  141. return DefaultParms(x, 1.1/*use C++ default here*/);
  142. }
  143. }