itom 1.2.0
D:/git-itom/sources/itom/Qitom/python/pythonDataObject.h
00001 /* ********************************************************************
00002     itom software
00003     URL: http://www.uni-stuttgart.de/ito
00004     Copyright (C) 2013, Institut fuer Technische Optik (ITO),
00005     Universitaet Stuttgart, Germany
00006 
00007     This file is part of itom.
00008   
00009     itom is free software; you can redistribute it and/or modify it
00010     under the terms of the GNU Library General Public Licence as published by
00011     the Free Software Foundation; either version 2 of the Licence, or (at
00012     your option) any later version.
00013 
00014     itom is distributed in the hope that it will be useful, but
00015     WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library
00017     General Public Licence for more details.
00018 
00019     You should have received a copy of the GNU Library General Public License
00020     along with itom. If not, see <http://www.gnu.org/licenses/>.
00021 *********************************************************************** */
00022 
00023 #ifndef PYTHONDATAOBJECT
00024 #define PYTHONDATAOBJECT
00025 
00026 /* includes */
00027 #include <string>
00028 
00029 #ifndef ITOM_NPDATAOBJECT
00030     #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION //see comment in pythonNpDataObject.cpp
00031 #endif
00032 
00033 #ifndef Q_MOC_RUN
00034     #define PY_ARRAY_UNIQUE_SYMBOL itom_ARRAY_API //see numpy help ::array api :: Miscellaneous :: Importing the api (this line must before including global.h)
00035     #define NO_IMPORT_ARRAY
00036 
00037     //#define NPY_NO_DEPRECATED_API 0x00000007 //see comment in pythonNpDataObject.cpp
00038     //python
00039     // see http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=7f3f750596a105d48ea84ebfe1b1c4ca03e0bab3
00040     #if (defined _DEBUG) && (!defined linux)
00041         #undef _DEBUG
00042         #if (defined linux) | (defined CMAKE)
00043             #include "Python.h"
00044             #include "numpy/arrayobject.h"
00045         #else
00046             #include "Python.h"
00047             #include "../Lib/site-packages/numpy/core/include/numpy/arrayobject.h" //for numpy arrays
00048         #endif
00049         #define _DEBUG
00050     #else
00051         #ifdef linux
00052             #include "Python.h"
00053             #include "numpy/arrayobject.h"
00054         #else
00055             #include "Python.h"
00056             #include "../Lib/site-packages/numpy/core/include/numpy/arrayobject.h" //for numpy arrays
00057         #endif
00058     #endif
00059 #endif
00060 
00061 #include "../../DataObject/dataobj.h"
00062 //#include <qobject.h>
00063 
00064 namespace ito 
00065 {
00066 class PythonDataObject
00067 {
00068     public:
00069         //-------------------------------------------------------------------------------------------------
00070         // typedefs
00071         //------------------------------------------------------------------------------------------------- 
00072         typedef struct
00073         {
00074             PyObject_HEAD
00075             DataObject* dataObject;
00076             PyObject* base;
00077         }
00078         PyDataObject;
00079 
00080         typedef struct
00081         {
00082             char *name;
00083             int typeno;
00084         }
00085         PyDataObjectTypes;
00086 
00087         #define PyDataObject_Check(op) PyObject_TypeCheck(op, &PythonDataObject::PyDataObjectType)
00088 
00089         static inline void PyDataObject_SetBase( PyDataObject *op, PyObject *base )
00090         {
00091             PyObject* x = op->base; 
00092             Py_XINCREF(base); 
00093             op->base = base; 
00094             Py_XDECREF(x);
00095         }
00096         
00097         //-------------------------------------------------------------------------------------------------
00098         // constructor, deconstructor, alloc, dellaoc
00099         //------------------------------------------------------------------------------------------------- 
00100 
00101         static void PyDataObject_dealloc(PyDataObject *self);
00102         static PyObject *PyDataObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
00103         static int PyDataObject_init(PyDataObject *self, PyObject *args, PyObject *kwds);
00104 
00105         static int copyNpDataObjTags2DataObj(PyObject* npDataObject, DataObject* dataObj);
00106         static int parsePyObject2StdString(PyObject* pyObj, std::string &str);
00107 
00108         //-------------------------------------------------------------------------------------------------
00109         // general members
00110         //------------------------------------------------------------------------------------------------- 
00111         static PyObject *PyDataObject_name(PyDataObject *self);
00112 
00113         static PyObject* PyDataObject_repr(PyDataObject *self);
00114 
00115         static PyObject* PyDataObject_data(PyDataObject *self);
00116         static PyObject* PyDataObject_conj(PyDataObject *self);
00117         static PyObject* PyDataObject_conjugate(PyDataObject *self);
00118         static PyObject* PyDataObject_adj(PyDataObject *self);
00119         static PyObject* PyDataObject_adjugate(PyDataObject *self);
00120         static PyObject* PyDataObject_trans(PyDataObject *self);
00121         static PyObject* PyDataObject_copy(PyDataObject *self, PyObject* args);
00122         static PyObject* PyDataObject_astype(PyDataObject *self, PyObject* args, PyObject* kwds);
00123         static PyObject* PyDataObject_normalize(PyDataObject *self, PyObject* args, PyObject* kwds);
00124         static PyObject* PyDataObject_size(PyDataObject *self, PyObject* args);
00125         static PyObject* PyDataObject_makeContinuous(PyDataObject *self);
00126         static PyObject* PyDataObject_locateROI(PyDataObject *self);
00127         static PyObject* PyDataObject_adjustROI(PyDataObject *self, PyObject* args);
00128         static PyObject* PyDataObject_squeeze(PyDataObject *self, PyObject* args);
00129 
00130         static PyObject* PyDataObject_mul(PyDataObject *self, PyObject *args);
00131         static PyObject* PyDataObject_div(PyDataObject *self, PyObject *args);
00132 
00133         static PyObject* PyDataObject_reshape(PyDataObject *self, PyObject *args);
00134     
00135         // Get / Set metadata / objecttags
00136         static PyObject* PyDataObj_SetAxisOffset(PyDataObject *self, PyObject *args);
00137         static PyObject* PyDataObj_SetAxisScale(PyDataObject *self, PyObject *args);
00138         static PyObject* PyDataObj_SetAxisDescription(PyDataObject *self, PyObject *args);
00139         static PyObject* PyDataObj_SetAxisUnit(PyDataObject *self, PyObject *args);
00140 
00141         static PyObject* PyDataObj_SetTag(PyDataObject *self, PyObject *args);
00142         static PyObject* PyDataObj_DeleteTag(PyDataObject *self, PyObject *args);
00143         static PyObject* PyDataObj_TagExists(PyDataObject *self, PyObject *args);
00144         static PyObject* PyDataObj_GetTagListSize(PyDataObject *self);
00145         static PyObject* PyDataObj_AddToProtocol(PyDataObject *self, PyObject *args);
00146 
00147         // end tags
00148 
00149         static PyObject* PyDataObject_RichCompare(PyDataObject *self, PyObject *other, int cmp_op);
00150 
00151         static PyGetSetDef PyDataObject_getseters[];
00152         static PyObject* PyDataObj_GetDims(PyDataObject *self, void *closure);
00153         static PyObject* PyDataObj_GetType(PyDataObject *self, void *closure);
00154         static PyObject* PyDataObj_GetShape(PyDataObject *self, void *closure);
00155         static PyObject* PyDataObj_GetContinuous(PyDataObject *self, void *closure);
00156 
00157         static PyObject* PyDataObject_getTagDict(PyDataObject *self, void *clousure);
00158 
00159         static PyObject* PyDataObject_getTags(PyDataObject *self, void *closure);
00160         static int PyDataObject_setTags(PyDataObject *self, PyObject *value, void *closure);
00161         static PyObject* PyDataObject_getAxisScales(PyDataObject *self, void *closure);
00162         static int PyDataObject_setAxisScales(PyDataObject *self, PyObject *value, void *closure);
00163         static PyObject* PyDataObject_getAxisOffsets(PyDataObject *self, void *closure);
00164         static int PyDataObject_setAxisOffsets(PyDataObject *self, PyObject *value, void *closure);
00165         static PyObject* PyDataObject_getAxisDescriptions(PyDataObject *self, void *closure);
00166         static int PyDataObject_setAxisDescriptions(PyDataObject *self, PyObject *value, void *closure);
00167         static PyObject* PyDataObject_getAxisUnits(PyDataObject *self, void *closure);
00168         static int PyDataObject_setAxisUnits(PyDataObject *self, PyObject *value, void *closure);
00169         static PyObject* PyDataObject_getValueUnit(PyDataObject *self, void *closure);
00170         static int PyDataObject_setValueUnit(PyDataObject *self, PyObject *value, void *closure);
00171         static PyObject* PyDataObject_getValueDescription(PyDataObject *self, void *closure);
00172         static int PyDataObject_setValueDescription(PyDataObject *self, PyObject *value, void *closure);
00173         static PyObject* PyDataObject_getValueScale(PyDataObject *self, void *closure);
00174         static PyObject* PyDataObject_getValueOffset(PyDataObject *self, void *closure);
00175         
00176         static int PyDataObject_setXYRotationalMatrix(PyDataObject *self, PyObject *value, void *closure);        
00177         static PyObject* PyDataObject_getXYRotationalMatrix(PyDataObject *self, void *closure);
00178 
00179         static PyObject* PyDataObject_getValue(PyDataObject *self, void *closure);
00180         static int PyDataObject_setValue(PyDataObject *self, PyObject *value, void *closure);
00181 
00182         static PyObject* PyDataObj_Array_StructGet(PyDataObject *self);
00183         static PyObject* PyDataObj_Array_Interface(PyDataObject *self);
00184         static PyObject* PyDataObj_Array_(PyDataObject *self, PyObject *args);
00185 
00186         static PyObject* PyDataObj_ToGray(PyDataObject *self, PyObject *args, PyObject *kwds);
00187 
00188         static PyObject* PyDataObj_ToList(PyDataObject *self);
00189         static PyObject* PyDataObj_At(ito::DataObject *dataObj, unsigned int *idx);
00190         static PyObject* PyDataObj_At(ito::DataObject *dataObj, int continuousIdx);
00191         static PyObject* PyDataObj_ToListRecursive(ito::DataObject *dataObj, unsigned int *currentIdx, int iterationIndex);
00192 
00193 
00194         static void PyDataObj_Capsule_Destructor(PyObject* capsule); //called if capsule (dataObject exported by __array__struct_) is destroyed
00195 
00196         static PyObject* PyDataObj_Reduce(PyDataObject *self, PyObject *args);
00197         static PyObject* PyDataObj_SetState(PyDataObject *self, PyObject *args);
00198 
00199         //-------------------------------------------------------------------------------------------------
00200         // number protocol
00201         //
00202         // python note: Binary and ternary functions must check the type of all their operands, and implement 
00203         //    the necessary conversions (at least one of the operands is an instance of the defined type). 
00204         //    If the operation is not defined for the given operands, binary and ternary functions must return 
00205         //    Py_NotImplemented, if another error occurred they must return NULL and set an exception.
00206         //------------------------------------------------------------------------------------------------- 
00207         static PyObject* PyDataObj_nbAdd(PyObject* o1, PyObject* o2);
00208         static PyObject* PyDataObj_nbSubtract(PyObject* o1, PyObject* o2);
00209         static PyObject* PyDataObj_nbMultiply(PyObject* o1, PyObject* o2);
00210         static PyObject* PyDataObj_nbRemainder(PyObject* o1, PyObject* o2);
00211         static PyObject* PyDataObj_nbDivmod(PyObject* o1, PyObject* o2);
00212         static PyObject* PyDataObj_nbPower(PyObject* o1, PyObject* o2, PyObject* o3);
00213         static PyObject* PyDataObj_nbNegative(PyObject* o1);
00214         static PyObject* PyDataObj_nbPositive(PyObject* o1);
00215         static PyObject* PyDataObj_nbAbsolute(PyObject* o1);
00216         static PyObject* PyDataObj_nbInvert(PyObject* o1);
00217         static PyObject* PyDataObj_nbLshift(PyObject* o1, PyObject* o2);
00218         static PyObject* PyDataObj_nbRshift(PyObject* o1, PyObject* o2);
00219         static PyObject* PyDataObj_nbAnd(PyObject* o1, PyObject* o2);
00220         static PyObject* PyDataObj_nbXor(PyObject* o1, PyObject* o2);
00221         static PyObject* PyDataObj_nbOr(PyObject* o1, PyObject* o2);
00222 
00223         static PyObject* PyDataObj_nbInplaceAdd(PyObject* o1, PyObject* o2);
00224         static PyObject* PyDataObj_nbInplaceSubtract(PyObject* o1, PyObject* o2);
00225         static PyObject* PyDataObj_nbInplaceMultiply(PyObject* o1, PyObject* o2);
00226         static PyObject* PyDataObj_nbInplaceRemainder(PyObject* o1, PyObject* o2);
00227         static PyObject* PyDataObj_nbInplacePower(PyObject* o1, PyObject* o2, PyObject* o3);
00228         static PyObject* PyDataObj_nbInplaceLshift(PyObject* o1, PyObject* o2);
00229         static PyObject* PyDataObj_nbInplaceRshift(PyObject* o1, PyObject* o2);
00230         static PyObject* PyDataObj_nbInplaceAnd(PyObject* o1, PyObject* o2);
00231         static PyObject* PyDataObj_nbInplaceXor(PyObject* o1, PyObject* o2);
00232         static PyObject* PyDataObj_nbInplaceOr(PyObject* o1, PyObject* o2);
00233 
00234         //-------------------------------------------------------------------------------------------------
00235         // iterator protocol
00236         //-------------------------------------------------------------------------------------------------
00237         static PyObject* PyDataObj_getiter(PyDataObject* self); //getiterfunc tp_iter;
00238 
00239         //-------------------------------------------------------------------------------------------------
00240         // mapping protocol
00241         //------------------------------------------------------------------------------------------------- 
00242         static int PyDataObj_mappingLength(PyDataObject* self);
00243         static PyObject* PyDataObj_mappingGetElem(PyDataObject* self, PyObject* key);
00244         static int PyDataObj_mappingSetElem(PyDataObject* self, PyObject* key, PyObject* value);
00245 
00246         //-------------------------------------------------------------------------------------------------
00247         // type structures
00248         //------------------------------------------------------------------------------------------------- 
00249         static PyMemberDef PyDataObject_members[];
00250         static PyMethodDef PyDataObject_methods[];
00251         static PyTypeObject PyDataObjectType;
00252         static PyModuleDef PyDataObjectModule;
00253 
00254         static PyNumberMethods PyDataObject_numberProtocol;
00255         static PyMappingMethods PyDataObject_mappingProtocol;
00256 
00257         //-------------------------------------------------------------------------------------------------
00258         // helper methods
00259         //-------------------------------------------------------------------------------------------------    
00260         static RetVal PyDataObj_ParseCreateArgs(PyObject *args, PyObject *kwds, int &typeno, std::vector<unsigned int> &dims, unsigned char &continuous);
00261 
00262         static PyDataObjectTypes PyDataObject_types[];
00263         static int typeNameToNumber(const char *name);
00264         static char* typeNumberToName(int typeno);
00265 
00266         static PyDataObject* createEmptyPyDataObject();
00267 
00268         static bool checkPyDataObject(int number, PyObject* o1 = NULL, PyObject* o2 = NULL, PyObject* o3 = NULL);
00269 
00270         static RetVal parseTypeNumber(int typeno, char &typekind, int &itemsize);
00271         static int parseTypeNumberInverse(char typekind, int itemsize);
00272         static int getTypenumOfCompatibleType(char typekind, int itemsize);
00273 
00274         //-------------------------------------------------------------------------------------------------
00275         // static type methods
00276         //-------------------------------------------------------------------------------------------------
00277         //static PyObject* PyDataObj_StaticArange(PyDataObject *self, PyObject *args);
00278         static PyObject* PyDataObj_StaticZeros(PyObject *self, PyObject *args, PyObject *kwds);
00279         static PyObject* PyDataObj_StaticOnes(PyObject *self, PyObject *args, PyObject *kwds);
00280         static PyObject* PyDataObj_StaticRand(PyObject *self, PyObject *args, PyObject *kwds);
00281         static PyObject* PyDataObj_StaticRandN(PyObject *self, PyObject *args, PyObject *kwds);
00282         static PyObject* PyDataObj_StaticEye(PyObject *self, PyObject *args /*, PyObject *kwds*/);
00283 
00284 
00285         //#################################################################################################
00286         // ITERATOR METHODS
00287         //#################################################################################################
00288 
00289         typedef struct
00290         {
00291             PyObject_HEAD
00292             ito::DObjConstIterator it;
00293             ito::DObjConstIterator itEnd;
00294             Py_ssize_t len;
00295             PyObject* base;
00296         }
00297         PyDataObjectIter;
00298 
00299         //-------------------------------------------------------------------------------------------------
00300         // constructor, deconstructor, alloc, dellaoc
00301         //------------------------------------------------------------------------------------------------- 
00302 
00303         static void PyDataObjectIter_dealloc(PyDataObjectIter *self);
00304         static PyObject *PyDataObjectIter_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
00305         static int PyDataObjectIter_init(PyDataObjectIter *self, PyObject *args, PyObject *kwds);
00306 
00307         static PyObject* PyDataObjectIter_iternext(PyDataObjectIter* self);
00308         static PyObject* PyDataObjectIter_len(PyDataObjectIter* self);
00309 
00310         //-------------------------------------------------------------------------------------------------
00311         // type structures
00312         //------------------------------------------------------------------------------------------------- 
00313         static PyMethodDef PyDataObjectIter_methods[];
00314         static PyTypeObject PyDataObjectIterType;
00315 };
00316 
00317 } //end namespace ito
00318 
00319 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends