diff --git a/Examples/go/callback/Makefile b/Examples/go/callback/Makefile deleted file mode 100644 index bf5275f14..000000000 --- a/Examples/go/callback/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -TOP = ../.. -SWIG = $(TOP)/../preinst-swig -CXXSRCS = callback.cxx -TARGET = example -INTERFACE = example.i -SWIGOPT = - -check: build - $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' go_run - -build: - $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' go_cpp - -clean: - $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' INTERFACE='$(INTERFACE)' go_clean diff --git a/Examples/go/callback/callback.cxx b/Examples/go/callback/callback.cxx deleted file mode 100644 index 450d75608..000000000 --- a/Examples/go/callback/callback.cxx +++ /dev/null @@ -1,4 +0,0 @@ -/* File : example.cxx */ - -#include "example.h" - diff --git a/Examples/go/callback/example.h b/Examples/go/callback/example.h deleted file mode 100644 index 1a0e8c432..000000000 --- a/Examples/go/callback/example.h +++ /dev/null @@ -1,23 +0,0 @@ -/* File : example.h */ - -#include -#include - -class Callback { -public: - virtual ~Callback() { std::cout << "Callback::~Callback()" << std:: endl; } - virtual void run() { std::cout << "Callback::run()" << std::endl; } -}; - - -class Caller { -private: - Callback *_callback; -public: - Caller(): _callback(0) {} - ~Caller() { delCallback(); } - void delCallback() { delete _callback; _callback = 0; } - void setCallback(Callback *cb) { delCallback(); _callback = cb; } - void call() { if (_callback) _callback->run(); } -}; - diff --git a/Examples/go/callback/example.i b/Examples/go/callback/example.i deleted file mode 100644 index cf61ef9d2..000000000 --- a/Examples/go/callback/example.i +++ /dev/null @@ -1,11 +0,0 @@ -/* File : example.i */ -%module(directors="1") example -%{ -#include "example.h" -%} - -/* turn on director wrapping Callback */ -%feature("director") Callback; - -%include "example.h" - diff --git a/Examples/go/callback/index.html b/Examples/go/callback/index.html deleted file mode 100644 index b053cf547..000000000 --- a/Examples/go/callback/index.html +++ /dev/null @@ -1,81 +0,0 @@ - - -SWIG:Examples:go:callback - - - - - -SWIG/Examples/go/callback/ -
- -

Implementing C++ callbacks in Go

- -

-This example illustrates how to use directors to implement C++ -callbacks in Go. -

- -

-Because Go and C++ use inheritance differently, you must call a -different function to create a class which uses callbacks. Instead of -calling the usual constructor function whose name is New -followed by the capitalized name of the class, you call a function -named NewDirector followed by the capitalized name of the -class. -

- -

-The first argument to the NewDirector function is an instance -of a type. The NewDirector function will return an interface -value as usual. However, when calling any method on the returned -value, the program will first check whether the value passed -to NewDirector implements that method. If it does, the -method will be called in Go. This is true whether the method is -called from Go code or C++ code. -

- -

-Note that the Go code will be called with just the Go value, not the -C++ value. If the Go code needs to call a C++ method on itself, you -need to get a copy of the C++ object. This is typically done as -follows: - -

-
-type Child struct { abi Parent }
-func (p *Child) ChildMethod() {
-	p.abi.ParentMethod()
-}
-func f() {
-	p := &Child{nil}
-	d := NewDirectorParent(p)
-	p.abi = d
-	...
-}
-
-
- -In other words, we first create the Go value. We pass that to -the NewDirector function to create the C++ value; this C++ -value will be created with an association to the Go value. We then -store the C++ value in the Go value, giving us the reverse -association. That permits us to call parent methods from the child. - -

- -

-To delete a director object, use the function DeleteDirector -followed by the capitalized name of the class. -

- -

-

