From 3ce7867a0a2e9349b1c6a1c20eb2cec3d566d7d2 Mon Sep 17 00:00:00 2001 From: Lindley French Date: Mon, 4 May 2015 15:27:51 -0700 Subject: [PATCH] Added missing untracked files. --- Examples/test-suite/director_ref.i | 82 +++++++++++++++++++ .../test-suite/java/director_ref_runme.java | 71 ++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 Examples/test-suite/director_ref.i create mode 100644 Examples/test-suite/java/director_ref_runme.java diff --git a/Examples/test-suite/director_ref.i b/Examples/test-suite/director_ref.i new file mode 100644 index 000000000..8bb8a9b63 --- /dev/null +++ b/Examples/test-suite/director_ref.i @@ -0,0 +1,82 @@ +%module(directors="1") director_ref + +%{ +#include + +class Foo { +public: + Foo(int i = -1) : count(0) {} + virtual void OnDelete() {} + virtual ~Foo() {} + virtual std::string Msg(std::string msg = "default") { return "Foo-" + msg; } + + std::string GetMsg() { return Msg(); } + std::string GetMsg(std::string msg) { return Msg(msg); } + + void Ref() { ++count; } + void Unref() { --count; if (count == 0) { OnDelete(); delete this; } } + int GetRefCount() { return count; } +private: + int count; +}; + +class FooPtr { +public: + FooPtr(Foo* f = NULL) : my_f(f) { if (my_f) { my_f->Ref(); } } + ~FooPtr() { if (my_f) { my_f->Unref(); } } + void Reset(Foo* f = NULL) { + if (f) { f->Ref(); } + if (my_f) { my_f->Unref(); } + my_f = f; + } + int GetOwnedRefCount() { + if (my_f) { return my_f->GetRefCount(); } + return 0; + } + +private: + Foo* my_f; +}; + +%} + +%include + +%feature("director") Foo; +%feature("ref") Foo "$this->Ref();" +%feature("unref") Foo "$this->Unref();" + +class Foo { +public: + Foo(int i = -1) : count(0) {} + virtual void OnDelete() {} + virtual ~Foo() {} + virtual std::string Msg(std::string msg = "default") { return "Foo-" + msg; } + + std::string GetMsg() { return Msg(); } + std::string GetMsg(std::string msg) { return Msg(msg); } + + void Ref() { ++count; } + void Unref() { --count; if (count == 0) { OnDelete(); delete this; } } + int GetRefCount() { return count; } +private: + int count; +}; + +class FooPtr { +public: + FooPtr(Foo* f = NULL) : my_f(f) { if (my_f) { my_f->Ref(); } } + ~FooPtr() { if (my_f) { my_f->Unref(); } } + void Reset(Foo* f = NULL) { + if (f) { f->Ref(); } + if (my_f) { my_f->Unref(); } + my_f = f; + } + int GetOwnedRefCount() { + if (my_f) { return my_f->GetRefCount(); } + return 0; + } + +private: + Foo* my_f; +}; diff --git a/Examples/test-suite/java/director_ref_runme.java b/Examples/test-suite/java/director_ref_runme.java new file mode 100644 index 000000000..1f85a6698 --- /dev/null +++ b/Examples/test-suite/java/director_ref_runme.java @@ -0,0 +1,71 @@ + +import director_ref.*; + +public class director_ref_runme { + + static { + try { + System.loadLibrary("director_ref"); + } 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[]) { + director_ref_MyFoo a = new director_ref_MyFoo(); + if (a.GetRefCount() != 1) { + throw new RuntimeException ( "Refcount test 1 failed." ); + } + + // Make sure director logic still works. + if (!a.GetMsg().equals("director_ref_MyFoo-default")) { + throw new RuntimeException ( "Test 1 failed" ); + } + if (!a.GetMsg("boo").equals("director_ref_MyFoo-boo")) { + throw new RuntimeException ( "Test 2 failed" ); + } + + a.delete(); // should delete the object. + if (a.cppDeleted != true) { + throw new RuntimeException ( "Unref test 1 failed." ); + } + + a = new director_ref_MyFoo(); + FooPtr p = new FooPtr(a); + if (a.GetRefCount() != 2) { + throw new RuntimeException ( "Refcount test 2 failed." ); + } + a.delete(); // Shouldn't actually delete the underlying object + if (a.cppDeleted) { + throw new RuntimeException ( "Unref test 2 failed." ); + } + if (p.GetOwnedRefCount() != 1) { + throw new RuntimeException ( "Unref test 3 failed." ); + } + p.Reset(); // Now it should be deleted on the cpp side. + // We can't check cppDeleted because the director will stop + // working after a delete() call. + if (p.GetOwnedRefCount() != 0) { + throw new RuntimeException ( "Unref test 4 failed." ); + } + } +} + +class director_ref_MyFoo extends Foo { + public director_ref_MyFoo() { + super(); + } + public director_ref_MyFoo(int i) { + super(i); + } + public String Msg(String msg) { + return "director_ref_MyFoo-" + msg; + } + public void OnDelete() { + cppDeleted = true; + } + + public boolean cppDeleted = false; +} +