123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /* -----------------------------------------------------------------------------
- * cpointer.i
- *
- * D-specific version of ../cpointer.i.
- * ----------------------------------------------------------------------------- */
- /* -----------------------------------------------------------------------------
- * %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 * ptr() {
- 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
|