- -
- - diff --git a/Examples/go/callback/runme.go b/Examples/go/callback/runme.go deleted file mode 100644 index 2eef77fdb..000000000 --- a/Examples/go/callback/runme.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - . "./example" - "fmt" -) - -func main() { - fmt.Println("Adding and calling a normal C++ callback") - fmt.Println("----------------------------------------") - - caller := NewCaller() - callback := NewCallback() - - caller.SetCallback(callback) - caller.Call() - caller.DelCallback() - - callback = NewDirectorCallback(new(GoCallback)) - - fmt.Println() - fmt.Println("Adding and calling a Go callback") - fmt.Println("------------------------------------") - - caller.SetCallback(callback) - caller.Call() - caller.DelCallback() - - // Test that a double delete does not occur as the object has - // already been deleted from the C++ layer. - DeleteDirectorCallback(callback) - - fmt.Println() - fmt.Println("Go exit") -} - -type GoCallback struct{} - -func (p *GoCallback) Run() { - fmt.Println("GoCallback.Run") -} diff --git a/Examples/go/check.list b/Examples/go/check.list index b3f34b306..25322352a 100644 --- a/Examples/go/check.list +++ b/Examples/go/check.list @@ -1,10 +1,8 @@ # see top-level Makefile.in -callback class constants director enum -extend funcptr multimap pointer diff --git a/Examples/go/extend/Makefile b/Examples/go/extend/Makefile deleted file mode 100644 index 290694210..000000000 --- a/Examples/go/extend/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -TOP = ../.. -SWIG = $(TOP)/../preinst-swig -CXXSRCS = extend.cxx -TARGET = example -INTERFACE = example.i -SWIGOPT = - -check: build - $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' go_run - -build: - $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' go_cpp - -clean: - $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' INTERFACE='$(INTERFACE)' go_clean diff --git a/Examples/go/extend/example.h b/Examples/go/extend/example.h deleted file mode 100644 index ca1aed28f..000000000 --- a/Examples/go/extend/example.h +++ /dev/null @@ -1,56 +0,0 @@ -/* File : example.h */ - -#include -#include -#include -#include -#include - -class Employee { -private: - std::string name; -public: - Employee(const char* n): name(n) {} - virtual std::string getTitle() { return getPosition() + " " + getName(); } - virtual std::string getName() { return name; } - virtual std::string getPosition() const { return "Employee"; } - virtual ~Employee() { printf("~Employee() @ %p\n", (void *)this); } -}; - - -class Manager: public Employee { -public: - Manager(const char* n): Employee(n) {} - virtual std::string getPosition() const { return "Manager"; } -}; - - -class EmployeeList { - std::vector list; -public: - EmployeeList() { - list.push_back(new Employee("Bob")); - list.push_back(new Employee("Jane")); - list.push_back(new Manager("Ted")); - } - void addEmployee(Employee *p) { - list.push_back(p); - std::cout << "New employee added. Current employees are:" << std::endl; - std::vector::iterator i; - for (i=list.begin(); i!=list.end(); i++) { - std::cout << " " << (*i)->getTitle() << std::endl; - } - } - const Employee *get_item(int i) { - return list[i]; - } - ~EmployeeList() { - std::vector::iterator i; - std::cout << "~EmployeeList, deleting " << list.size() << " employees." << std::endl; - for (i=list.begin(); i!=list.end(); i++) { - delete *i; - } - std::cout << "~EmployeeList empty." << std::endl; - } -}; - diff --git a/Examples/go/extend/example.i b/Examples/go/extend/example.i deleted file mode 100644 index c8ec32e09..000000000 --- a/Examples/go/extend/example.i +++ /dev/null @@ -1,15 +0,0 @@ -/* File : example.i */ -%module(directors="1") example -%{ -#include "example.h" -%} - -%include "std_vector.i" -%include "std_string.i" - -/* turn on director wrapping for Manager */ -%feature("director") Employee; -%feature("director") Manager; - -%include "example.h" - diff --git a/Examples/go/extend/extend.cxx b/Examples/go/extend/extend.cxx deleted file mode 100644 index 450d75608..000000000 --- a/Examples/go/extend/extend.cxx +++ /dev/null @@ -1,4 +0,0 @@ -/* File : example.cxx */ - -#include "example.h" - diff --git a/Examples/go/extend/index.html b/Examples/go/extend/index.html deleted file mode 100644 index 471fa9cdc..000000000 --- a/Examples/go/extend/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - -SWIG:Examples:go:extend - - - - - -SWIG/Examples/go/extend/ -
- -

Extending a simple C++ class in Go

- -

-This example illustrates the extending of a C++ class with cross -language polymorphism. - -

-

- -
- - diff --git a/Examples/go/extend/runme.go b/Examples/go/extend/runme.go deleted file mode 100644 index 770e27802..000000000 --- a/Examples/go/extend/runme.go +++ /dev/null @@ -1,76 +0,0 @@ -// This file illustrates the cross language polymorphism using directors. - -package main - -import ( - . "./example" - "fmt" -) - -type CEO struct{} - -func (p *CEO) GetPosition() string { - return "CEO" -} - -func main() { - // Create an instance of CEO, a class derived from the Go - // proxy of the underlying C++ class. The calls to getName() - // and getPosition() are standard, the call to getTitle() uses - // the director wrappers to call CEO.getPosition(). - - e := NewDirectorManager(new(CEO), "Alice") - fmt.Println(e.GetName(), " is a ", e.GetPosition()) - fmt.Println("Just call her \"", e.GetTitle(), "\"") - fmt.Println("----------------------") - - // Create a new EmployeeList instance. This class does not - // have a C++ director wrapper, but can be used freely with - // other classes that do. - - list := NewEmployeeList() - - // EmployeeList owns its items, so we must surrender ownership - // of objects we add. - // e.DisownMemory() - list.AddEmployee(e) - fmt.Println("----------------------") - - // Now we access the first four items in list (three are C++ - // objects that EmployeeList's constructor adds, the last is - // our CEO). The virtual methods of all these instances are - // treated the same. For items 0, 1, and 2, all methods - // resolve in C++. For item 3, our CEO, GetTitle calls - // GetPosition which resolves in Go. The call to GetPosition - // is slightly different, however, because of the overridden - // GetPosition() call, since now the object reference has been - // "laundered" by passing through EmployeeList as an - // Employee*. Previously, Go resolved the call immediately in - // CEO, but now Go thinks the object is an instance of class - // Employee. So the call passes through the Employee proxy - // class and on to the C wrappers and C++ director, eventually - // ending up back at the Java CEO implementation of - // getPosition(). The call to GetTitle() for item 3 runs the - // C++ Employee::getTitle() method, which in turn calls - // GetPosition(). This virtual method call passes down - // through the C++ director class to the Java implementation - // in CEO. All this routing takes place transparently. - - fmt.Println("(position, title) for items 0-3:") - - fmt.Println(" ", list.Get_item(0).GetPosition(), ", \"", list.Get_item(0).GetTitle(), "\"") - fmt.Println(" ", list.Get_item(1).GetPosition(), ", \"", list.Get_item(1).GetTitle(), "\"") - fmt.Println(" ", list.Get_item(2).GetPosition(), ", \"", list.Get_item(2).GetTitle(), "\"") - fmt.Println(" ", list.Get_item(3).GetPosition(), ", \"", list.Get_item(3).GetTitle(), "\"") - fmt.Println("----------------------") - - // Time to delete the EmployeeList, which will delete all the - // Employee* items it contains. The last item is our CEO, - // which gets destroyed as well. - DeleteEmployeeList(list) - fmt.Println("----------------------") - - // All done. - - fmt.Println("Go exit") -} diff --git a/Examples/go/index.html b/Examples/go/index.html index 21dda21b5..4c07af3f0 100644 --- a/Examples/go/index.html +++ b/Examples/go/index.html @@ -21,8 +21,7 @@ certain C declarations are turned into constants.
  • pointer. Simple pointer handling.
  • funcptr. Pointers to functions.
  • template. C++ templates. -
  • callback. C++ callbacks using directors. -
  • extend. Polymorphism using directors. +
  • director. Example how to utilize the director feature.

    Compilation Issues

    @@ -46,7 +45,7 @@ the 6g or 8g compiler, the steps look like this
     % swig -go interface.i
     % gcc -fpic -c interface_wrap.c
    -% gcc -shared interface_wrap.o $(OBJS) -o interfacemodule.so 
    +% gcc -shared interface_wrap.o $(OBJS) -o interfacemodule.so
     % 6g interface.go
     % 6c interface_gc.c
     % gopack grc interface.a interface.6 interface_gc.6
    @@ -83,7 +82,7 @@ All of the examples were last tested with the following configuration
     
  • gcc-4.2.4 -Your mileage may vary. If you experience a problem, please let us know by +Your mileage may vary. If you experience a problem, please let us know by contacting us on the mailing lists.