| Index: swig/Lib/cpointer.i
|
| ===================================================================
|
| --- swig/Lib/cpointer.i (revision 0)
|
| +++ swig/Lib/cpointer.i (revision 0)
|
| @@ -0,0 +1,183 @@
|
| +/* -----------------------------------------------------------------------------
|
| + * See the LICENSE file for information on copyright, usage and redistribution
|
| + * of SWIG, and the README file for authors - http://www.swig.org/release.html.
|
| + *
|
| + * cpointer.i
|
| + *
|
| + * SWIG library file containing 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 {
|
| +#ifdef __cplusplus
|
| +NAME() {
|
| + return new TYPE();
|
| +}
|
| +~NAME() {
|
| + if (self) delete self;
|
| +}
|
| +#else
|
| +NAME() {
|
| + return (TYPE *) calloc(1,sizeof(TYPE));
|
| +}
|
| +~NAME() {
|
| + if (self) free(self);
|
| +}
|
| +#endif
|
| +}
|
| +
|
| +%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() { %}
|
| +#ifdef __cplusplus
|
| +%{ return new TYPE(); %}
|
| +#else
|
| +%{ return (TYPE *) calloc(1,sizeof(TYPE)); %}
|
| +#endif
|
| +%{}
|
| +
|
| +static TYPE *copy_##NAME(TYPE value) { %}
|
| +#ifdef __cplusplus
|
| +%{ return new TYPE(value); %}
|
| +#else
|
| +%{ TYPE *self = (TYPE *) calloc(1,sizeof(TYPE));
|
| + *self = value;
|
| + return self; %}
|
| +#endif
|
| +%{}
|
| +
|
| +static void delete_##NAME(TYPE *self) { %}
|
| +#ifdef __cplusplus
|
| +%{ if (self) delete self; %}
|
| +#else
|
| +%{ if (self) free(self); %}
|
| +#endif
|
| +%{}
|
| +
|
| +static void NAME ##_assign(TYPE *self, TYPE value) {
|
| + *self = value;
|
| +}
|
| +
|
| +static TYPE NAME ##_value(TYPE *self) {
|
| + return *self;
|
| +}
|
| +%}
|
| +
|
| +TYPE *new_##NAME();
|
| +TYPE *copy_##NAME(TYPE value);
|
| +void delete_##NAME(TYPE *self);
|
| +void NAME##_assign(TYPE *self, TYPE value);
|
| +TYPE NAME##_value(TYPE *self);
|
| +
|
| +%enddef
|
| +
|
| +/* -----------------------------------------------------------------------------
|
| + * %pointer_cast(type1,type2,name)
|
| + *
|
| + * Generates a pointer casting function.
|
| + * ----------------------------------------------------------------------------- */
|
| +
|
| +%define %pointer_cast(TYPE1,TYPE2,NAME)
|
| +%inline %{
|
| +TYPE2 NAME(TYPE1 x) {
|
| + return (TYPE2) x;
|
| +}
|
| +%}
|
| +%enddef
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
| +
|
|
|