summaryrefslogtreecommitdiffstats
path: root/misc/swig
diff options
context:
space:
mode:
Diffstat (limited to 'misc/swig')
-rw-r--r--misc/swig/callback/callback.cc15
-rw-r--r--misc/swig/callback/callback.go11
-rw-r--r--misc/swig/callback/callback.h20
-rw-r--r--misc/swig/callback/callback.swigcxx18
-rw-r--r--misc/swig/callback/callback_test.go33
-rw-r--r--misc/swig/stdio/file.go15
-rw-r--r--misc/swig/stdio/file.swig24
-rw-r--r--misc/swig/stdio/file_test.go28
8 files changed, 164 insertions, 0 deletions
diff --git a/misc/swig/callback/callback.cc b/misc/swig/callback/callback.cc
new file mode 100644
index 0000000..88bd49c
--- /dev/null
+++ b/misc/swig/callback/callback.cc
@@ -0,0 +1,15 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This .cc file will be automatically compiled by the go tool and
+// included in the package.
+
+#include <string>
+#include "callback.h"
+
+std::string Caller::call() {
+ if (callback_ != 0)
+ return callback_->run();
+ return "";
+}
diff --git a/misc/swig/callback/callback.go b/misc/swig/callback/callback.go
new file mode 100644
index 0000000..0d6e97f
--- /dev/null
+++ b/misc/swig/callback/callback.go
@@ -0,0 +1,11 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package callback
+
+type GoCallback struct{}
+
+func (p *GoCallback) Run() string {
+ return "GoCallback.Run"
+}
diff --git a/misc/swig/callback/callback.h b/misc/swig/callback/callback.h
new file mode 100644
index 0000000..4b66106
--- /dev/null
+++ b/misc/swig/callback/callback.h
@@ -0,0 +1,20 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+class Callback {
+public:
+ virtual ~Callback() { }
+ virtual std::string run() { return "Callback::run"; }
+};
+
+class Caller {
+private:
+ Callback *callback_;
+public:
+ Caller(): callback_(0) { }
+ ~Caller() { delCallback(); }
+ void delCallback() { delete callback_; callback_ = 0; }
+ void setCallback(Callback *cb) { delCallback(); callback_ = cb; }
+ std::string call();
+};
diff --git a/misc/swig/callback/callback.swigcxx b/misc/swig/callback/callback.swigcxx
new file mode 100644
index 0000000..6181fe9
--- /dev/null
+++ b/misc/swig/callback/callback.swigcxx
@@ -0,0 +1,18 @@
+/* Copyright 2011 The Go Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file. */
+
+/* An example of writing a C++ virtual function in Go. */
+
+%module(directors="1") callback
+
+%{
+#include <string>
+#include "callback.h"
+%}
+
+%include "std_string.i"
+
+%feature("director");
+
+%include "callback.h"
diff --git a/misc/swig/callback/callback_test.go b/misc/swig/callback/callback_test.go
new file mode 100644
index 0000000..0c8a300
--- /dev/null
+++ b/misc/swig/callback/callback_test.go
@@ -0,0 +1,33 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package callback
+
+import (
+ "testing"
+)
+
+func TestCall(t *testing.T) {
+ c := NewCaller()
+ cb := NewCallback()
+
+ c.SetCallback(cb)
+ s := c.Call()
+ if s != "Callback::run" {
+ t.Errorf("unexpected string from Call: %q", s)
+ }
+ c.DelCallback()
+}
+
+func TestCallback(t *testing.T) {
+ c := NewCaller()
+ cb := NewDirectorCallback(&GoCallback{})
+ c.SetCallback(cb)
+ s := c.Call()
+ if s != "GoCallback.Run" {
+ t.Errorf("unexpected string from Call with callback: %q", s)
+ }
+ c.DelCallback()
+ DeleteDirectorCallback(cb)
+}
diff --git a/misc/swig/stdio/file.go b/misc/swig/stdio/file.go
new file mode 100644
index 0000000..a582f77
--- /dev/null
+++ b/misc/swig/stdio/file.go
@@ -0,0 +1,15 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file is here just to cause problems.
+// file.swig turns into a file also named file.go.
+// Make sure cmd/go keeps them separate
+// when both are passed to cgo.
+
+package file
+
+//int F(void) { return 1; }
+import "C"
+
+func F() int { return int(C.F()) }
diff --git a/misc/swig/stdio/file.swig b/misc/swig/stdio/file.swig
new file mode 100644
index 0000000..b28ae0a
--- /dev/null
+++ b/misc/swig/stdio/file.swig
@@ -0,0 +1,24 @@
+/* Copyright 2011 The Go Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file. */
+
+/* A trivial example of wrapping a C library using SWIG. */
+
+%{
+#include <stdio.h>
+#include <stdlib.h>
+%}
+
+%typemap(gotype) const char * "string"
+%typemap(in) const char * %{
+ $1 = malloc($input.n + 1);
+ memcpy($1, $input.p, $input.n);
+ $1[$input.n] = '\0';
+%}
+%typemap(freearg) const char * %{
+ free($1);
+%}
+
+FILE *fopen(const char *name, const char *mode);
+int fclose(FILE *);
+int fgetc(FILE *);
diff --git a/misc/swig/stdio/file_test.go b/misc/swig/stdio/file_test.go
new file mode 100644
index 0000000..aea92aa
--- /dev/null
+++ b/misc/swig/stdio/file_test.go
@@ -0,0 +1,28 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package file
+
+import "testing"
+
+// Open this file itself and verify that the first few characters are
+// as expected.
+func TestRead(t *testing.T) {
+ f := Fopen("file_test.go", "r")
+ if f.Swigcptr() == 0 {
+ t.Fatal("fopen failed")
+ }
+ if Fgetc(f) != '/' || Fgetc(f) != '/' || Fgetc(f) != ' ' || Fgetc(f) != 'C' {
+ t.Error("read unexpected characters")
+ }
+ if Fclose(f) != 0 {
+ t.Error("fclose failed")
+ }
+}
+
+func TestF(t *testing.T) {
+ if x := F(); x != 1 {
+ t.Fatalf("x = %d, want 1", x)
+ }
+}