| /* |
| * Test Java director typemaps and features |
| */ |
| |
| %warnfilter(SWIGWARN_TYPEMAP_THREAD_UNSAFE,SWIGWARN_TYPEMAP_DIRECTOROUT_PTR); /* Thread/reentrant unsafe wrapping, consider returning by value instead. */ |
| |
| %module(directors="1") java_director |
| |
| %typemap(javafinalize) SWIGTYPE %{ |
| @SuppressWarnings({"deprecation", "removal"}) |
| protected void finalize() { |
| // System.out.println("Finalizing " + this); |
| delete(); |
| } |
| %} |
| |
| |
| %{ |
| #include <string> |
| #include <vector> |
| |
| class Quux { |
| public: |
| Quux() : memb_("default Quux ctor arg") {instances_++; } |
| Quux(const std::string &arg) : memb_(arg) {instances_++;} |
| Quux(const Quux &src) : memb_(src.memb_) {instances_++;} |
| virtual ~Quux() {instances_--;} |
| virtual const std::string &director_method() { return memb_; } |
| const std::string &member() { return memb_; } |
| static int instances() { return instances_; } |
| private: |
| static int instances_; |
| std::string memb_; |
| }; |
| |
| int Quux::instances_ = 0; |
| |
| class QuuxContainer { |
| protected: |
| typedef std::vector<Quux *> quuxvec_t; |
| public: |
| QuuxContainer() : quuxen_() |
| { } |
| ~QuuxContainer() { |
| for (quuxvec_t::iterator iter = quuxen_.begin(); iter != quuxen_.end(); ++iter) { |
| delete *iter; |
| } |
| quuxen_.clear(); |
| } |
| void push(Quux *elem) { |
| quuxen_.push_back(elem); |
| } |
| Quux *get(int idx) { |
| return quuxen_[idx]; |
| } |
| const std::string &invoke(int idx) { |
| return quuxen_[idx]->director_method(); |
| } |
| size_t size() { |
| return quuxen_.size(); |
| } |
| private: |
| quuxvec_t quuxen_; |
| }; |
| %} |
| |
| %include "std_string.i" |
| |
| %feature("director") Quux; |
| SWIG_DIRECTOR_OWNED(Quux) |
| |
| class Quux { |
| public: |
| Quux(); |
| Quux(const std::string &arg); |
| Quux(const Quux &src); |
| virtual ~Quux(); |
| virtual const std::string &director_method(); |
| const std::string &member(); |
| static int instances(); |
| }; |
| |
| class QuuxContainer { |
| public: |
| QuuxContainer(); |
| ~QuuxContainer(); |
| void push(Quux *elem); |
| Quux *get(int idx); |
| const std::string &invoke(int idx); |
| size_t size(); |
| }; |
| |
| |
| %feature("director"); |
| |
| %typemap(javacode) hi::Quux1 %{ |
| public boolean disconnectMethodCalled = false; |
| %} |
| |
| %typemap(directordisconnect, methodname="disconnect_director") hi::Quux1 %{ |
| public void $methodname() { |
| swigCMemOwn = false; |
| $jnicall; |
| // add in a flag to check this method is really called |
| disconnectMethodCalled = true; |
| } |
| %} |
| |
| %inline %{ |
| |
| namespace hi { |
| struct Quux1 : public Quux { |
| Quux1(const std::string& arg) : Quux(arg) {} |
| virtual int ff(int i = 0) {return i;} |
| }; |
| } |
| |
| struct JObjectTest { |
| virtual ~JObjectTest() {} |
| // Test special Java JNI type jobject |
| virtual jobject foo(jobject x) { return x; } |
| }; |
| |
| %} |
| |
| %javaexception("Exception") etest "$action" |
| %inline %{ |
| struct JavaExceptionTest { |
| virtual ~JavaExceptionTest() {} |
| virtual void etest() {} |
| }; |
| %} |
| |