BGE Python API
[blender.git] / source / gameengine / Expressions / PyObjectPlus.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef NO_EXP_PYTHON_EMBEDDING
31
32 #ifndef _adr_py_lib_h_                          // only process once,
33 #define _adr_py_lib_h_                          // even if multiply included
34
35 #ifndef __cplusplus                             // c++ only
36 #error Must be compiled with C++
37 #endif
38
39 #include "KX_Python.h"
40 #include "STR_String.h"
41
42 /*------------------------------
43  * Python defines
44 ------------------------------*/
45
46 /*
47    Py_RETURN_NONE
48    Python 2.4 macro.
49    defined here until we switch to 2.4
50    also in api2_2x/gen_utils.h 
51 */
52 #ifndef Py_RETURN_NONE
53 #define Py_RETURN_NONE  return Py_BuildValue("O", Py_None)
54 #endif
55 #ifndef Py_RETURN_FALSE
56 #define Py_RETURN_FALSE  return PyBool_FromLong(0)
57 #endif
58 #ifndef Py_RETURN_TRUE
59 #define Py_RETURN_TRUE  return PyBool_FromLong(1)
60 #endif
61
62 /*  for pre Py 2.5 */
63 #if PY_VERSION_HEX < 0x02050000
64 typedef int Py_ssize_t;
65 typedef Py_ssize_t (*lenfunc)(PyObject *);
66 #define PY_SSIZE_T_MAX INT_MAX
67 #define PY_SSIZE_T_MIN INT_MIN
68 #define PY_METHODCHAR char *
69 #else
70 /* Py 2.5 and later */
71 #define  intargfunc  ssizeargfunc
72 #define intintargfunc  ssizessizeargfunc
73 #define PY_METHODCHAR const char *
74 #endif
75
76 #include "descrobject.h"
77
78
79 static inline void Py_Fatal(const char *M) {
80         fprintf(stderr, "%s\n", M);
81         exit(-1);
82 };
83
84                                                                 // This must be the first line of each 
85                                                                 // PyC++ class
86 #define Py_Header \
87  public: \
88   static PyTypeObject   Type; \
89   static PyMethodDef    Methods[]; \
90   static PyAttributeDef Attributes[]; \
91   static PyParentObject Parents[]; \
92   virtual PyTypeObject *GetType(void) {return &Type;}; \
93   virtual PyParentObject *GetParents(void) {return Parents;}
94
95
96
97                                                                 // This defines the py_getattro_up macro
98                                                                 // which allows attribute and method calls
99                                                                 // to be properly passed up the hierarchy.
100
101 #define py_getattro_up(Parent) \
102         \
103         PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
104          \
105         if(descr) { \
106                 if (PyCObject_Check(descr)) { \
107                         return py_get_attrdef((void *)this, (const PyAttributeDef*)PyCObject_AsVoidPtr(descr)); \
108                 } else if (descr->ob_type->tp_descr_get) { \
109                         return PyCFunction_New(((PyMethodDescrObject *)descr)->d_method, (PyObject *)this); \
110                 } else { \
111                         fprintf(stderr, "unknown attribute type"); \
112                         return descr; \
113                 } \
114         } else { \
115                 PyErr_Clear(); \
116                 PyObject *rvalue= Parent::py_getattro(attr); \
117                  \
118                 if (strcmp(PyString_AsString(attr), "__dict__")==0) { \
119                         return py_getattr_dict(rvalue, Type.tp_dict); \
120                 } \
121                  \
122                 return rvalue; \
123         } \
124         return NULL;
125
126
127 /*
128  * nonzero values are an error for setattr
129  * however because of the nested lookups we need to know if the errors
130  * was because the attribute didnt exits of if there was some problem setting the value
131  */
132
133 #define PY_SET_ATTR_FAIL                 1
134 #define PY_SET_ATTR_MISSING     -1
135 #define PY_SET_ATTR_SUCCESS                      0
136
137 #define py_setattro_up(Parent) \
138         PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
139          \
140         if(descr) { \
141                 if (PyCObject_Check(descr)) { \
142                         const PyAttributeDef* attrdef= reinterpret_cast<const PyAttributeDef *>(PyCObject_AsVoidPtr(descr)); \
143                         if (attrdef->m_access == KX_PYATTRIBUTE_RO) { \
144                                 PyErr_Format(PyExc_AttributeError, "\"%s\" is read only", PyString_AsString(attr)); \
145                                 return PY_SET_ATTR_FAIL; \
146                         } \
147                         else { \
148                                 return py_set_attrdef((void *)this, attrdef, value); \
149                         } \
150                 } else { \
151                         PyErr_Format(PyExc_AttributeError, "\"%s\" cannot be set", PyString_AsString(attr)); \
152                         return PY_SET_ATTR_FAIL; \
153                 } \
154         } else { \
155                 PyErr_Clear(); \
156                 return Parent::py_setattro(attr, value); \
157         }
158
159
160 /**
161  * These macros are helpfull when embedding Python routines. The second
162  * macro is one that also requires a documentation string
163  */
164 #define KX_PYMETHOD(class_name, method_name)                    \
165         PyObject* Py##method_name(PyObject* self, PyObject* args, PyObject* kwds); \
166         static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \
167                 return ((class_name*) self)->Py##method_name(self, args, kwds);         \
168         }; \
169
170 #define KX_PYMETHOD_VARARGS(class_name, method_name)                    \
171         PyObject* Py##method_name(PyObject* self, PyObject* args); \
172         static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
173                 return ((class_name*) self)->Py##method_name(self, args);               \
174         }; \
175
176 #define KX_PYMETHOD_NOARGS(class_name, method_name)                     \
177         PyObject* Py##method_name(PyObject* self); \
178         static PyObject* sPy##method_name( PyObject* self) { \
179                 return ((class_name*) self)->Py##method_name(self);             \
180         }; \
181         
182 #define KX_PYMETHOD_O(class_name, method_name)                  \
183         PyObject* Py##method_name(PyObject* self, PyObject* value); \
184         static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
185                 return ((class_name*) self)->Py##method_name(self, value);              \
186         }; \
187
188 #define KX_PYMETHOD_DOC(class_name, method_name)                        \
189         PyObject* Py##method_name(PyObject* self, PyObject* args, PyObject* kwds); \
190         static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \
191                 return ((class_name*) self)->Py##method_name(self, args, kwds);         \
192         }; \
193     static const char method_name##_doc[]; \
194
195 #define KX_PYMETHOD_DOC_VARARGS(class_name, method_name)                        \
196         PyObject* Py##method_name(PyObject* self, PyObject* args); \
197         static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
198                 return ((class_name*) self)->Py##method_name(self, args);               \
199         }; \
200     static const char method_name##_doc[]; \
201
202 #define KX_PYMETHOD_DOC_O(class_name, method_name)                      \
203         PyObject* Py##method_name(PyObject* self, PyObject* value); \
204         static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
205                 return ((class_name*) self)->Py##method_name(self, value);              \
206         }; \
207     static const char method_name##_doc[]; \
208
209 #define KX_PYMETHOD_DOC_NOARGS(class_name, method_name)                 \
210         PyObject* Py##method_name(PyObject* self); \
211         static PyObject* sPy##method_name( PyObject* self) { \
212                 return ((class_name*) self)->Py##method_name(self);             \
213         }; \
214     static const char method_name##_doc[]; \
215
216
217 /* The line above should remain empty */
218 /**
219  * Method table macro (with doc)
220  */
221 #define KX_PYMETHODTABLE(class_name, method_name) \
222         {#method_name , (PyCFunction) class_name::sPy##method_name, METH_VARARGS, (PY_METHODCHAR)class_name::method_name##_doc}
223
224 #define KX_PYMETHODTABLE_O(class_name, method_name) \
225         {#method_name , (PyCFunction) class_name::sPy##method_name, METH_O, (PY_METHODCHAR)class_name::method_name##_doc}
226
227 #define KX_PYMETHODTABLE_NOARGS(class_name, method_name) \
228         {#method_name , (PyCFunction) class_name::sPy##method_name, METH_NOARGS, (PY_METHODCHAR)class_name::method_name##_doc}
229
230 /**
231  * Function implementation macro
232  */
233 #define KX_PYMETHODDEF_DOC(class_name, method_name, doc_string) \
234 const char class_name::method_name##_doc[] = doc_string; \
235 PyObject* class_name::Py##method_name(PyObject*, PyObject* args, PyObject*)
236
237 #define KX_PYMETHODDEF_DOC_VARARGS(class_name, method_name, doc_string) \
238 const char class_name::method_name##_doc[] = doc_string; \
239 PyObject* class_name::Py##method_name(PyObject*, PyObject* args)
240
241 #define KX_PYMETHODDEF_DOC_O(class_name, method_name, doc_string) \
242 const char class_name::method_name##_doc[] = doc_string; \
243 PyObject* class_name::Py##method_name(PyObject*, PyObject* value)
244
245 #define KX_PYMETHODDEF_DOC_NOARGS(class_name, method_name, doc_string) \
246 const char class_name::method_name##_doc[] = doc_string; \
247 PyObject* class_name::Py##method_name(PyObject*)
248
249 /**
250  * Attribute management
251  */
252 enum KX_PYATTRIBUTE_TYPE {
253         KX_PYATTRIBUTE_TYPE_BOOL,
254         KX_PYATTRIBUTE_TYPE_ENUM,
255         KX_PYATTRIBUTE_TYPE_SHORT,
256         KX_PYATTRIBUTE_TYPE_INT,
257         KX_PYATTRIBUTE_TYPE_FLOAT,
258         KX_PYATTRIBUTE_TYPE_STRING,
259         KX_PYATTRIBUTE_TYPE_DUMMY,
260         KX_PYATTRIBUTE_TYPE_FUNCTION,
261 };
262
263 enum KX_PYATTRIBUTE_ACCESS {
264         KX_PYATTRIBUTE_RW,
265         KX_PYATTRIBUTE_RO
266 };
267
268 struct KX_PYATTRIBUTE_DEF;
269 typedef int (*KX_PYATTRIBUTE_CHECK_FUNCTION)(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
270 typedef int (*KX_PYATTRIBUTE_SET_FUNCTION)(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
271 typedef PyObject* (*KX_PYATTRIBUTE_GET_FUNCTION)(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
272
273 typedef struct KX_PYATTRIBUTE_DEF {
274         const char *m_name;                             // name of the python attribute
275         KX_PYATTRIBUTE_TYPE m_type;             // type of value
276         KX_PYATTRIBUTE_ACCESS m_access; // read/write access or read-only
277         int m_imin;                                             // minimum value in case of integer attributes (for string: minimum string length)
278         int m_imax;                                             // maximum value in case of integer attributes (for string: maximum string length)
279         float m_fmin;                                   // minimum value in case of float attributes
280         float m_fmax;                                   // maximum value in case of float attributes
281         bool   m_clamp;                                 // enforce min/max value by clamping
282         size_t m_offset;                                // position of field in structure
283         size_t m_size;                                  // size of field for runtime verification (enum only)
284         size_t m_length;                                // length of array, 1=simple attribute
285         KX_PYATTRIBUTE_CHECK_FUNCTION m_checkFunction;  // static function to check the assignment, returns 0 if no error
286         KX_PYATTRIBUTE_SET_FUNCTION m_setFunction;      // static function to check the assignment, returns 0 if no error
287         KX_PYATTRIBUTE_GET_FUNCTION m_getFunction;      // static function to check the assignment, returns 0 if no error
288
289         // The following pointers are just used to have compile time check for attribute type.
290         // It would have been good to use a union but that would require C99 compatibility
291         // to initialize specific union fields through designated initializers.
292         struct {
293                 bool *m_boolPtr;
294                 short int *m_shortPtr;
295                 int *m_intPtr;
296                 float *m_floatPtr;
297                 STR_String *m_stringPtr;
298         } m_typeCheck;
299 } PyAttributeDef;
300
301 #define KX_PYATTRIBUTE_DUMMY(name) \
302         { name, KX_PYATTRIBUTE_TYPE_DUMMY, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL} }
303
304 #define KX_PYATTRIBUTE_BOOL_RW(name,object,field) \
305         { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL} }
306 #define KX_PYATTRIBUTE_BOOL_RW_CHECK(name,object,field,function) \
307         { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL} }
308 #define KX_PYATTRIBUTE_BOOL_RO(name,object,field) \
309         { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RO, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL} }
310
311 // enum field cannot be mapped to pointer (because we would need a pointer for each enum)
312 // use field size to verify mapping at runtime only, assuming enum size is equal to int size.
313 #define KX_PYATTRIBUTE_ENUM_RW(name,min,max,clamp,object,field) \
314         { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL} }
315 #define KX_PYATTRIBUTE_ENUM_RW_CHECK(name,min,max,clamp,object,field,function) \
316         { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL} }
317 #define KX_PYATTRIBUTE_ENUM_RO(name,object,field) \
318         { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL} }
319
320 #define KX_PYATTRIBUTE_SHORT_RW(name,min,max,clamp,object,field) \
321         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL} }
322 #define KX_PYATTRIBUTE_SHORT_RW_CHECK(name,min,max,clamp,object,field,function) \
323         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL} }
324 #define KX_PYATTRIBUTE_SHORT_RO(name,object,field) \
325         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL} }
326 #define KX_PYATTRIBUTE_SHORT_ARRAY_RW(name,min,max,clamp,object,field,length) \
327         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL} }
328 #define KX_PYATTRIBUTE_SHORT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
329         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL} }
330 #define KX_PYATTRIBUTE_SHORT_ARRAY_RO(name,object,field,length) \
331         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL} }
332 // SHORT_LIST
333 #define KX_PYATTRIBUTE_SHORT_LIST_RW(name,min,max,clamp,object,field,length) \
334         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL} }
335 #define KX_PYATTRIBUTE_SHORT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
336         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL} }
337 #define KX_PYATTRIBUTE_SHORT_LIST_RO(name,object,field,length) \
338         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL} }
339
340 #define KX_PYATTRIBUTE_INT_RW(name,min,max,clamp,object,field) \
341         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL} }
342 #define KX_PYATTRIBUTE_INT_RW_CHECK(name,min,max,clamp,object,field,function) \
343         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL} }
344 #define KX_PYATTRIBUTE_INT_RO(name,object,field) \
345         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL} }
346 #define KX_PYATTRIBUTE_INT_ARRAY_RW(name,min,max,clamp,object,field,length) \
347         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL} }
348 #define KX_PYATTRIBUTE_INT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
349         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL} }
350 #define KX_PYATTRIBUTE_INT_ARRAY_RO(name,object,field,length) \
351         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL} }
352 // INT_LIST
353 #define KX_PYATTRIBUTE_INT_LIST_RW(name,min,max,clamp,object,field,length) \
354         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL} }
355 #define KX_PYATTRIBUTE_INT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
356         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL} }
357 #define KX_PYATTRIBUTE_INT_LIST_RO(name,object,field,length) \
358         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL} }
359
360 // always clamp for float
361 #define KX_PYATTRIBUTE_FLOAT_RW(name,min,max,object,field) \
362         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL} }
363 #define KX_PYATTRIBUTE_FLOAT_RW_CHECK(name,min,max,object,field,function) \
364         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL} }
365 #define KX_PYATTRIBUTE_FLOAT_RO(name,object,field) \
366         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL} }
367 #define KX_PYATTRIBUTE_FLOAT_ARRAY_RW(name,min,max,object,field,length) \
368         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL} }
369 #define KX_PYATTRIBUTE_FLOAT_ARRAY_RW_CHECK(name,min,max,object,field,length,function) \
370         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL} }
371 #define KX_PYATTRIBUTE_FLOAT_ARRAY_RO(name,object,field,length) \
372         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL} }
373
374 #define KX_PYATTRIBUTE_STRING_RW(name,min,max,clamp,object,field) \
375         { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field} }
376 #define KX_PYATTRIBUTE_STRING_RW_CHECK(name,min,max,clamp,object,field,function) \
377         { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field} }
378 #define KX_PYATTRIBUTE_STRING_RO(name,object,field) \
379         { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field} }
380
381 #define KX_PYATTRIBUTE_RW_FUNCTION(name,object,getfunction,setfunction) \
382         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL} }
383 #define KX_PYATTRIBUTE_RO_FUNCTION(name,object,getfunction) \
384         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL} }
385 #define KX_PYATTRIBUTE_ARRAY_RW_FUNCTION(name,object,length,getfunction,setfunction) \
386         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0,f, false, 0, 0, length, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL} }
387 #define KX_PYATTRIBUTE_ARRAY_RO_FUNCTION(name,object,length,getfunction) \
388         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0,f, false, 0, 0, length, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL} }
389
390
391 /*------------------------------
392  * PyObjectPlus
393 ------------------------------*/
394 typedef PyTypeObject * PyParentObject;                          // Define the PyParent Object
395
396 class PyObjectPlus : public PyObject 
397 {                               // The PyObjectPlus abstract class
398         Py_Header;                                                      // Always start with Py_Header
399         
400 public:
401         PyObjectPlus(PyTypeObject *T);
402         
403         virtual ~PyObjectPlus();                                        // destructor
404         static void PyDestructor(PyObject *P)                           // python wrapper
405         {  
406                 delete ((PyObjectPlus *) P);  
407         };
408         
409 //      void INCREF(void) {
410 //                Py_INCREF(this);
411 //        };                            // incref method
412 //      void DECREF(void) {
413 //                Py_DECREF(this);
414 //        };                            // decref method
415         
416         virtual PyObject *py_getattro(PyObject *attr);                  // py_getattro method
417         static  PyObject *py_base_getattro(PyObject * self, PyObject *attr)     // This should be the entry in Type. 
418         {
419                 return ((PyObjectPlus*) self)->py_getattro(attr); 
420         }
421         
422         static PyObject*        py_get_attrdef(void *self, const PyAttributeDef *attrdef);
423         static int                      py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyObject *value);
424         
425 #if 0
426         static PyObject *py_getattro_self(const PyAttributeDef attrlist[], void *self, PyObject *attr);
427         static int py_setattro_self(const PyAttributeDef attrlist[], void *self, PyObject *attr, PyObject *value);
428 #endif
429         
430         virtual int py_delattro(PyObject *attr);
431         virtual int py_setattro(PyObject *attr, PyObject *value);               // py_setattro method
432         static  int py_base_setattro(PyObject *self, PyObject *attr, PyObject *value) // the PyType should reference this
433         {
434                 if (value==NULL)
435                         return ((PyObjectPlus*) self)->py_delattro(attr);
436                 
437                 return ((PyObjectPlus*) self)->py_setattro(attr, value); 
438         }
439         
440         virtual PyObject *py_repr(void);                                // py_repr method
441         static  PyObject *py_base_repr(PyObject *PyObj)                 // This should be the entry in Type.
442         {
443                 return ((PyObjectPlus*) PyObj)->py_repr();  
444         }
445         
446                                                                         // isA methods
447         bool isA(PyTypeObject *T);
448         bool isA(const char *mytypename);
449         PyObject *Py_isA(PyObject *value);
450         static PyObject *sPy_isA(PyObject *self, PyObject *value)
451         {
452                 return ((PyObjectPlus*)self)->Py_isA(value);
453         }
454 };
455
456 PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict);
457
458 #endif //  _adr_py_lib_h_
459
460 #endif //NO_EXP_PYTHON_EMBEDDING
461