00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013
00017
00019
00020
00021
00023
00024 #ifndef _PYMACROS_H
00025 #define _PYMACROS_H
00026
00027 #include <python.h>
00028
00029
00030
00031
00032
00033 typedef PyObject* PYOBJECT;
00034
00035 #define PYTHON_TYPE(_myClass) _myClass::m_PythonType
00036 #define PYTHON_METHODS(_myClass) _myClass::m_PyMethods
00037 #define PYTHON_METHOD_CALL(_myClass, _myMethod ) PyMethodCall_##_myClass##_myMethod
00038 #define PYTHON_METHOD_STCALL(_myClass, _myMethod ) StaticPyMethodCall_##_myClass##_myMethod
00039
00040 #define PYTHON_MODULE_OBJECT( _myModule ) PyModName_##_myModule
00041 #define PYTHON_MODULE_TYPE( _myModule ) PyModType_##_myModule
00042 #define PYTHON_MODULE_METHODS( _myModule ) PyModMethods_##_myModule
00043 #define PYTHON_MODULE_CALL( _myModule, _myMethod ) PyModCall_##_myModule##_myMethod
00044
00045 #define PYTHON_MODULE_INITIALIZE(_myClass) PyModuleInitialize##_myClass()
00046
00047 #define PYTHON_TYPE_BASE Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
00048 #define PYTHON_TYPE_FINAL Py_TPFLAGS_DEFAULT
00049
00050
00051
00052
00053
00054 #define DECLARE_PYTHON_HEADER \
00055 public: \
00056 static PyTypeObject m_PythonType; \
00057 static PyMethodDef m_PyMethods[]; \
00058 virtual PyTypeObject* PyGetPythonType(){ return &m_PythonType; };
00059
00060
00061
00062
00063
00064
00072 #define DECLARE_PYTHON_TYPE( _myClass, _className, _classDescription, _inheritance ) \
00073 PyTypeObject PYTHON_TYPE( _myClass ) = { \
00074 PyObject_HEAD_INIT(&PyType_Type) \
00075 0, \
00076 _className, sizeof(_myClass), 0, \
00077 EclipseObject::PyDestructor, 0, 0, 0, 0, \
00078 EclipseObject::_PyStringRep, \
00079 0, \
00080 0, \
00081 0, \
00082 0, \
00083 0, \
00084 0, \
00085 0, \
00086 0, \
00087 0, \
00088 _inheritance, \
00089 _classDescription, \
00090 0, \
00091 0, \
00092 0, \
00093 0, \
00094 0, \
00095 0, \
00096 PYTHON_METHODS(_myClass), \
00097 0, \
00098 0, \
00099 0, \
00100 0, \
00101 0, \
00102 0, \
00103 0, \
00104 0, \
00105 0, \
00106 0, \
00107 }
00108
00109
00116 #define DECLARE_PYTHON_MODULE_TYPE( _myModule, _moduleName ) \
00117 static PyTypeObject PYTHON_MODULE_TYPE( _myModule ) = { \
00118 PyObject_HEAD_INIT(&PyType_Type) \
00119 0, \
00120 _moduleName, sizeof(PYTHON_MODULE_OBJECT(_myModule)), 0, \
00121 }
00122
00123
00124
00125
00126
00132 #define DECLARE_PYTHON_OBJECT_METHOD( _className, _methodName ) \
00133 PYOBJECT PYTHON_METHOD_CALL(_className,_methodName)(PYOBJECT a_pSelf, PYOBJECT a_pArgs, PYOBJECT a_pKwds ); \
00134 static PYOBJECT PYTHON_METHOD_STCALL(_className,_methodName)(PYOBJECT a_pSelf, PYOBJECT a_pArgs, PYOBJECT a_pKwds){ \
00135 return ((_className*)a_pSelf)->PYTHON_METHOD_CALL(_className,_methodName)(a_pSelf,a_pArgs,a_pKwds); }; \
00136 static char _methodName##_doc[];\
00137
00138
00144 #define START_PYTHON_OBJECT_METHODS( _className ) \
00145 PyMethodDef _className::m_PyMethods [] = {
00146
00152 #define ADD_OBJECT_METHOD(_className,_methodName )\
00153 {#_methodName, (PyCFunction)PYTHON_METHOD_STCALL(_className,_methodName), METH_VARARGS, _className::_methodName##_doc }
00154
00158 #define END_PYTHON_OBJECT_METHODS() \
00159 { NULL, NULL }}
00160
00167 #define IMPLEMENT_PYTHON_OBJECT_METHOD( _className, _methodName, _desc ) \
00168 char _className::_methodName##_doc[] = _desc; \
00169 PYOBJECT _className::PYTHON_METHOD_CALL(_className,_methodName)(PYOBJECT a_pSelf, PYOBJECT a_pArgs, PYOBJECT a_pKwds )
00170
00171
00172
00173
00174
00182 #define DECLARE_PYTHON_MODULE( _moduleName ) \
00183 extern PyTypeObject PYTHON_MODULE_TYPE( _moduleName ); \
00184 extern PYOBJECT PYTHON_MODULE_INITIALIZE( _moduleName ); \
00185 typedef struct{ PyObject_HEAD; } PYTHON_MODULE_OBJECT(_moduleName);
00186
00193 #define PYTHON_MODULE_METHOD_NOARGS(_moduleName,_methodName)\
00194 static PyObject* PYTHON_MODULE_CALL(_moduleName,_methodName)(PYTHON_MODULE_OBJECT(_moduleName)* self)
00195
00202 #define PYTHON_MODULE_METHOD_VARARGS(_moduleName,_methodName)\
00203 static PyObject* PYTHON_MODULE_CALL(_moduleName,_methodName)(PYTHON_MODULE_OBJECT(_moduleName)* self, PyObject* args, PyObject* kwds)
00204
00208 #define START_PYTHON_MODULE_METHODS(_moduleName)\
00209 static PyMethodDef PYTHON_MODULE_METHODS(_moduleName) [] = {
00210
00214 #define END_PYTHON_MODULE_METHODS() \
00215 {NULL}}
00216
00224 #define ADD_MODULE_METHOD(_moduleName,_methodName,_description, _methodType )\
00225 {#_methodName, (PyCFunction)PYTHON_MODULE_CALL(_moduleName,_methodName), _methodType, _description }
00226
00233 #define DECLARE_PYTHON_MODULE_INITIALIZATION( _moduleName, _moduleNameStr ) \
00234 DECLARE_PYTHON_MODULE_TYPE( _moduleName, _moduleNameStr ); \
00235 PYOBJECT PYTHON_MODULE_INITIALIZE( _moduleName )
00236
00243 #define CREATE_PYTHON_MODULE( _moduleName, _moduleDesc, _newModuleObject ) \
00244 PYTHON_MODULE_TYPE( _moduleName ).ob_type = &PyType_Type; \
00245 if( PyType_Ready(&PYTHON_MODULE_TYPE( _moduleName )) < 0 ){ return NULL; } \
00246 PYOBJECT _newModuleObject = Py_InitModule3( #_moduleName, PYTHON_MODULE_METHODS(_moduleName), _moduleDesc ); \
00247 if( !_newModuleObject ){ return NULL; }
00248
00249
00250
00251
00252
00253
00254
00256 #define PYTHON_ERROR( _string ) \
00257 { PyErr_SetString( PyExc_TypeError, _string ); return NULL; }
00258
00259
00260
00261
00262
00269 #define PYTHON_ADD_ENUMERATION_TO_DICTIONARY( _pyDictionary, _enumValue, _enumName ) \
00270 { PYOBJECT pAsInt = PyInt_FromLong( _enumValue ); \
00271 PyDict_SetItemString( _pyDictionary, _enumName, pAsInt ); \
00272 Py_DECREF(pAsInt); \
00273 }
00274
00279 enum ePythonReturnValue
00280 {
00281 PythonReturn_True,
00282 PythonReturn_False,
00283 PythonReturn_None
00284 };
00285
00290 inline PYOBJECT PythonReturnValue( ePythonReturnValue a_returnValue )
00291 {
00292 switch( a_returnValue )
00293 {
00294 case PythonReturn_True:
00295 Py_INCREF( Py_True );
00296 return Py_True;
00297 break;
00298
00299 case PythonReturn_False:
00300 Py_INCREF( Py_False );
00301 return Py_False;
00302 break;
00303
00304
00305
00306 default:
00307 Py_INCREF( Py_None );
00308 return Py_None;
00309 break;
00310 }
00311 }
00312
00313
00314 #endif