import director_classic.*; public class director_classic_runme { static { try { System.loadLibrary("director_classic"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); System.exit(1); } } public static void main(String argv[]) { { Person person = new Person(); check(person, "Person"); person.delete(); } { Person person = new Child(); check(person, "Child"); person.delete(); } { Person person = new GrandChild(); check(person, "GrandChild"); person.delete(); } { Person person = new TargetLangPerson(); check(person, "TargetLangPerson"); person.delete(); } { Person person = new TargetLangChild(); check(person, "TargetLangChild"); person.delete(); } { Person person = new TargetLangGrandChild(); check(person, "TargetLangGrandChild"); person.delete(); } // Semis - don't override id() in target language { Person person = new TargetLangSemiPerson(); check(person, "Person"); person.delete(); } { Person person = new TargetLangSemiChild(); check(person, "Child"); person.delete(); } { Person person = new TargetLangSemiGrandChild(); check(person, "GrandChild"); person.delete(); } // Orphans - don't override id() in C++ { Person person = new OrphanPerson(); check(person, "Person"); person.delete(); } { Person person = new OrphanChild(); check(person, "Child"); person.delete(); } { Person person = new TargetLangOrphanPerson(); check(person, "TargetLangOrphanPerson"); person.delete(); } { Person person = new TargetLangOrphanChild(); check(person, "TargetLangOrphanChild"); person.delete(); } // Duals - id() makes an upcall to the base id() { Person person = new TargetLangDualPerson(); check(person, "TargetLangDualPerson + Person"); person.delete(); } { Person person = new TargetLangDualChild(); check(person, "TargetLangDualChild + Child"); person.delete(); } { Person person = new TargetLangDualGrandChild(); check(person, "TargetLangDualGrandChild + GrandChild"); person.delete(); } // Mix Orphans and Duals { Person person = new TargetLangDualOrphanPerson(); check(person, "TargetLangDualOrphanPerson + Person"); person.delete(); } { Person person = new TargetLangDualOrphanChild(); check(person, "TargetLangDualOrphanChild + Child"); person.delete(); } } static void check(Person person, String expected) { String ret; // Normal target language polymorphic call ret = person.id(); if (debug) System.out.println(ret); if (!ret.equals(expected)) throw new RuntimeException("Failed. Received: " + ret + " Expected: " + expected); // Polymorphic call from C++ Caller caller = new Caller(); caller.setCallback(person); ret = caller.call(); if (debug) System.out.println(ret); if (!ret.equals(expected)) throw new RuntimeException("Failed. Received: " + ret + " Expected: " + expected); // Polymorphic call of object created in target language and passed to C++ and back again Person baseclass = caller.baseClass(); ret = baseclass.id(); if (debug) System.out.println(ret); if (!ret.equals(expected)) throw new RuntimeException("Failed. Received: " + ret + " Expected: " + expected); caller.resetCallback(); if (debug) System.out.println("----------------------------------------"); } static boolean debug = false; } class TargetLangPerson extends Person { public TargetLangPerson() { super(); } public String id() { String identifier = "TargetLangPerson"; return identifier; } } class TargetLangChild extends Child { public TargetLangChild() { super(); } public String id() { String identifier = "TargetLangChild"; return identifier; } } class TargetLangGrandChild extends GrandChild { public TargetLangGrandChild() { super(); } public String id() { String identifier = "TargetLangGrandChild"; return identifier; } } // Semis - don't override id() in target language class TargetLangSemiPerson extends Person { public TargetLangSemiPerson() { super(); } // No id() override } class TargetLangSemiChild extends Child { public TargetLangSemiChild() { super(); } // No id() override } class TargetLangSemiGrandChild extends GrandChild { public TargetLangSemiGrandChild() { super(); } // No id() override } // Orphans - don't override id() in C++ class TargetLangOrphanPerson extends OrphanPerson { public TargetLangOrphanPerson() { super(); } public String id() { String identifier = "TargetLangOrphanPerson"; return identifier; } } class TargetLangOrphanChild extends OrphanChild { public TargetLangOrphanChild() { super(); } public String id() { String identifier = "TargetLangOrphanChild"; return identifier; } } // Duals - id() makes an upcall to the base id() class TargetLangDualPerson extends Person { public TargetLangDualPerson() { super(); } public String id() { String identifier = "TargetLangDualPerson + " + super.id(); return identifier; } } class TargetLangDualChild extends Child { public TargetLangDualChild() { super(); } public String id() { String identifier = "TargetLangDualChild + " + super.id(); return identifier; } } class TargetLangDualGrandChild extends GrandChild { public TargetLangDualGrandChild() { super(); } public String id() { String identifier = "TargetLangDualGrandChild + " + super.id(); return identifier; } } // Mix Orphans and Duals class TargetLangDualOrphanPerson extends OrphanPerson { public TargetLangDualOrphanPerson() { super(); } public String id() { String identifier = "TargetLangDualOrphanPerson + " + super.id(); return identifier; } } class TargetLangDualOrphanChild extends OrphanChild { public TargetLangDualOrphanChild() { super(); } public String id() { String identifier = "TargetLangDualOrphanChild + " + super.id(); return identifier; } }