mirror of https://github.com/swig/swig
689 lines
16 KiB
Plaintext
689 lines
16 KiB
Plaintext
/* ------------------------------------------------------------
|
|
* go.swg
|
|
*
|
|
* Go configuration module.
|
|
* ------------------------------------------------------------ */
|
|
|
|
%include <gostring.swg>
|
|
|
|
/* Code insertion directives */
|
|
#define %go_import(...) %insert(go_imports) %{__VA_ARGS__%}
|
|
|
|
/* Basic types */
|
|
|
|
%typemap(gotype) bool, const bool & "bool"
|
|
%typemap(gotype) char, const char & "byte"
|
|
%typemap(gotype) signed char, const signed char & "int8"
|
|
%typemap(gotype) unsigned char, const unsigned char & "byte"
|
|
%typemap(gotype) short, const short & "int16"
|
|
%typemap(gotype) unsigned short, const unsigned short & "uint16"
|
|
%typemap(gotype) int, const int & "int"
|
|
%typemap(gotype) unsigned int, const unsigned int & "uint"
|
|
%typemap(gotype) long, const long & "int64"
|
|
%typemap(gotype) unsigned long, const unsigned long & "uint64"
|
|
%typemap(gotype) long long, const long long & "int64"
|
|
%typemap(gotype) unsigned long long, const unsigned long long & "uint64"
|
|
%typemap(gotype) float, const float & "float32"
|
|
%typemap(gotype) double, const double & "float64"
|
|
|
|
%typemap(in) bool,
|
|
char,
|
|
signed char,
|
|
unsigned char,
|
|
short,
|
|
unsigned short,
|
|
int,
|
|
unsigned int,
|
|
long,
|
|
unsigned long,
|
|
long long,
|
|
unsigned long long,
|
|
float,
|
|
double
|
|
%{ $1 = ($1_ltype)$input; %}
|
|
|
|
%typemap(in) const bool &,
|
|
const char &,
|
|
const signed char &,
|
|
const unsigned char &,
|
|
const short &,
|
|
const unsigned short &,
|
|
const int &,
|
|
const unsigned int &,
|
|
const long long &,
|
|
const unsigned long long &,
|
|
const float &,
|
|
const double &
|
|
%{ $1 = ($1_ltype)&$input; %}
|
|
|
|
%typemap(in) const long & ($*1_ltype temp),
|
|
const unsigned long & ($*1_ltype temp)
|
|
%{ temp = ($*1_ltype)$input;
|
|
$1 = ($1_ltype)&temp; %}
|
|
|
|
%typemap(out) bool,
|
|
char,
|
|
signed char,
|
|
unsigned char,
|
|
short,
|
|
unsigned short,
|
|
int,
|
|
unsigned int,
|
|
long,
|
|
unsigned long,
|
|
long long,
|
|
unsigned long long,
|
|
float,
|
|
double
|
|
%{ $result = $1; %}
|
|
|
|
%typemap(goout) bool,
|
|
char,
|
|
signed char,
|
|
unsigned char,
|
|
short,
|
|
unsigned short,
|
|
int,
|
|
unsigned int,
|
|
long,
|
|
unsigned long,
|
|
long long,
|
|
unsigned long long,
|
|
float,
|
|
double
|
|
""
|
|
|
|
%typemap(out) const bool &,
|
|
const char &,
|
|
const signed char &,
|
|
const unsigned char &,
|
|
const short &,
|
|
const unsigned short &,
|
|
const int &,
|
|
const unsigned int &,
|
|
const long &,
|
|
const unsigned long &,
|
|
const long long &,
|
|
const unsigned long long &,
|
|
const float &,
|
|
const double &
|
|
%{ $result = ($*1_ltype)*$1; %}
|
|
|
|
%typemap(goout) const bool &,
|
|
const char &,
|
|
const signed char &,
|
|
const unsigned char &,
|
|
const short &,
|
|
const unsigned short &,
|
|
const int &,
|
|
const unsigned int &,
|
|
const long &,
|
|
const unsigned long &,
|
|
const long long &,
|
|
const unsigned long long &,
|
|
const float &,
|
|
const double &
|
|
""
|
|
|
|
%typemap(out) void ""
|
|
|
|
%typemap(goout) void ""
|
|
|
|
%typemap(directorin) bool,
|
|
char,
|
|
signed char,
|
|
unsigned char,
|
|
short,
|
|
unsigned short,
|
|
int,
|
|
unsigned int,
|
|
long,
|
|
unsigned long,
|
|
long long,
|
|
unsigned long long,
|
|
float,
|
|
double
|
|
%{ $input = ($1_ltype)$1; %}
|
|
|
|
%typemap(godirectorin) bool,
|
|
char,
|
|
signed char,
|
|
unsigned char,
|
|
short,
|
|
unsigned short,
|
|
int,
|
|
unsigned int,
|
|
long,
|
|
unsigned long,
|
|
long long,
|
|
unsigned long long,
|
|
float,
|
|
double
|
|
""
|
|
|
|
%typemap(directorin) const bool &,
|
|
const char &,
|
|
const signed char &,
|
|
const unsigned char &,
|
|
const short &,
|
|
const unsigned short &,
|
|
const int &,
|
|
const unsigned int &,
|
|
const long &,
|
|
const unsigned long &,
|
|
const long long &,
|
|
const unsigned long long &,
|
|
const float &,
|
|
const double &
|
|
%{ $input = ($*1_ltype)$1; %}
|
|
|
|
%typemap(godirectorin) const bool &,
|
|
const char &,
|
|
const signed char &,
|
|
const unsigned char &,
|
|
const short &,
|
|
const unsigned short &,
|
|
const int &,
|
|
const unsigned int &,
|
|
const long &,
|
|
const unsigned long &,
|
|
const long long &,
|
|
const unsigned long long &,
|
|
const float &,
|
|
const double &
|
|
""
|
|
|
|
%typemap(directorout) bool,
|
|
char,
|
|
signed char,
|
|
unsigned char,
|
|
short,
|
|
unsigned short,
|
|
int,
|
|
unsigned int,
|
|
long,
|
|
unsigned long,
|
|
long long,
|
|
unsigned long long,
|
|
float,
|
|
double
|
|
%{ $result = ($1_ltype)$input; %}
|
|
|
|
%typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const bool &,
|
|
const char &,
|
|
const signed char &,
|
|
const unsigned char &,
|
|
const short &,
|
|
const unsigned short &,
|
|
const int &,
|
|
const unsigned int &,
|
|
const long &,
|
|
const unsigned long &,
|
|
const long long &,
|
|
const unsigned long long &,
|
|
const float &,
|
|
const double &
|
|
%{
|
|
$result = new $*1_ltype($input);
|
|
swig_acquire_pointer(&swig_mem, $result);
|
|
%}
|
|
|
|
/* The size_t type. */
|
|
|
|
%typemap(gotype) size_t, const size_t & %{int64%}
|
|
|
|
%typemap(in) size_t
|
|
%{ $1 = (size_t)$input; %}
|
|
|
|
%typemap(in) const size_t &
|
|
%{ $1 = ($1_ltype)&$input; %}
|
|
|
|
%typemap(out) size_t
|
|
%{ $result = $1; %}
|
|
|
|
%typemap(goout) size_t ""
|
|
|
|
%typemap(out) const size_t &
|
|
%{ $result = ($*1_ltype)*$1; %}
|
|
|
|
%typemap(goout) const size_t & ""
|
|
|
|
%typemap(directorin) size_t
|
|
%{ $input = (size_t)$1; %}
|
|
|
|
%typemap(godirectorin) size_t ""
|
|
|
|
%typemap(directorin) const size_t &
|
|
%{ $input = ($*1_ltype)$1; %}
|
|
|
|
%typemap(godirectorin) const size_t & ""
|
|
|
|
%typemap(directorout) size_t
|
|
%{ $result = ($1_ltype)$input; %}
|
|
|
|
%typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const size_t &
|
|
%{
|
|
$result = new $*1_ltype($input);
|
|
swig_acquire_pointer(&swig_mem, $result);
|
|
%}
|
|
|
|
/* Member pointers. */
|
|
|
|
%typemap(gotype) SWIGTYPE (CLASS::*)
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) SWIGTYPE (CLASS::*)
|
|
%{ $1 = *($&1_ltype)$input; %}
|
|
|
|
%typemap(out) SWIGTYPE (CLASS::*)
|
|
%{
|
|
struct swig_out_type { intgo size; void* val; } *swig_out;
|
|
swig_out = (struct swig_out_type*)malloc(sizeof(*swig_out));
|
|
if (swig_out) {
|
|
swig_out->size = sizeof($1_ltype);
|
|
swig_out->val = malloc(swig_out->size);
|
|
if (swig_out->val) {
|
|
*($&1_ltype)(swig_out->val) = $1;
|
|
}
|
|
}
|
|
$result = swig_out;
|
|
%}
|
|
|
|
%typemap(goout) SWIGTYPE (CLASS::*)
|
|
%{
|
|
{
|
|
type swig_out_type struct { size int; val uintptr }
|
|
p := (*swig_out_type)(unsafe.Pointer($1))
|
|
if p == nil || p.val == 0 {
|
|
$result = nil
|
|
} else {
|
|
m := make([]byte, p.size)
|
|
a := (*[1024]byte)(unsafe.Pointer(p.val))[:p.size]
|
|
copy(m, a)
|
|
Swig_free(p.val)
|
|
Swig_free(uintptr(unsafe.Pointer(p)))
|
|
$result = &m[0]
|
|
}
|
|
}
|
|
%}
|
|
|
|
%typemap(directorin) SWIGTYPE (CLASS::*)
|
|
%{ $input = *($&1_ltype)$1; %}
|
|
|
|
%typemap(godirectorin) SWIGTYPE (CLASS::*) ""
|
|
|
|
%typemap(directorout) SWIGTYPE (CLASS::*)
|
|
%{
|
|
$result = new $1_ltype($input);
|
|
swig_acquire_pointer(&swig_mem, $result);
|
|
%}
|
|
|
|
/* Pointers. */
|
|
|
|
/* We can't translate pointers using a typemap, so that is handled in
|
|
the C++ code. */
|
|
%typemap(gotype) SWIGTYPE *
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) SWIGTYPE *
|
|
%{ $1 = *($&1_ltype)&$input; %}
|
|
|
|
%typemap(out) SWIGTYPE *
|
|
%{ *($&1_ltype)&$result = ($1_ltype)$1; %}
|
|
|
|
%typemap(goout) SWIGTYPE * ""
|
|
|
|
%typemap(directorin) SWIGTYPE *
|
|
%{ *($&1_ltype)&$input = ($1_ltype)$1; %}
|
|
|
|
%typemap(godirectorin) SWIGTYPE * ""
|
|
|
|
%typemap(directorout) SWIGTYPE *
|
|
%{ $result = *($&1_ltype)&$input; %}
|
|
|
|
%apply SWIGTYPE * { SWIGTYPE *const }
|
|
|
|
/* Pointer references. */
|
|
|
|
%typemap(gotype) SWIGTYPE *const&
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0)
|
|
%{
|
|
temp = *($1_ltype)&$input;
|
|
$1 = ($1_ltype)&temp;
|
|
%}
|
|
|
|
%typemap(out) SWIGTYPE *const&
|
|
%{ *($1_ltype)&$result = *$1; %}
|
|
|
|
%typemap(goout) SWIGTYPE *const& ""
|
|
|
|
/* References. */
|
|
|
|
/* Converting a C++ reference to Go has to be handled in the C++
|
|
code. */
|
|
%typemap(gotype) SWIGTYPE &
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) SWIGTYPE &
|
|
%{ $1 = *($&1_ltype)&$input; %}
|
|
|
|
%typemap(out) SWIGTYPE &
|
|
%{ *($&1_ltype)&$result = $1; %}
|
|
|
|
%typemap(goout) SWIGTYPE & ""
|
|
|
|
%typemap(directorin) SWIGTYPE &
|
|
%{ $input = ($1_ltype)&$1; %}
|
|
|
|
%typemap(godirectorin) SWIGTYPE & ""
|
|
|
|
%typemap(directorout) SWIGTYPE &
|
|
%{ *($&1_ltype)&$result = $input; %}
|
|
|
|
%typemap(gotype) SWIGTYPE &&
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) SWIGTYPE &&
|
|
%{ $1 = *($&1_ltype)&$input; %}
|
|
|
|
%typemap(out) SWIGTYPE &&
|
|
%{ *($&1_ltype)&$result = $1; %}
|
|
|
|
%typemap(goout) SWIGTYPE && ""
|
|
|
|
%typemap(directorin) SWIGTYPE &&
|
|
%{ $input = ($1_ltype)&$1_name; %}
|
|
|
|
%typemap(godirectorin) SWIGTYPE && ""
|
|
|
|
%typemap(directorout) SWIGTYPE &&
|
|
%{ *($&1_ltype)&$result = $input; %}
|
|
|
|
/* C arrays turn into Go pointers. If we know the length we can use a
|
|
slice. */
|
|
|
|
%typemap(gotype) SWIGTYPE []
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) SWIGTYPE []
|
|
%{ $1 = *($&1_ltype)&$input; %}
|
|
|
|
%typemap(out) SWIGTYPE []
|
|
%{ *($&1_ltype)&$result = $1; %}
|
|
|
|
%typemap(goout) SWIGTYPE [] ""
|
|
|
|
%typemap(directorin) SWIGTYPE []
|
|
%{ $input = *($1_ltype)&$1; %}
|
|
|
|
%typemap(godirectorin) SWIGTYPE [] ""
|
|
|
|
%typemap(directorout) SWIGTYPE []
|
|
%{ *($&1_ltype)&$result = $input; %}
|
|
|
|
/* Strings. */
|
|
|
|
%typemap(gotype)
|
|
char *, char *&, char[ANY], char[],
|
|
signed char *, signed char *&, signed char[ANY], signed char[],
|
|
unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char[]
|
|
"string"
|
|
|
|
/* Needed to avoid confusion with the way the go module handles
|
|
references. */
|
|
%typemap(gotype) char&, unsigned char& "*byte"
|
|
%typemap(gotype) signed char& "*int8"
|
|
|
|
%typemap(in)
|
|
char *, char[ANY], char[],
|
|
signed char *, signed char[ANY], signed char[],
|
|
unsigned char *, unsigned char[ANY], unsigned char[]
|
|
%{ $1 = ($1_ltype)$input.p; %}
|
|
|
|
%typemap(in) char *&, signed char *&, unsigned char *&
|
|
%{ $1 = ($1_ltype)$input.p; %}
|
|
|
|
%typemap(out,fragment="AllocateString")
|
|
char *, char *&, char[ANY], char[],
|
|
signed char *, signed char *&, signed char[ANY], signed char[],
|
|
unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char[]
|
|
%{ $result = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0); %}
|
|
|
|
%typemap(goout,fragment="CopyString")
|
|
char *, char *&, char[ANY], char[],
|
|
signed char *, signed char *&, signed char[ANY], signed char[],
|
|
unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char[]
|
|
%{ $result = swigCopyString($1) %}
|
|
|
|
%typemap(directorin,fragment="AllocateString")
|
|
char *, char *&, char[ANY], char[],
|
|
signed char *, signed char *&, signed char[ANY], signed char[],
|
|
unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char[]
|
|
%{
|
|
$input = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0);
|
|
%}
|
|
|
|
%typemap(godirectorin,fragment="CopyString")
|
|
char *, char *&, char[ANY], char[],
|
|
signed char *, signed char *&, signed char[ANY], signed char[],
|
|
unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char[]
|
|
%{
|
|
$result = swigCopyString($input)
|
|
%}
|
|
|
|
%typemap(directorout)
|
|
char *, char *&, char[ANY], char[],
|
|
signed char *, signed char *&, signed char[ANY], signed char[],
|
|
unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char[]
|
|
%{ $result = ($1_ltype)$input.p; %}
|
|
|
|
/* String & length */
|
|
|
|
%typemap(gotype) (char *STRING, size_t LENGTH) "string"
|
|
|
|
%typemap(in) (char *STRING, size_t LENGTH)
|
|
%{
|
|
$1 = ($1_ltype)$input.p;
|
|
$2 = ($2_ltype)$input.n;
|
|
%}
|
|
|
|
%typemap(out,fragment="AllocateString") (char *STRING, size_t LENGTH)
|
|
%{ $result = Swig_AllocateString((char*)$1, (size_t)$2); %}
|
|
|
|
%typemap(goout,fragment="CopyString") (char *STRING, size_t LENGTH)
|
|
%{ $result = swigCopyString($1) %}
|
|
|
|
%typemap(directorin,fragment="AllocateString") (char *STRING, size_t LENGTH)
|
|
%{ $input = Swig_AllocateString((char*)$1, $2); %}
|
|
|
|
%typemap(godirectorin,fragment="CopyString") (char *STRING, size_t LENGTH)
|
|
%{ $result = swigCopyString($input) %}
|
|
|
|
%typemap(directorout) (char *STRING, size_t LENGTH)
|
|
%{
|
|
$1 = ($1_ltype)$input.p;
|
|
$2 = ($2_ltype)$input.n;
|
|
%}
|
|
|
|
/* Enums. We can't do the right thing for enums in typemap(gotype) so
|
|
we deliberately don't define them. The right thing would be to
|
|
capitalize the name. This is instead done in go.cxx. */
|
|
|
|
%typemap(gotype) enum SWIGTYPE
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) enum SWIGTYPE
|
|
%{ $1 = ($1_ltype)$input; %}
|
|
|
|
%typemap(out) enum SWIGTYPE
|
|
%{ $result = (intgo)$1; %}
|
|
|
|
%typemap(goout) enum SWIGTYPE ""
|
|
|
|
%typemap(directorin) enum SWIGTYPE
|
|
%{ $input = (intgo)$1; %}
|
|
|
|
%typemap(godirectorin) enum SWIGTYPE ""
|
|
|
|
%typemap(directorout) enum SWIGTYPE
|
|
%{ $result = ($1_ltype)$input; %}
|
|
|
|
%typemap(directorin) enum SWIGTYPE & (intgo e)
|
|
%{
|
|
e = (intgo)$1;
|
|
$input = ($1_ltype)&e;
|
|
%}
|
|
|
|
%typemap(godirectorin) enum SWIGTYPE & ""
|
|
|
|
%typemap(directorout) enum SWIGTYPE &
|
|
%{
|
|
$*1_ltype f = ($*1_ltype)*$input;
|
|
$result = ($1_ltype)&f;
|
|
%}
|
|
|
|
/* Arbitrary type. This is a type passed by value in the C/C++ code.
|
|
We convert it to a pointer for the Go code. Note that all basic
|
|
types are explicitly handled above. */
|
|
|
|
%typemap(gotype) SWIGTYPE
|
|
%{$gotypename%}
|
|
|
|
%typemap(in) SWIGTYPE ($&1_type argp)
|
|
%{
|
|
argp = ($&1_ltype)$input;
|
|
if (argp == NULL) {
|
|
_swig_gopanic("Attempt to dereference null $1_type");
|
|
}
|
|
$1 = ($1_ltype)*argp;
|
|
%}
|
|
|
|
%typemap(out) SWIGTYPE
|
|
#ifdef __cplusplus
|
|
%{ *($&1_ltype*)&$result = new $1_ltype($1); %}
|
|
#else
|
|
{
|
|
$&1_ltype $1ptr = ($&1_ltype)malloc(sizeof($1_ltype));
|
|
memmove($1ptr, &$1, sizeof($1_type));
|
|
*($&1_ltype*)&$result = $1ptr;
|
|
}
|
|
#endif
|
|
|
|
%typemap(goout) SWIGTYPE ""
|
|
|
|
%typemap(directorin) SWIGTYPE
|
|
%{ $input = ($&1_ltype)&$1; %}
|
|
|
|
%typemap(godirectorin) SWIGTYPE ""
|
|
|
|
%typemap(directorout) SWIGTYPE
|
|
%{ $result = *($&1_ltype)$input; %}
|
|
|
|
/* Exception handling */
|
|
|
|
%typemap(throws) char *
|
|
%{ _swig_gopanic($1); %}
|
|
|
|
%typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY]
|
|
%{
|
|
(void)$1;
|
|
_swig_gopanic("C++ $1_type exception thrown");
|
|
%}
|
|
|
|
/* Typecheck typemaps. The purpose of these is merely to issue a
|
|
warning for overloaded C++ functions that cannot be overloaded in
|
|
Go as more than one C++ type maps to a single Go type. */
|
|
|
|
%typecheck(SWIG_TYPECHECK_BOOL) /* Go bool */
|
|
bool,
|
|
const bool &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_CHAR) /* Go byte */
|
|
char,
|
|
const char &,
|
|
unsigned char,
|
|
const unsigned char &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_INT8) /* Go int8 */
|
|
signed char,
|
|
const signed char &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_INT16) /* Go int16 */
|
|
short,
|
|
const short &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_INT16) /* Go uint16 */
|
|
unsigned short,
|
|
const unsigned short &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_INT32) /* Go int */
|
|
int,
|
|
const int &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_INT32) /* Go uint */
|
|
unsigned int,
|
|
const unsigned int &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_INT64) /* Go int64 */
|
|
long,
|
|
const long &,
|
|
long long,
|
|
const long long &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_INT64) /* Go uint64 */
|
|
unsigned long,
|
|
const unsigned long &,
|
|
unsigned long long,
|
|
const unsigned long long &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_FLOAT) /* Go float32 */
|
|
float,
|
|
const float &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_DOUBLE) /* Go float64 */
|
|
double,
|
|
const double &
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_STRING) /* Go string */
|
|
char *,
|
|
char *&,
|
|
char[ANY],
|
|
char [],
|
|
signed char *,
|
|
signed char *&,
|
|
signed char[ANY],
|
|
signed char [],
|
|
unsigned char *,
|
|
unsigned char *&,
|
|
unsigned char[ANY],
|
|
unsigned char []
|
|
""
|
|
|
|
%typecheck(SWIG_TYPECHECK_POINTER)
|
|
SWIGTYPE,
|
|
SWIGTYPE *,
|
|
SWIGTYPE &,
|
|
SWIGTYPE &&,
|
|
SWIGTYPE *const&,
|
|
SWIGTYPE [],
|
|
SWIGTYPE (CLASS::*)
|
|
""
|
|
|
|
/* Go keywords. */
|
|
%include <gokw.swg>
|
|
|
|
%include <goruntime.swg>
|