/trunk/Lib/typemaps/cpointer.swg
Unknown | 157 lines | 130 code | 27 blank | 0 comment | 0 complexity | 1022e0f82b88521f1944ebcfd74303f3 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- /* -----------------------------------------------------------------------------
- * 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