diff options
Diffstat (limited to 'share/swig/2.0.11/typemaps/cpointer.swg')
-rw-r--r-- | share/swig/2.0.11/typemaps/cpointer.swg | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/share/swig/2.0.11/typemaps/cpointer.swg b/share/swig/2.0.11/typemaps/cpointer.swg new file mode 100644 index 0000000..94bbbd6 --- /dev/null +++ b/share/swig/2.0.11/typemaps/cpointer.swg @@ -0,0 +1,157 @@ +/* ----------------------------------------------------------------------------- + * cpointer.swg + * + * This library file contains macros that can be used to manipulate simple + * pointer objects. + * + * ----------------------------------------------------------------------------- */ + +/* ----------------------------------------------------------------------------- + * %pointer_class(type,name) + * + * Places a simple proxy around a simple type like 'int', 'float', or whatever. + * The proxy provides this interface: + * + * class type { + * public: + * type(); + * ~type(); + * type value(); + * void assign(type value); + * }; + * + * Example: + * + * %pointer_class(int, intp); + * + * int add(int *x, int *y) { return *x + *y; } + * + * In python (with proxies) + * + * >>> a = intp() + * >>> a.assign(10) + * >>> a.value() + * 10 + * >>> b = intp() + * >>> b.assign(20) + * >>> print add(a,b) + * 30 + * + * As a general rule, this macro should not be used on class/structures that + * are already defined in the interface. + * ----------------------------------------------------------------------------- */ + + +%define %pointer_class(TYPE, NAME) +%{ +typedef TYPE NAME; +%} + +typedef struct { +} NAME; + +%extend NAME { + NAME() { + return %new_instance(TYPE); + } + ~NAME() { + if ($self) %delete($self); + } +} + +%extend NAME { + + void assign(TYPE value) { + *$self = value; + } + TYPE value() { + return *$self; + } + TYPE * cast() { + return $self; + } + static NAME * frompointer(TYPE *t) { + return (NAME *) t; + } +} + +%types(NAME = TYPE); + +%enddef + +/* ----------------------------------------------------------------------------- + * %pointer_functions(type,name) + * + * Create functions for allocating/deallocating pointers. This can be used + * if you don't want to create a proxy class or if the pointer is complex. + * + * %pointer_functions(int, intp) + * + * int add(int *x, int *y) { return *x + *y; } + * + * In python (with proxies) + * + * >>> a = copy_intp(10) + * >>> intp_value(a) + * 10 + * >>> b = new_intp() + * >>> intp_assign(b,20) + * >>> print add(a,b) + * 30 + * >>> delete_intp(a) + * >>> delete_intp(b) + * + * ----------------------------------------------------------------------------- */ + +%define %pointer_functions(TYPE,NAME) +%{ + static TYPE *new_##NAME() { + return %new_instance(TYPE); + } + + static TYPE *copy_##NAME(TYPE value) { + return %new_copy(value, TYPE); + } + + static void delete_##NAME(TYPE *obj) { + if (obj) %delete(obj); + } + + static void NAME ##_assign(TYPE *obj, TYPE value) { + *obj = value; + } + + static TYPE NAME ##_value(TYPE *obj) { + return *obj; + } +%} + +TYPE *new_##NAME(); +TYPE *copy_##NAME(TYPE value); +void delete_##NAME(TYPE *obj); +void NAME##_assign(TYPE *obj, TYPE value); +TYPE NAME##_value(TYPE *obj); + +%enddef + +/* ----------------------------------------------------------------------------- + * %pointer_cast(type1,type2,name) + * + * Generates a pointer casting function. + * ----------------------------------------------------------------------------- */ + +%define %pointer_cast(TYPE1,TYPE2,NAME) +%inline %{ +TYPE2 NAME(TYPE1 x) { + return %static_cast(x, TYPE2); +} +%} +%enddef + + + + + + + + |