diff --git a/Examples/test-suite/java/virtual_poly_runme.java b/Examples/test-suite/java/virtual_poly_runme.java index 12ca4a2e3..81e2f398a 100644 --- a/Examples/test-suite/java/virtual_poly_runme.java +++ b/Examples/test-suite/java/virtual_poly_runme.java @@ -37,5 +37,25 @@ public class virtual_poly_runme { virtual_poly.incr(ic); if ( (i.get() + 1) != ic.get() ) throw new RuntimeException("incr test failed"); + + // + // Checking a pure user downcast + // + NNumber n1 = d.copy(); + NNumber n2 = d.nnumber(); + NDouble dn1 = NDouble.narrow(n1); + NDouble dn2 = NDouble.narrow(n2); + + if ( (dn1.get()) != dn2.get() ) + throw new RuntimeException("copy/narrow test failed"); + + // + // Checking the ref polymorphic case + // + NNumber nr = d.ref_this(); + NDouble dr1 = NDouble.narrow(nr); + NDouble dr2 = (NDouble)d.ref_this(); + if ( dr1.get() != dr2.get() ) + throw new RuntimeException("copy/narrow test failed"); } } diff --git a/Examples/test-suite/python/virtual_poly_runme.py b/Examples/test-suite/python/virtual_poly_runme.py index d2b8de65e..7e202f9cf 100644 --- a/Examples/test-suite/python/virtual_poly_runme.py +++ b/Examples/test-suite/python/virtual_poly_runme.py @@ -21,6 +21,10 @@ if (i.get() + 1) != ic.get(): raise RuntimeError +dr = d.ref_this() +if d.get() != dr.get(): + raise RuntimeError + # # 'narrowing' also works diff --git a/Examples/test-suite/virtual_poly.i b/Examples/test-suite/virtual_poly.i index 1ccb6816e..baf5a532b 100644 --- a/Examples/test-suite/virtual_poly.i +++ b/Examples/test-suite/virtual_poly.i @@ -16,12 +16,18 @@ { virtual ~NNumber() {}; virtual NNumber* copy() const = 0; + virtual NNumber& ref_this() + { + return *this; + } + NNumber* nnumber() { return this; } + }; /* @@ -57,8 +63,14 @@ return new NInt(val); } + virtual NInt& ref_this() + { + return *this; + } + /* See below */ static NInt* narrow(NNumber* nn); + private: int val; @@ -85,6 +97,11 @@ return new NDouble(val); } + virtual NDouble& ref_this() + { + return *this; + } + /* See below */ static NDouble* narrow(NNumber* nn);