PageRenderTime 17ms CodeModel.GetById 14ms app.highlight 1ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/Lib/typemaps/cpointer.swg

#
Unknown | 157 lines | 130 code | 27 blank | 0 comment | 0 complexity | 1022e0f82b88521f1944ebcfd74303f3 MD5 | raw file
  1/* -----------------------------------------------------------------------------
  2 * cpointer.swg
  3 *
  4 * This library file contains macros that can be used to manipulate simple
  5 * pointer objects.
  6 *
  7 * ----------------------------------------------------------------------------- */
  8
  9/* -----------------------------------------------------------------------------
 10 * %pointer_class(type,name)
 11 *
 12 * Places a simple proxy around a simple type like 'int', 'float', or whatever.
 13 * The proxy provides this interface:
 14 *
 15 *       class type {
 16 *       public:
 17 *           type();
 18 *          ~type();
 19 *           type value();
 20 *           void assign(type value);
 21 *       };
 22 *         
 23 * Example:
 24 *
 25 *    %pointer_class(int, intp);
 26 *
 27 *    int add(int *x, int *y) { return *x + *y; }
 28 *
 29 * In python (with proxies)
 30 *
 31 *    >>> a = intp()
 32 *    >>> a.assign(10)
 33 *    >>> a.value()
 34 *    10
 35 *    >>> b = intp()
 36 *    >>> b.assign(20)
 37 *    >>> print add(a,b)
 38 *    30
 39 *
 40 * As a general rule, this macro should not be used on class/structures that
 41 * are already defined in the interface.
 42 * ----------------------------------------------------------------------------- */
 43
 44
 45%define %pointer_class(TYPE, NAME)
 46%{
 47typedef TYPE NAME;
 48%}
 49
 50typedef struct {
 51} NAME;
 52
 53%extend NAME {
 54  NAME() {
 55    return %new_instance(TYPE);
 56  }
 57  ~NAME() {
 58    if ($self) %delete($self);
 59  }
 60}
 61
 62%extend NAME {
 63
 64  void assign(TYPE value) {
 65    *$self = value;
 66  }
 67  TYPE value() {
 68    return *$self;
 69  }
 70  TYPE * cast() {
 71    return $self;
 72  }
 73  static NAME * frompointer(TYPE *t) {
 74    return (NAME *) t;
 75  }
 76}
 77
 78%types(NAME = TYPE);
 79
 80%enddef
 81
 82/* ----------------------------------------------------------------------------- 
 83 * %pointer_functions(type,name)
 84 *
 85 * Create functions for allocating/deallocating pointers.   This can be used
 86 * if you don't want to create a proxy class or if the pointer is complex.
 87 *
 88 *    %pointer_functions(int, intp)
 89 *
 90 *    int add(int *x, int *y) { return *x + *y; }
 91 *
 92 * In python (with proxies)
 93 *
 94 *    >>> a = copy_intp(10)
 95 *    >>> intp_value(a)
 96 *    10
 97 *    >>> b = new_intp()
 98 *    >>> intp_assign(b,20)
 99 *    >>> print add(a,b)
100 *    30
101 *    >>> delete_intp(a)
102 *    >>> delete_intp(b)
103 * 
104 * ----------------------------------------------------------------------------- */
105
106%define %pointer_functions(TYPE,NAME)
107%{
108  static TYPE *new_##NAME() { 
109    return %new_instance(TYPE);
110  }
111  
112  static TYPE *copy_##NAME(TYPE value) { 
113    return %new_copy(value, TYPE);
114  }
115
116  static void delete_##NAME(TYPE *obj) { 
117    if (obj) %delete(obj);
118  }
119
120  static void NAME ##_assign(TYPE *obj, TYPE value) {
121    *obj = value;
122  }
123
124  static TYPE NAME ##_value(TYPE *obj) {
125    return *obj;
126  }
127%}
128
129TYPE *new_##NAME();
130TYPE *copy_##NAME(TYPE value);
131void  delete_##NAME(TYPE *obj);
132void  NAME##_assign(TYPE *obj, TYPE value);
133TYPE  NAME##_value(TYPE *obj);
134
135%enddef
136
137/* -----------------------------------------------------------------------------
138 * %pointer_cast(type1,type2,name)
139 *
140 * Generates a pointer casting function.
141 * ----------------------------------------------------------------------------- */
142
143%define %pointer_cast(TYPE1,TYPE2,NAME)
144%inline %{
145TYPE2 NAME(TYPE1 x) {
146   return %static_cast(x, TYPE2);
147}
148%}
149%enddef
150
151
152
153
154
155
156
157