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