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