|
From: <le...@us...> - 2006-12-19 15:08:39
|
Revision: 68
http://svn.sourceforge.net/qcell/?rev=68&view=rev
Author: lessm
Date: 2006-12-19 06:58:48 -0800 (Tue, 19 Dec 2006)
Log Message:
-----------
- Calculator and Renderer class add
Modified Paths:
--------------
trunk/qcell/baseheaders/BaseDataTypes.h
trunk/qcell/baseheaders/CalculationData.h
trunk/qcell/baseheaders/LocalFunction.h
trunk/qcell/baseheaders/Neighbourhood.h
trunk/qcell/basesources/CalculationData.cpp
trunk/qcell/basesources/Client.cpp
trunk/qcell/basesources/LocalFunction.cpp
trunk/qcell/basesources/Neighbourhood.cpp
trunk/qcell/bin/ServerConfig.xml
trunk/qcell/client/main.cpp
Added Paths:
-----------
trunk/qcell/baseheaders/Calculator.h
trunk/qcell/baseheaders/Renderer.h
trunk/qcell/basesources/Calculator.cpp
trunk/qcell/basesources/Renderer.cpp
Modified: trunk/qcell/baseheaders/BaseDataTypes.h
===================================================================
--- trunk/qcell/baseheaders/BaseDataTypes.h 2006-12-15 09:57:50 UTC (rev 67)
+++ trunk/qcell/baseheaders/BaseDataTypes.h 2006-12-19 14:58:48 UTC (rev 68)
@@ -1,18 +1,23 @@
#ifndef _BASE_DATA_TYPES
#define _BASE_DATA_TYPES
-class baseDataTypes
+#include <QObject>
+
+class baseDataTypes : QObject
{
+ Q_OBJECT
+private:
+protected:
public:
enum DATA_TYPES
{
- BOOL,
- CHAR,
- SHORT,
- INT,
- FLOAT,
- DOUBLE,
- NONE
+ BOOL = 0,
+ CHAR = 1,
+ SHORT = 2,
+ INT = 3,
+ FLOAT = 4,
+ DOUBLE = 5,
+ NONE = 6
};
};
Modified: trunk/qcell/baseheaders/CalculationData.h
===================================================================
--- trunk/qcell/baseheaders/CalculationData.h 2006-12-15 09:57:50 UTC (rev 67)
+++ trunk/qcell/baseheaders/CalculationData.h 2006-12-19 14:58:48 UTC (rev 68)
@@ -1,33 +1,29 @@
#ifndef _CALCULATION_DATA
#define _CALCULATION_DATA
+#include <QObject>
#include <string.h>
#include <QString>
+#include <QVector>
#include <QDomDocument>
#include <QDomElement>
#include "BaseDataTypes.h"
class CalculationData : public baseDataTypes
{
+ Q_OBJECT
private:
+protected:
DATA_TYPES dataType;
int sizeX, sizeY, sizeZ, sizeT;
- int backBufferSizeX, backBufferSizeY, backBufferSizeZ, backBufferSizeT;
- int dimension, size;
- char *data, *dataBorderFree;
+ int dimension, dataSize;
+ char *data;
+ bool haveForeignDataPointer;
- int minX, minY, minZ, minT;
- int maxX, maxY, maxZ, maxT;
-
- bool borderExist;
-
protected:
-//public:
- bool resize(const char *dataPointer=NULL);
+ void clearData(void);
+ bool resize(bool foreignDataPointer=0, char *dataPointer=NULL);
void * getAddressAt(int x, int y, int z, int t);
- void * getAddressAtBackBuffer(int x, int y, int z, int t);
- void calculateBackBufferSize(void);
- void copyData(void);
public:
@@ -38,67 +34,54 @@
int getValueAt_i(int x, int y);
int getValueAt_i(int x, int y, int z);
int getValueAt_i(int x, int y, int z, int t);
+ int getValueAt_i(QVector<int> pos);
- void setValueAt_i(int val, int x);
- void setValueAt_i(int val, int x, int y);
- void setValueAt_i(int val, int x, int y, int z);
- void setValueAt_i(int val, int x, int y, int z, int t);
+ void setValueAt(int val, int x);
+ void setValueAt(int val, int x, int y);
+ void setValueAt(int val, int x, int y, int z);
+ void setValueAt(int val, int x, int y, int z, int t);
+ void setValueAt(int val, QVector<int> pos);
double getValueAt_d(int x);
double getValueAt_d(int x, int y);
double getValueAt_d(int x, int y, int z);
double getValueAt_d(int x, int y, int z, int t);
+ double getValueAt_d(QVector<int> pos);
- void setValueAt_d(double val, int x);
- void setValueAt_d(double val, int x, int y);
- void setValueAt_d(double val, int x, int y, int z);
- void setValueAt_d(double val, int x, int y, int z, int t);
+ void setValueAt(double val, int x);
+ void setValueAt(double val, int x, int y);
+ void setValueAt(double val, int x, int y, int z);
+ void setValueAt(double val, int x, int y, int z, int t);
+ void setValueAt(double val, QVector<int> pos);
- void setDataType(baseDataTypes::DATA_TYPES type = baseDataTypes::DATA_TYPES::CHAR);
+ void setDataType(baseDataTypes::DATA_TYPES type = baseDataTypes::CHAR);
baseDataTypes::DATA_TYPES getDataType(void);
int getDataSize(void);
- bool resize(int x, const char *dataPointer=NULL);
- bool resize(int x, int y, const char *dataPointer=NULL);
- bool resize(int x, int y, int z, const char *dataPointer=NULL);
- bool resize(int x, int y, int z, int t, const char *dataPointer=NULL);
+ bool resize(int x, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(int x, int y, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(int x, int y, int z, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(int x, int y, int z, int t, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(QVector<int> newSize, char *dataPointer=NULL, bool foreignDataPointer=0);
int getSizeX(void);
int getSizeY(void);
int getSizeZ(void);
int getSizeT(void);
int getSizeInByte(void);
+ int getDimension(void);
const char *getDataPointer(void);
- const char *getBackBufferDataPointer(void);
- void fill(const char *dataPointer);
+ void fillData(const char *dataPointer);
+ void setForeignDataPointer(char *dataPointer);
-
- void setCalculationSpace(bool noDataCopy=0);
- void setCalculationSpace(int startX, int endX, bool noDataCopy=0);
- void setCalculationSpace(int startX, int startY, int endX, int endY, bool noDataCopy=0);
- void setCalculationSpace(int startX, int startY, int startZ, int endX, int endY, int endZ, bool noDataCopy=0);
- void setCalculationSpace(int startX, int startY, int startZ, int startT, int endX, int endY, int endZ, int endT, bool noDataCopy=0);
-
- bool haveBorder(void);
-
QString createXmlHeader(void);
- void setFromXmlString(QString *xmlString);
- void parseXmlElement(QDomElement *root);
+ bool setFromXmlString(QString *xmlString);
+ bool parseXmlElement(QDomElement *root);
- void setValueAt_i_Back(int val, int x);
- void setValueAt_i_Back(int val, int x, int y);
- void setValueAt_i_Back(int val, int x, int y, int z);
- void setValueAt_i_Back(int val, int x, int y, int z, int t);
+ CalculationData & operator = (CalculationData &cData);
- void setValueAt_d_Back(double val, int x);
- void setValueAt_d_Back(double val, int x, int y);
- void setValueAt_d_Back(double val, int x, int y, int z);
- void setValueAt_d_Back(double val, int x, int y, int z, int t);
- void fillData_i(int val=0);
- void fillData_d(double val=0.0);
-
};
#endif
Added: trunk/qcell/baseheaders/Calculator.h
===================================================================
--- trunk/qcell/baseheaders/Calculator.h (rev 0)
+++ trunk/qcell/baseheaders/Calculator.h 2006-12-19 14:58:48 UTC (rev 68)
@@ -0,0 +1,41 @@
+#ifndef _CALCULATOR_H
+#define _CALCULATOR_H
+
+#include "CalculationData.h"
+#include "Neighbourhood.h"
+#include "LocalFunction.h"
+#include <QByteArray>
+#include <QVector>
+#include <QObject>
+
+class Calculator : public CalculationData
+{
+ Q_OBJECT
+private:
+protected:
+ char *outData;
+ bool haveForeignOutputDataPointer;
+ QVector<int> outDataSize, calculationSpaceStart, calculationSpaceEnd;
+ Neighbourhood *neighbourhood;
+ LocalFunction *localfunction;
+
+protected:
+ void clearOutputData(void);
+ void copyData(void);
+ bool resizeOutputDataBuffer(bool dataCopy=0, char *dataPointer=NULL);
+
+public:
+ Calculator();
+ ~Calculator();
+
+ void setNeighbourhood(Neighbourhood *n);
+ void setLocalFunction(LocalFunction *f);
+
+ bool setCalculationSpace(QVector<int> start, QVector<int> end, bool dataCopy=0, char *foreignDataPointer=NULL);
+ int getOutputDataSizeInByte(void);
+ const char *getOutputDataPointer(void);
+
+ void calculate(void);
+};
+
+#endif
Modified: trunk/qcell/baseheaders/LocalFunction.h
===================================================================
--- trunk/qcell/baseheaders/LocalFunction.h 2006-12-15 09:57:50 UTC (rev 67)
+++ trunk/qcell/baseheaders/LocalFunction.h 2006-12-19 14:58:48 UTC (rev 68)
@@ -7,9 +7,10 @@
#include <QDomElement>
#include <QDomText>
#include <QStringList>
-
#include <math.h>
+//#include <Python.h>
+
class LocalFunction
{
@@ -19,16 +20,13 @@
{
SWITCH,
SUM,
- MIXED_SUM_SWITCH,
- PRODUCT,
- MIXED_PRODUCT_SWITCH,
+ SUM_AND_SWITCH,
SCRIPT
};
private:
QVector<int> valueTable;
- QVector<int> sumArguments;
- QVector<int> productArguments;
+ QVector< QVector<int> > sumArguments;
QVector<int> freeArguments;
FUNCTION_TYPE functionMode;
int numArg, maxArgVal, numElements;
@@ -38,15 +36,18 @@
//public:
void resizeValueTable(void);
int mostPopularValue(void);
+ QVector<int> calculateSums(QVector<int> &args);
+ QVector<int> calculateSwitchArguments(QVector<int> &args);
+ int calculateSumsIndex(QVector<int> args);
+ int calculateSwitchIndex(QVector<int> args);
+
QString valueTableToString(void);
QString valueTableToString(int fillValue);
-
QString sumArgumentsToString(void);
- QString productArgumentsToString(void);
void valueTableFromString(QString *string);
void sumArgumentsFromString(QString *string);
- void productArgumentsFromString(QString *string);
+
public:
LocalFunction();
@@ -54,11 +55,12 @@
void init(int numberOfArguments, int alphabetSize);
- // args is vector contein index of arguments to sum
+ // args is vector contein index of arguments to sum
+ void addSumArguments(QVector<int> args);
void setSumArguments(QVector<int> args);
+ void setFreeArguments(QVector<int> args);
+ void setFreeArguments(void);
- void setProductArguments(QVector<int> args);
-
void setSwitchFunction(void);
//
@@ -73,12 +75,13 @@
// fill value table with val
void setDefaultValue(int val);
- // first value is sum or product if function have sum or product arguments
- //
- bool addFunctionValue(int value, QVector<int> args);
+ // first value is sum if function have sum arguments
+ bool setFunctionValue(int value, int sum);
+ bool setFunctionValue(int value, QVector<int> args);
+ bool setFunctionValue(int value, int sum, QVector<int> freeArgs);
+ bool setFunctionValue(int value, QVector<int> sums, QVector<int> freeArgs);
int resolve(QVector<int> arg);
-
double resolve(QVector<double> arg);
QString toXmlString(void);
Modified: trunk/qcell/baseheaders/Neighbourhood.h
===================================================================
--- trunk/qcell/baseheaders/Neighbourhood.h 2006-12-15 09:57:50 UTC (rev 67)
+++ trunk/qcell/baseheaders/Neighbourhood.h 2006-12-19 14:58:48 UTC (rev 68)
@@ -58,8 +58,8 @@
void calculateOffsets(int sizeX, int sizeY, int sizeZ, int sizeT, baseDataTypes::DATA_TYPES type);
void resolveValues(const char *address);
+ QVector<int> valuesToVector_i(void);
+ QVector<double> valuesToVector_d(void);
};
-
-
#endif
Added: trunk/qcell/baseheaders/Renderer.h
===================================================================
--- trunk/qcell/baseheaders/Renderer.h (rev 0)
+++ trunk/qcell/baseheaders/Renderer.h 2006-12-19 14:58:48 UTC (rev 68)
@@ -0,0 +1,49 @@
+#ifndef _RENDERER_H
+#define _RENDERER_H
+
+#include "CalculationData.h"
+#include <QVector>
+#include <QColor>
+#include <QGLPixelBuffer>
+#include <QGLFramebufferObject>
+#include <QGLWidget>
+#include <QImage>
+#include <QPainter>
+#include <QObject>
+
+class Renderer : public CalculationData, public QGLWidget
+{
+ Q_OBJECT
+private:
+protected:
+ QVector<QColor> ColorMap;
+ QGLPixelBuffer *OGLpBuffer;
+ bool discretValues;
+
+ QImage render1D(void);
+ QImage render2D(void);
+ QImage render3D(void);
+
+public:
+ typedef enum RENDER_MODE
+ {
+ TEXT,
+ GRAPHICS
+ };
+
+ Renderer(QWidget *parent);
+ ~Renderer();
+
+ void setDataType(baseDataTypes::DATA_TYPES type = baseDataTypes::CHAR);
+
+ bool resize(int x, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(int x, int y, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(int x, int y, int z, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(int x, int y, int z, int t, char *dataPointer=NULL, bool foreignDataPointer=0);
+ bool resize(QVector<int> newSize, char *dataPointer=NULL, bool foreignDataPointer=0);
+
+ QImage renderToQImage(void);
+ void setColorInMap(int value, QColor color);
+};
+
+#endif
Modified: trunk/qcell/basesources/CalculationData.cpp
===================================================================
--- trunk/qcell/basesources/CalculationData.cpp 2006-12-15 09:57:50 UTC (rev 67)
+++ trunk/qcell/basesources/CalculationData.cpp 2006-12-19 14:58:48 UTC (rev 68)
@@ -1,164 +1,51 @@
#include "../baseheaders/CalculationData.h"
-bool CalculationData::resize(const char *dataPointer)
+void CalculationData::clearData(void)
{
- borderExist = 0;
- if(data)
- delete[] data;
+ if(!haveForeignDataPointer && data)
+ delete data;
- data = new char[getSizeInByte()];
- if(!data)
- return 0;
-
- if(dataBorderFree)
- {
- delete[] dataBorderFree;
- dataBorderFree = NULL;
- }
-
- if(dataPointer)
- fill(dataPointer);
- return 1;
+ data = NULL;
}
-void * CalculationData::getAddressAt(int x, int y, int z, int t)
+bool CalculationData::resize(bool foreignDataPointer, char *dataPointer)
{
- int dSize;
- if(dataType==baseDataTypes::DATA_TYPES::NONE)
- return NULL;
- switch(dataType)
+ clearData();
+ if(!foreignDataPointer)
{
- case baseDataTypes::DATA_TYPES::BOOL:
- dSize = sizeof(char);
- break;
+ data = new char[getSizeInByte()];
+ if(!data)
+ return 0;
- case baseDataTypes::DATA_TYPES::CHAR:
- dSize = 1;
- break;
+ if(dataPointer)
+ fillData(dataPointer);
- case baseDataTypes::DATA_TYPES::INT:
- dSize = sizeof(int);
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- dSize = sizeof(short);
- break;
-
- case baseDataTypes::DATA_TYPES::DOUBLE:
- dSize = sizeof(double);
- break;
- case baseDataTypes::DATA_TYPES::FLOAT:
- dSize = sizeof(float);
- break;
+ haveForeignDataPointer = 0;
}
-
- return data + dSize * (x + y * sizeX + z * sizeX * sizeY + t * sizeX * sizeY * sizeZ);
+ else
+ {
+ data = dataPointer;
+ haveForeignDataPointer = 1;
+ }
+ return 1;
}
-void * CalculationData::getAddressAtBackBuffer(int x, int y, int z, int t)
+void * CalculationData::getAddressAt(int x, int y, int z, int t)
{
int dSize;
if(dataType==baseDataTypes::DATA_TYPES::NONE)
return NULL;
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
- break;
-
- case baseDataTypes::DATA_TYPES::CHAR:
- dSize = sizeof(char);
- break;
-
- case baseDataTypes::DATA_TYPES::INT:
- dSize = sizeof(int);
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- dSize = sizeof(short);
- break;
-
- case baseDataTypes::DATA_TYPES::DOUBLE:
- dSize = sizeof(double);
- break;
- case baseDataTypes::DATA_TYPES::FLOAT:
- dSize = sizeof(float);
- break;
- }
-
- x -= minX;
- y -= minY;
- z -= minZ;
- t -= minT;
-
- if(t<0)
- t=0;
- if(z<0)
- z=0;
- if(y<0)
- y=0;
- if(x<0)
- x=0;
-
- //int index = dSize * (x + y * backBufferSizeX + z * backBufferSizeX * backBufferSizeY + t * backBufferSizeX * backBufferSizeY * backBufferSizeZ);
-
- return dataBorderFree + dSize * (x + y * backBufferSizeX + z * backBufferSizeX * backBufferSizeY + t * backBufferSizeX * backBufferSizeY * backBufferSizeZ);
+ return data + dataSize * (x + y * sizeX + z * sizeX * sizeY + t * sizeX * sizeY * sizeZ);
}
-void CalculationData::calculateBackBufferSize(void)
-{
- switch(dimension)
- {
- case 4:
- backBufferSizeT = (maxT - minT) + 1;
- case 3:
- backBufferSizeZ = (maxZ - minZ) + 1;
- case 2:
- backBufferSizeY = (maxY - minY) + 1;
- case 1:
- backBufferSizeX = (maxX - minX) + 1;
- }
-
- if(maxX<0)
- maxX=0;
-
- if(maxY<0)
- maxY=0;
-
- if(maxZ<0)
- maxZ=0;
-
- if(maxT<0)
- maxT=0;
-}
-
-void CalculationData::copyData(void)
-{
- int counterF=0, counterB=0;
- for(int t=minT;t<=maxT;++t)
- {
- for(int z=minZ;z<=maxZ;++z)
- {
- for(int y=minY;y<=maxY;++y)
- {
- counterF += minX * size;
- memcpy(dataBorderFree + counterB, data + counterF, backBufferSizeX * size);
- counterF += (sizeX - minX) * size;
- counterB += backBufferSizeX * size;
- }
- }
- }
-}
-
CalculationData::CalculationData()
{
dataType = baseDataTypes::DATA_TYPES::NONE;
sizeX = sizeY = sizeZ = sizeT = 0;
dimension = -1;
- size = -1;
+ dataSize = 0;
data = NULL;
- dataBorderFree = NULL;
- borderExist = 0;
+ haveForeignDataPointer = 0;
}
CalculationData::~CalculationData()
@@ -166,17 +53,8 @@
dataType = baseDataTypes::DATA_TYPES::NONE;
sizeX = sizeY = sizeZ = sizeT = 0;
dimension = -1;
- size = -1;
- if(data)
- {
- delete[] data;
- data = NULL;
- }
- if(dataBorderFree)
- {
- delete[] dataBorderFree;
- dataBorderFree = NULL;
- }
+ dataSize = 0;
+ clearData();
}
int CalculationData::getValueAt_i(int x)
@@ -184,19 +62,24 @@
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
- case baseDataTypes::DATA_TYPES::CHAR:
+ case baseDataTypes::CHAR:
return *((char *)getAddressAt(x, 0, 0, 0));
- case baseDataTypes::DATA_TYPES::INT:
+ case baseDataTypes::INT:
return *((int *)(getAddressAt(x, 0, 0, 0)));
- case baseDataTypes::DATA_TYPES::SHORT:
+ case baseDataTypes::SHORT:
return *((short *)(getAddressAt(x, 0, 0, 0)));
+
+ case baseDataTypes::FLOAT:
+ return (int)(*((float *)(getAddressAt(x, 0, 0, 0))));
+
+ case baseDataTypes::DOUBLE:
+ return (int)(*((double *)(getAddressAt(x, 0, 0, 0))));
}
- return -1;
+ return 0;
}
int CalculationData::getValueAt_i(int x, int y)
@@ -204,7 +87,6 @@
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
case baseDataTypes::DATA_TYPES::CHAR:
@@ -215,8 +97,13 @@
case baseDataTypes::DATA_TYPES::SHORT:
return *((short *)(getAddressAt(x, y, 0, 0)));
+ case baseDataTypes::FLOAT:
+ return (int)(*((float *)(getAddressAt(x, y, 0, 0))));
+
+ case baseDataTypes::DOUBLE:
+ return (int)(*((double *)(getAddressAt(x, y, 0, 0))));
}
- return -1;
+ return 0;
}
int CalculationData::getValueAt_i(int x, int y, int z)
@@ -224,7 +111,6 @@
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
case baseDataTypes::DATA_TYPES::CHAR:
@@ -235,8 +121,14 @@
case baseDataTypes::DATA_TYPES::SHORT:
return *((short *)(getAddressAt(x, y, z, 0)));
+
+ case baseDataTypes::FLOAT:
+ return (int)(*((float *)(getAddressAt(x, y, z, 0))));
+
+ case baseDataTypes::DOUBLE:
+ return (int)(*((double *)(getAddressAt(x, y, z, 0))));
}
- return -1;
+ return 0;
}
int CalculationData::getValueAt_i(int x, int y, int z, int t)
@@ -244,7 +136,6 @@
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
case baseDataTypes::DATA_TYPES::CHAR:
@@ -255,16 +146,38 @@
case baseDataTypes::DATA_TYPES::SHORT:
return *((short *)(getAddressAt(x, y, z, t)));
+
+ case baseDataTypes::FLOAT:
+ return (int)(*((float *)(getAddressAt(x, y, z, t))));
+
+ case baseDataTypes::DOUBLE:
+ return (int)(*((double *)(getAddressAt(x, y, z, t))));
+
}
- return -1;
+ return 0;
}
-void CalculationData::setValueAt_i(int val, int x)
+int CalculationData::getValueAt_i(QVector<int> pos)
{
+ switch(pos.size())
+ {
+ case 1:
+ return getValueAt_i(pos[0]);
+ case 2:
+ return getValueAt_i(pos[0], pos[1]);
+ case 3:
+ return getValueAt_i(pos[0], pos[1], pos[2]);
+ case 4:
+ return getValueAt_i(pos[0], pos[1], pos[2], pos[3]);
+ }
+ return 0;
+}
+
+void CalculationData::setValueAt(int val, int x)
+{
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
case baseDataTypes::DATA_TYPES::CHAR:
@@ -281,12 +194,11 @@
}
}
-void CalculationData::setValueAt_i(int val, int x, int y)
+void CalculationData::setValueAt(int val, int x, int y)
{
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
case baseDataTypes::DATA_TYPES::CHAR:
@@ -303,12 +215,11 @@
}
}
-void CalculationData::setValueAt_i(int val, int x, int y, int z)
+void CalculationData::setValueAt(int val, int x, int y, int z)
{
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
case baseDataTypes::DATA_TYPES::CHAR:
@@ -325,12 +236,11 @@
}
}
-void CalculationData::setValueAt_i(int val, int x, int y, int z, int t)
+void CalculationData::setValueAt(int val, int x, int y, int z, int t)
{
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
break;
case baseDataTypes::DATA_TYPES::CHAR:
@@ -351,56 +261,120 @@
{
switch(dataType)
{
+ case baseDataTypes::DATA_TYPES::BOOL:
+ break;
+
+ case baseDataTypes::DATA_TYPES::CHAR:
+ return (double)*((char *)getAddressAt(x, 0, 0, 0));
+
+ case baseDataTypes::DATA_TYPES::INT:
+ return (double)*((int *)(getAddressAt(x, 0, 0, 0)));
+
+ case baseDataTypes::DATA_TYPES::SHORT:
+ return (double)*((short *)(getAddressAt(x, 0, 0, 0)));
+
case baseDataTypes::DATA_TYPES::DOUBLE:
return *((double *)(getAddressAt(x, 0, 0, 0)));
case baseDataTypes::DATA_TYPES::FLOAT:
return *((float *)(getAddressAt(x, 0, 0, 0)));
}
- return -1;
+ return 0.0;
}
double CalculationData::getValueAt_d(int x, int y)
{
switch(dataType)
{
+ case baseDataTypes::DATA_TYPES::BOOL:
+ break;
+
+ case baseDataTypes::DATA_TYPES::CHAR:
+ return (double)*((char *)getAddressAt(x, y, 0, 0));
+
+ case baseDataTypes::DATA_TYPES::INT:
+ return (double)*((int *)(getAddressAt(x, y, 0, 0)));
+
+ case baseDataTypes::DATA_TYPES::SHORT:
+ return (double)*((short *)(getAddressAt(x, y, 0, 0)));
+
case baseDataTypes::DATA_TYPES::DOUBLE:
return *((double *)(getAddressAt(x, y, 0, 0)));
case baseDataTypes::DATA_TYPES::FLOAT:
return *((float *)(getAddressAt(x, y, 0, 0)));
}
- return -1;
+ return 0.0;
}
double CalculationData::getValueAt_d(int x, int y, int z)
{
switch(dataType)
{
+ case baseDataTypes::DATA_TYPES::BOOL:
+ break;
+
+ case baseDataTypes::DATA_TYPES::CHAR:
+ return (double)*((char *)getAddressAt(x, y, z, 0));
+
+ case baseDataTypes::DATA_TYPES::INT:
+ return (double)*((int *)(getAddressAt(x, y, z, 0)));
+
+ case baseDataTypes::DATA_TYPES::SHORT:
+ return (double)*((short *)(getAddressAt(x, y, z, 0)));
+
case baseDataTypes::DATA_TYPES::DOUBLE:
return *((double *)(getAddressAt(x, y, z, 0)));
case baseDataTypes::DATA_TYPES::FLOAT:
return *((float *)(getAddressAt(x, y, z, 0)));
}
- return -1;
+ return 0.0;
}
double CalculationData::getValueAt_d(int x, int y, int z, int t)
{
switch(dataType)
{
+ case baseDataTypes::DATA_TYPES::BOOL:
+ break;
+
+ case baseDataTypes::DATA_TYPES::CHAR:
+ return (double)*((char *)getAddressAt(x, y, z, t));
+
+ case baseDataTypes::DATA_TYPES::INT:
+ return (double)*((int *)(getAddressAt(x, y, z, t)));
+
+ case baseDataTypes::DATA_TYPES::SHORT:
+ return (double)*((short *)(getAddressAt(x, y, z, t)));
+
case baseDataTypes::DATA_TYPES::DOUBLE:
return *((double *)(getAddressAt(x, y, z, t)));
case baseDataTypes::DATA_TYPES::FLOAT:
return *((float *)(getAddressAt(x, y, z, t)));
}
- return -1;
+ return 0.0;
}
-void CalculationData::setValueAt_d(double val, int x)
+double CalculationData::getValueAt_d(QVector<int> pos)
{
+ switch(pos.size())
+ {
+ case 1:
+ return getValueAt_d(pos[0]);
+ case 2:
+ return getValueAt_d(pos[0], pos[1]);
+ case 3:
+ return getValueAt_d(pos[0], pos[1], pos[2]);
+ case 4:
+ return getValueAt_d(pos[0], pos[1], pos[2], pos[3]);
+ }
+ return 0.0;
+}
+
+void CalculationData::setValueAt(double val, int x)
+{
switch(dataType)
{
case baseDataTypes::DATA_TYPES::DOUBLE:
@@ -413,7 +387,7 @@
}
}
-void CalculationData::setValueAt_d(double val, int x, int y)
+void CalculationData::setValueAt(double val, int x, int y)
{
switch(dataType)
{
@@ -427,7 +401,7 @@
}
}
-void CalculationData::setValueAt_d(double val, int x, int y, int z)
+void CalculationData::setValueAt(double val, int x, int y, int z)
{
switch(dataType)
{
@@ -441,7 +415,7 @@
}
}
-void CalculationData::setValueAt_d(double val, int x, int y, int z, int t)
+void CalculationData::setValueAt(double val, int x, int y, int z, int t)
{
switch(dataType)
{
@@ -458,31 +432,31 @@
void CalculationData::setDataType(DATA_TYPES type)
{
dataType = type;
- size = -1;
+ dataSize = 0;
switch(dataType)
{
- case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
+ case baseDataTypes::BOOL:
+ dataSize = 0;
break;
- case baseDataTypes::DATA_TYPES::CHAR:
- size = 1;
+ case baseDataTypes::CHAR:
+ dataSize = sizeof(char);
break;
- case baseDataTypes::DATA_TYPES::DOUBLE:
- size = sizeof(double);
+ case baseDataTypes::DOUBLE:
+ dataSize = sizeof(double);
break;
- case baseDataTypes::DATA_TYPES::FLOAT:
- size = sizeof(float);
+ case baseDataTypes::FLOAT:
+ dataSize = sizeof(float);
break;
- case baseDataTypes::DATA_TYPES::INT:
- size = sizeof(int);
+ case baseDataTypes::INT:
+ dataSize = sizeof(int);
break;
- case baseDataTypes::DATA_TYPES::SHORT:
- size = sizeof(short);
+ case baseDataTypes::SHORT:
+ dataSize = sizeof(short);
break;
}
}
@@ -493,49 +467,65 @@
}
int CalculationData::getDataSize(void)
{
- return size;
+ return dataSize;
}
-bool CalculationData::resize(int x, const char *dataPointer)
+bool CalculationData::resize(int x, char *dataPointer, bool foreignDataPointer)
{
sizeX = x;
sizeY = 0;
sizeZ = 0;
sizeT = 0;
dimension = 1;
- return resize(dataPointer);
+ return resize(foreignDataPointer, dataPointer);
}
-bool CalculationData::resize(int x, int y, const char *dataPointer)
+bool CalculationData::resize(int x, int y, char *dataPointer, bool foreignDataPointer)
{
sizeX = x;
sizeY = y;
sizeZ = 0;
sizeT = 0;
dimension = 2;
- return resize(dataPointer);
+ return resize(foreignDataPointer, dataPointer);;
}
-bool CalculationData::resize(int x, int y, int z, const char *dataPointer)
+bool CalculationData::resize(int x, int y, int z, char *dataPointer, bool foreignDataPointer)
{
sizeX = x;
sizeY = y;
sizeZ = z;
sizeT = 0;
dimension = 3;
- return resize(dataPointer);
+ return resize(foreignDataPointer, dataPointer);;
}
-bool CalculationData::resize(int x, int y, int z, int t, const char *dataPointer)
+bool CalculationData::resize(int x, int y, int z, int t, char *dataPointer, bool foreignDataPointer)
{
sizeX = x;
sizeY = y;
sizeZ = z;
sizeT = t;
dimension = 4;
- return resize(dataPointer);
+ return resize(foreignDataPointer, dataPointer);;
}
+bool CalculationData::resize(QVector<int> newSize, char *dataPointer, bool foreignDataPointer)
+{
+ switch(newSize.size())
+ {
+ case 1:
+ return resize(newSize[0], dataPointer, foreignDataPointer);
+ case 2:
+ return resize(newSize[1], newSize[2], dataPointer, foreignDataPointer);
+ case 3:
+ return resize(newSize[1], newSize[2], newSize[3], dataPointer, foreignDataPointer);
+ case 4:
+ return resize(newSize[1], newSize[2], newSize[3], newSize[4], dataPointer, foreignDataPointer);
+ }
+ return 0;
+}
+
int CalculationData::getSizeX(void)
{
return sizeX;
@@ -561,19 +551,19 @@
switch(dataType)
{
case baseDataTypes::DATA_TYPES::BOOL:
- return (sizeX * sizeY * sizeZ * sizeT)/8;
+ return (sizeX * sizeY * sizeZ * sizeT)/8 + 1;
case baseDataTypes::DATA_TYPES::CHAR:
switch(dimension)
{
case 1:
- return sizeX;
+ return sizeX * sizeof(char);
case 2:
- return sizeX * sizeY;
+ return sizeX * sizeY * sizeof(char);
case 3:
- return sizeX * sizeY * sizeZ;
+ return sizeX * sizeY * sizeZ * sizeof(char);
case 4:
- return sizeX * sizeY * sizeZ * sizeT;
+ return sizeX * sizeY * sizeZ * sizeT * sizeof(char);
}
case baseDataTypes::DATA_TYPES::DOUBLE:
@@ -631,493 +621,64 @@
return 0;
}
-const char *CalculationData::getDataPointer(void)
+int CalculationData::getDimension(void)
{
- return data;
+ return dimension;
}
-const char *CalculationData::getBackBufferDataPointer(void)
+const char *CalculationData::getDataPointer(void)
{
- return dataBorderFree;
+ return data;
}
-void CalculationData::fill(const char *dataPointer)
+void CalculationData::fillData(const char *dataPointer)
{
if(data!=NULL)
- {
memcpy(data, dataPointer, getSizeInByte());
- }
}
-void CalculationData::setCalculationSpace(bool noDataCopy)
+void CalculationData::setForeignDataPointer(char *dataPointer)
{
- minX = 0;
- minY = 0;
- minZ = 0;
- minT = 0;
-
- maxX = sizeX - 1;
- maxY = sizeY - 1;
- maxZ = sizeZ - 1;
- maxT = sizeT - 1;
-
- borderExist = 0;
- if(dataBorderFree)
- {
- delete[] dataBorderFree;
- }
- dataBorderFree = new char[getSizeInByte()];
- calculateBackBufferSize();
- if(!noDataCopy)
- copyData();
+ clearData();
+ data = dataPointer;
}
-void CalculationData::setCalculationSpace(int startX, int endX, bool noDataCopy)
+QString CalculationData::createXmlHeader(void)
{
- minX = startX;
- maxX = endX;
- minY = 0;
- maxY = 0;
- minZ = 0;
- maxZ = 0;
- minT = 0;
- maxT = 0;
- borderExist = 1;
- if(dataBorderFree)
- {
- delete[] dataBorderFree;
- }
- dataBorderFree = new char[((maxX - minX) + 1) * size];
- calculateBackBufferSize();
- if(!noDataCopy)
- copyData();
+ return QString();
}
-void CalculationData::setCalculationSpace(int startX, int startY, int endX, int endY, bool noDataCopy)
+bool CalculationData::setFromXmlString(QString *xmlString)
{
- minX = startX;
- maxX = endX;
- minY = startY;
- maxY = endY;
- minZ = 0;
- maxZ = 0;
- minT = 0;
- maxT = 0;
- borderExist = 1;
- if(dataBorderFree)
- {
- delete[] dataBorderFree;
- }
- dataBorderFree = new char[(((maxX - minX) + 1) * ((maxY - minY) + 1)) * size];
- calculateBackBufferSize();
- if(!noDataCopy)
- copyData();
+ return 1;
}
-void CalculationData::setCalculationSpace(int startX, int startY, int startZ, int endX, int endY, int endZ, bool noDataCopy)
+bool CalculationData::parseXmlElement(QDomElement *root)
{
- minX = startX;
- maxX = endX;
- minY = startY;
- maxY = endY;
- minZ = startZ;
- maxZ = endZ;
- minT = 0;
- maxT = 0;
- borderExist = 1;
- if(dataBorderFree)
- {
- delete[] dataBorderFree;
- }
- dataBorderFree = new char[(((maxX - minX) + 1) * ((maxY - minY) + 1) * ((maxZ - minZ) + 1)) * size];
- calculateBackBufferSize();
- if(!noDataCopy)
- copyData();
+ return 1;
}
-void CalculationData::setCalculationSpace(int startX, int startY, int startZ, int startT, int endX, int endY, int endZ, int endT, bool noDataCopy)
+CalculationData & CalculationData::operator = (CalculationData &cData)
{
- minX = startX;
- maxX = endX;
- minY = startY;
- maxY = endY;
- minZ = startZ;
- maxZ = endZ;
- minT = startT;
- maxT = endT;
- borderExist = 1;
- if(dataBorderFree)
- {
- delete[] dataBorderFree;
- }
- dataBorderFree = new char[(((maxX - minX) + 1) * ((maxY - minY) + 1) * ((maxZ - minZ) + 1) * ((maxT - minT) + 1)) * size];
- calculateBackBufferSize();
- if(!noDataCopy)
- copyData();
-}
+ clearData();
+ setDataType(cData.getDataType());
-bool CalculationData::haveBorder(void)
-{
- return borderExist;
-}
-
-QString CalculationData::createXmlHeader(void)
-{
- QDomDocument doc;
- QDomElement root, element, subElementMin, subElementMax;
- root = doc.createElement("CalculationData");
- doc.appendChild(root);
- element = doc.createElement("Data");
- switch(dimension)
+ switch(cData.getDimension())
{
- case 4:
- element.setAttribute("t", sizeT);
- case 3:
- element.setAttribute("z", sizeZ);
- case 2:
- element.setAttribute("y", sizeY);
case 1:
- element.setAttribute("x", sizeX);
- }
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::BOOL:
- element.setAttribute("ContentType", "bool");
+ resize(cData.getSizeX());
break;
-
- case baseDataTypes::DATA_TYPES::CHAR:
- element.setAttribute("ContentType", "char");
+ case 2:
+ resize(cData.getSizeX(), cData.getSizeY());
break;
-
- case baseDataTypes::DATA_TYPES::DOUBLE:
- element.setAttribute("ContentType", "double");
+ case 3:
+ resize(cData.getSizeX(), cData.getSizeY(), cData.getSizeZ());
break;
-
- case baseDataTypes::DATA_TYPES::FLOAT:
- element.setAttribute("ContentType", "float");
+ case 4:
+ resize(cData.getSizeX(), cData.getSizeY(), cData.getSizeZ(), cData.getSizeT());
break;
-
- case baseDataTypes::DATA_TYPES::INT:
- element.setAttribute("ContentType", "bool");
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- element.setAttribute("ContentType", "short");
- break;
}
- root.appendChild(element);
- if(haveBorder())
- {
- element = doc.createElement("Border");
- subElementMin = doc.createElement("Min");
- subElementMax = doc.createElement("Max");
- switch(dimension)
- {
- case 4:
- subElementMin.setAttribute("t", minT);
- subElementMax.setAttribute("t", maxT);
- case 3:
- subElementMin.setAttribute("z", minZ);
- subElementMax.setAttribute("z", maxZ);
- case 2:
- subElementMin.setAttribute("y", minY);
- subElementMax.setAttribute("y", maxY);
- case 1:
- subElementMin.setAttribute("x", minX);
- subElementMax.setAttribute("x", maxX);
- }
- element.appendChild(subElementMin);
- element.appendChild(subElementMax);
- root.appendChild(element);
- }
- return doc.toString();
-}
-
-void CalculationData::setFromXmlString(QString *xmlString)
-{
- QDomDocument doc;
- QDomElement element;
- doc.setContent(*xmlString);
- element = doc.documentElement();
- parseXmlElement(&element);
-}
-
-void CalculationData::parseXmlElement(QDomElement *root)
-{
- QDomElement element, minElement, maxElement;
- QDomNode node, subNode;
-
- if(root->tagName()=="CalculationData")
- {
- node = root->firstChild();
- while(!node.isNull())
- {
- element = node.toElement();
- if(element.tagName()=="Data")
- {
- if(element.attribute("ContentType")=="bool")
- setDataType(baseDataTypes::DATA_TYPES::BOOL);
- else
- if(element.attribute("ContentType")=="char")
- setDataType(baseDataTypes::DATA_TYPES::CHAR);
- else
- if(element.attribute("ContentType")=="double")
- setDataType(baseDataTypes::DATA_TYPES::DOUBLE);
- else
- if(element.attribute("ContentType")=="float")
- setDataType(baseDataTypes::DATA_TYPES::FLOAT);
- else
- if(element.attribute("ContentType")=="int")
- setDataType(baseDataTypes::DATA_TYPES::INT);
- else
- if(element.attribute("ContentType")=="short")
- setDataType(baseDataTypes::DATA_TYPES::SHORT);
-
- if(element.hasAttribute("t"))
- resize(element.attribute("t").toInt(), element.attribute("z").toInt(), element.attribute("y").toInt(), element.attribute("x").toInt());
- else
- if(element.hasAttribute("z"))
- resize(element.attribute("z").toInt(), element.attribute("y").toInt(), element.attribute("x").toInt());
- else
- if(element.hasAttribute("y"))
- resize(element.attribute("y").toInt(), element.attribute("x").toInt());
- else
- resize(element.attribute("x").toInt());
-
- }
- if(element.tagName()=="Border")
- {
- subNode = element.firstChild();
- while(!subNode.isNull())
- {
- element = subNode.toElement();
- if(element.tagName()=="Min")
- minElement = subNode.toElement();
- else
- if(element.tagName()=="Max")
- maxElement = subNode.toElement();
- subNode = subNode.nextSibling();
- }
- switch(dimension)
- {
- case 1:
- setCalculationSpace(minElement.attribute("x").toInt(), maxElement.attribute("x").toInt());
- break;
- case 2:
- setCalculationSpace(minElement.attribute("x").toInt(), minElement.attribute("y").toInt(), maxElement.attribute("x").toInt(), maxElement.attribute("y").toInt());
- break;
- case 3:
- setCalculationSpace(minElement.attribute("x").toInt(), minElement.attribute("y").toInt(), minElement.attribute("z").toInt(), maxElement.attribute("x").toInt(), maxElement.attribute("y").toInt(), maxElement.attribute("z").toInt());
- break;
- case 4:
- setCalculationSpace(minElement.attribute("x").toInt(), minElement.attribute("y").toInt(), minElement.attribute("z").toInt(), minElement.attribute("t").toInt(), maxElement.attribute("x").toInt(), maxElement.attribute("y").toInt(), maxElement.attribute("z").toInt(), maxElement.attribute("t").toInt());
- break;
- }
- }
- node = node.nextSibling();
- }
- if(!haveBorder())
- setCalculationSpace();
- }
-}
-
-void CalculationData::setValueAt_i_Back(int val, int x)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
- break;
-
- case baseDataTypes::DATA_TYPES::CHAR:
- *((char *)getAddressAtBackBuffer(x, 0, 0, 0)) = (char)val;
- break;
-
- case baseDataTypes::DATA_TYPES::INT:
- *((int *)(getAddressAtBackBuffer(x, 0, 0, 0))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- *((short *)(getAddressAtBackBuffer(x, 0, 0, 0))) = (short)val;
- break;
- }
-}
-
-void CalculationData::setValueAt_i_Back(int val, int x, int y)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
- break;
-
- case baseDataTypes::DATA_TYPES::CHAR:
- *((char *)getAddressAtBackBuffer(x, y, 0, 0)) = (char)val;
- break;
-
- case baseDataTypes::DATA_TYPES::INT:
- *((int *)(getAddressAtBackBuffer(x, y, 0, 0))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- *((short *)(getAddressAtBackBuffer(x, y, 0, 0))) = (short)val;
- break;
- }
-}
-
-void CalculationData::setValueAt_i_Back(int val, int x, int y, int z)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
- break;
-
- case baseDataTypes::DATA_TYPES::CHAR:
- *((char *)getAddressAtBackBuffer(x, y, z, 0)) = (char)val;
- break;
-
- case baseDataTypes::DATA_TYPES::INT:
- *((int *)(getAddressAtBackBuffer(x, y, z, 0))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- *((short *)(getAddressAtBackBuffer(x, y, z, 0))) = (short)val;
- break;
- }
-}
-
-void CalculationData::setValueAt_i_Back(int val, int x, int y, int z, int t)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::BOOL:
- size = 0;
- break;
-
- case baseDataTypes::DATA_TYPES::CHAR:
- *((char *)getAddressAtBackBuffer(x, y, z, t)) = (char)val;
- break;
-
- case baseDataTypes::DATA_TYPES::INT:
- *((int *)(getAddressAtBackBuffer(x, y, z, t))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- *((short *)(getAddressAtBackBuffer(x, y, z, t))) = (short)val;
- break;
- }
-}
-
-void CalculationData::setValueAt_d_Back(double val, int x)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::DOUBLE:
- *((double *)(getAddressAtBackBuffer(x, 0, 0, 0))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::FLOAT:
- *((float *)(getAddressAtBackBuffer(x, 0, 0, 0))) = (float)val;
- break;
- }
-}
-
-void CalculationData::setValueAt_d_Back(double val, int x, int y)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::DOUBLE:
- *((double *)(getAddressAtBackBuffer(x, y, 0, 0))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::FLOAT:
- *((float *)(getAddressAtBackBuffer(x, y, 0, 0))) = (float)val;
- break;
- }
-}
-
-void CalculationData::setValueAt_d_Back(double val, int x, int y, int z)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::DOUBLE:
- *((double *)(getAddressAtBackBuffer(x, y, z, 0))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::FLOAT:
- *((float *)(getAddressAtBackBuffer(x, y, z, 0))) = (float)val;
- break;
- }
-}
-
-void CalculationData::setValueAt_d_Back(double val, int x, int y, int z, int t)
-{
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::DOUBLE:
- *((double *)(getAddressAtBackBuffer(x, y, z, t))) = val;
- break;
-
- case baseDataTypes::DATA_TYPES::FLOAT:
- *((float *)(getAddressAtBackBuffer(x, y, z, t))) = (float)val;
- break;
- }
-}
-
-void CalculationData::fillData_i(int val)
-{
- int dSize;
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::BOOL:
- break;
-
- case baseDataTypes::DATA_TYPES::CHAR:
- dSize = sizeof(char);
- for(int i=0;i<getSizeInByte();i+=dSize)
- {
- *((char *)(data + i)) = (char)val;
- }
- break;
-
- case baseDataTypes::DATA_TYPES::INT:
- dSize = sizeof(int);
- for(int i=0;i<getSizeInByte();i+=dSize)
- {
- *((int *)(data + i)) = val;
- }
- break;
-
- case baseDataTypes::DATA_TYPES::SHORT:
- dSize = sizeof(short);
- for(int i=0;i<getSizeInByte();i+=dSize)
- {
- *((short *)(data + i)) = (short)val;
- }
- break;
- }
-}
-
-void CalculationData::fillData_d(double val)
-{
- int dSize;
- switch(dataType)
- {
- case baseDataTypes::DATA_TYPES::DOUBLE:
- dSize = sizeof(double);
- for(int i=0;i<getSizeInByte();i+=dSize)
- {
- *((double *)(data + i)) = val;
- }
- break;
- case baseDataTypes::DATA_TYPES::FLOAT:
- dSize = sizeof(float);
- for(int i=0;i<getSizeInByte();i+=dSize)
- {
- *((float *)(data + i)) = (float)val;
- }
- break;
- }
-}
+ fillData(cData.getDataPointer());
+ return *this;
+}
\ No newline at end of file
Added: trunk/qcell/basesources/Calculator.cpp
===================================================================
--- trunk/qcell/basesources/Calculator.cpp (rev 0)
+++ trunk/qcell/basesources/Calculator.cpp 2006-12-19 14:58:48 UTC (rev 68)
@@ -0,0 +1,219 @@
+#include "../baseheaders/Calculator.h"
+
+void Calculator::clearOutputData(void)
+{
+ if(!haveForeignOutputDataPointer && outData)
+ delete outData;
+
+ outData = NULL;
+}
+
+void Calculator::copyData(void)
+{
+ int counter = 0;
+ for(int t=calculationSpaceStart[3];t<=calculationSpaceEnd[3];++t)
+ {
+ for(int z=calculationSpaceStart[2];z<=calculationSpaceEnd[2];++z)
+ {
+ for(int y=calculationSpaceStart[1];y<=calculationSpaceEnd[1];++y)
+ {
+ memcpy(outData + counter, getAddressAt(calculationSpaceStart[0], y, z, t), outDataSize[0]);
+ counter += outDataSize[0];
+ }
+ }
+ }
+}
+
+bool Calculator::resizeOutputDataBuffer(bool dataCopy, char *dataPointer)
+{
+ clearOutputData();
+ if(dataPointer==NULL)
+ {
+ haveForeignOutputDataPointer = 1;
+ outData = new char[getOutputDataSizeInByte()];
+ if(!outData)
+ return 0;
+
+ }
+ else
+ {
+ haveForeignOutputDataPointer = 0;
+ outData = dataPointer;
+ }
+ if(dataCopy)
+ copyData();
+
+ return 1;
+}
+
+Calculator::Calculator()
+{
+ outData = NULL;
+ haveForeignOutputDataPointer = 0;
+ outDataSize.resize(4);
+ calculationSpaceStart.resize(4);
+ calculationSpaceEnd.resize(4);
+ neighbourhood = NULL;
+ localfunction = NULL;
+}
+
+Calculator::~Calculator()
+{
+ clearOutputData();
+ haveForeignOutputDataPointer = 0;
+ neighbourhood = NULL;
+ localfunction = NULL;
+}
+
+void Calculator::setNeighbourhood(Neighbourhood *n)
+{
+ neighbourhood = n;
+ neighbourhood->calculateOffsets(sizeX, sizeY, sizeZ, sizeT, getDataType());
+}
+
+void Calculator::setLocalFunction(LocalFunction *f)
+{
+ localfunction = f;
+}
+
+bool Calculator::setCalculationSpace(QVector<int> start, QVector<int> end, bool dataCopy, char *foreignDataPointer)
+{
+ if( start.size() == end.size() && start.size()==dimension)
+ {
+ for(int i=0;i<4;++i)
+ {
+ if(i<dimension)
+ {
+ calculationSpaceStart[i] = start[i];
+ calculationSpaceEnd[i] = end[i];
+ outDataSize[i] = calculationSpaceEnd[i] - calculationSpaceStart[i] + 1;
+ }
+ else
+ {
+ calculationSpaceStart[i] = 0;
+ calculationSpaceEnd[i] = 0;
+ outDataSize[i] = 0;
+ }
+ }
+
+ return resizeOutputDataBuffer(dataCopy, foreignDataPointer);
+ }
+ return 0;
+}
+
+
+int Calculator::getOutputDataSizeInByte(void)
+{
+ switch(dataType)
+ {
+ case baseDataTypes::DATA_TYPES::BOOL:
+ return (outDataSize[0] * outDataSize[1] * outDataSize[2] * outDataSize[3])/8 + 1;
+
+ case baseDataTypes::DATA_TYPES::CHAR:
+ switch(dimension)
+ {
+ case 1:
+ return outDataSize[0] * sizeof(char);
+ case 2:
+ return outDataSize[0] * outDataSize[1] * sizeof(char);
+ case 3:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * sizeof(char);
+ case 4:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * outDataSize[3] * sizeof(char);
+ }
+
+ case baseDataTypes::DATA_TYPES::DOUBLE:
+ switch(dimension)
+ {
+ case 1:
+ return outDataSize[0] * sizeof(double);
+ case 2:
+ return outDataSize[0] * outDataSize[1] * sizeof(double);
+ case 3:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * sizeof(double);
+ case 4:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * outDataSize[3] * sizeof(double);
+ }
+
+ case baseDataTypes::DATA_TYPES::FLOAT:
+ switch(dimension)
+ {
+ case 1:
+ return outDataSize[0] * sizeof(float);
+ case 2:
+ return outDataSize[0] * outDataSize[1] * sizeof(float);
+ case 3:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * sizeof(float);
+ case 4:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * outDataSize[3] * sizeof(float);
+ }
+
+ case baseDataTypes::DATA_TYPES::INT:
+ switch(dimension)
+ {
+ case 1:
+ return outDataSize[0] * sizeof(int);
+ case 2:
+ return outDataSize[0] * outDataSize[1] * sizeof(int);
+ case 3:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * sizeof(int);
+ case 4:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * outDataSize[3] * sizeof(int);
+ }
+
+ case baseDataTypes::DATA_TYPES::SHORT:
+ switch(dimension)
+ {
+ case 1:
+ return outDataSize[0] * sizeof(short);
+ case 2:
+ return outDataSize[0] * outDataSize[1] * sizeof(short);
+ case 3:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * sizeof(short);
+ case 4:
+ return outDataSize[0] * outDataSize[1] * outDataSize[2] * outDataSize[3] * sizeof(short);
+ }
+ }
+ return 0;
+}
+
+const char *Calculator::getOutputDataPointer(void)
+{
+ return outData;
+}
+
+void Calculator::calculate(void)
+{
+ int counter = 0;
+ char temp[8];
+ for(int t=calculationSpaceStart[3];t<=calculationSpaceEnd[3];++t)
+ {
+ for(int z=calculationSpaceStart[2];z<=calculationSpaceEnd[2];++z)
+ {
+ for(int y=calculationSpaceStart[1];y<=calculationSpaceEnd[1];++y)
+ {
+ for(int x=calculationSpaceStart[0];x<=calculationSpaceEnd[0];++x)
+ {
+ neighbourhood->resolveValues((const char *)getAddressAt(x, y, z, t));
+ switch(dataType)
+ {
+ case baseDataTypes::BOOL:
+ case baseDataTypes::CHAR:
+ case baseDataTypes::SHORT:
+ case baseDataTypes::INT:
+ *((int *)temp) = localfunction->resolve(neighbourhood->valuesToVector_i());
+ break;
+ case baseDataTypes::FLOAT:
+ *((float *)temp) = (float)localfunction->resolve(neighbourhood->valuesToVector_d());
+ break;
+ case baseDataTypes::DOUBLE:
+ *((double *)temp) = localfunction->resolve(neighbourhood->valuesToVector_d());
+ break;
+ }
+ memcpy(outData + counter, temp, dataSize);
+ counter += dataSize;
+ }
+ }
+ }
+ }
+}
Modified: trunk/qcell/basesources/Client.cpp
===================================================================
--- trunk/qcell/basesources/Client.cpp 2006-12-15 09:57:50 UTC (rev 67)
+++ trunk/qcell/basesources/Client.cpp 2006-12-19 14:58:48 UTC (rev 68)
@@ -392,5 +392,4 @@
}
else
++pingTry;
-
}
Modified: trunk/qcell/basesources/LocalFunction.cpp
===================================================================
--- trunk/qcell/basesources/LocalFunction.cpp 2006-12-15 09:57:50 UTC (rev 67)
+++ trunk/qcell/basesources/LocalFunction.cpp 2006-12-19 14:58:48 UTC (rev 68)
@@ -5,22 +5,19 @@
switch(functionMode)
{
- case LocalFunction::FUNCTION_TYPE::PRODUCT:
- numElements = pow(maxArgVal - 1, productArguments.size()) + 1;
- break;
-
case LocalFunction::FUNCTION_TYPE::SUM:
- numElements = sumArguments.size() * (maxArgVal - 1) + 1;
+ numElements = 1;
+ for(int i=0;i<sumArguments.size();++i)
+ numElements *= sumArguments[i].size() * (maxArgVal - 1) + 1;
break;
- case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
- numElements = freeArguments.size() * maxArgVal * (sumArguments.size() * (maxArgVal - 1) + 1);
+ case LocalFunction::FUNCTION_TYPE::SUM_AND_SWITCH:
+ numElements = 1;
+ for(int i=0;i<sumArguments.size();++i)
+ numElements *= sumArguments[i].size() * (maxArgVal - 1) + 1;
+ numElements *= freeArguments.size() * maxArgVal;
break;
- case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
- numElements = freeArguments.size() * maxArgVal * (pow(maxArgVal - 1, productArguments.size()) + 1);
- break;
-
case LocalFunction::FUNCTION_TYPE::SWITCH:
numElements = numArg * maxArgVal;
break;
@@ -61,97 +58,76 @@
return out;
}
-QString LocalFunction::valueTableToString(void)
+QVector<int> LocalFunction::calculateSums(QVector<int> &args)
{
- int fillValue;
- QString data, index, value;
- fillValue = mostPopularValue();
- for(int i=0;i<numElements;i++)
+ int i, j;
+ QVector<int> out;
+ out.resize(sumArguments.size());
+ for(i=0;i<sumArguments.size();++i)
{
- if(valueTable[i]!=fillValue)
- {
- index.setNum(i);
- value.setNum(valueTable[i]);
- data = index + ":" + value + ";";
- }
+ out[i] = 0;
+ foreach(j, sumArguments[i])
+ out[i] += args[j];
}
- return data;
+ return out;
}
-QString LocalFunction::valueTableToString(int fillValue)
+QVector<int> LocalFunction::calculateSwitchArguments(QVector<int> &args)
{
- QString data, index, value;
- for(int i=0;i<numElements;i++)
- {
- if(valueTable[i]!=fillValue)
- {
- index.setNum(i);
- value.setNum(valueTable[i]);
- data += index + ":" + value + ";";
- }
- }
- return data;
+ int index;
+ QVector<int> out;
+ foreach(index, freeArguments)
+ out<<args[index];
+ return out;
}
-QString LocalFunction::sumArgumentsToString(void)
+int LocalFunction::calculateSumsIndex(QVector<int> args)
{
- int i;
- QString out, temp;
- foreach(i, sumArguments)
+ int mult, index = 0;
+ int switchFunctionSize = pow(maxArgVal, freeArguments.size());
+ for(int i=0;i<sumArguments.size();++i)
{
- temp.setNum(i);
- out += temp + ";";
+ mult = 1;
+ for(int j=i;j<sumArguments.size() - 1;++j)
+ mult *= sumArguments[j].size() * (maxArgVal - 1) + 1;
+ index += args[i] * mult * switchFunctionSize;
}
- return out;
+ return index;
}
-QString LocalFunction::productArgumentsToString(void)
+int LocalFunction::calculateSwitchIndex(QVector<int> args)
{
- int i;
- QString out, temp;
- foreach(i, productArguments)
- {
- temp.setNum(i);
- out += temp + ";";
- }
- return out;
+ int index = 0;
+ for(int i=0;i<freeArguments.size();++i)
+ index += args[i] * pow(maxArgVal, i);
+ return index;
}
-void LocalFunction::valueTableFromString(QString *string)
+QString LocalFunction::valueTableToString(void)
{
- QStringList splitList, element;
- QString temp;
- splitList = string->split(";", QString::SplitBehavior::SkipEmptyParts);
- foreach(temp, splitList)
- {
- element = temp.split(":");
- valueTable[element.at(0).toInt()] = element.at(1).toInt();
- }
+ return QString();
}
+QString LocalFunction::valueTableToString(int fillValue)
+{
+ return QString();
+}
-void LocalFunction::sumArgumentsFromString(QString *string)
+QString LocalFunction::sumArgumentsToString(void)
{
- QStringList splitList;
- QString temp;
- QVector<int> v;
- splitList = string->split(";", QString::SplitBehavior::SkipEmptyParts);
- foreach(temp, splitList)
- v.append(temp.toInt());
- setSumArguments(v);
+ return QString();
}
-void LocalFunction::productArgumentsFromString(QString *string)
+void LocalFunction::valueTableFromString(QString *string)
{
- QStringList splitList;
- QString temp;
- QVector<int> v;
- splitList = string->split(";", QString::SplitBehavior::SkipEmptyParts);
- foreach(temp, splitList)
- v.append(temp.toInt());
- setProductArguments(v);
}
+
+void LocalFunction::sumArgumentsFromString(QString *string)
+{
+}
+
+
LocalFunction::LocalFunction()
{
functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
@@ -168,21 +144,22 @@
maxArgVal = alphabetSize;
valueTable.clear();
sumArguments.clear();
- productArguments.clear();
freeArguments.clear();
functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
}
-void LocalFunction::setSumArguments(QVector<int> arg)
+void LocalFunction::addSumArguments(QVector<int> args)
{
- if(arg.size()<=numArg)
+ int index;
+ if(args.size()>0)
{
- sumArguments = arg;
- freeArguments.clear();
- valueTable.clear();
- for(int i=0;i<numArg;++i)
- if(!sumArguments.contains(i))
- freeArguments<<i;
+ sumArguments.append(args);
+ for(int i=0;i<args.size();++i)
+ {
+ index = freeArguments.indexOf(args[i]);
+ if(index>-1)
+ freeArguments.remove(index);
+ }
if(freeArguments.size()==0)
functionMode = LocalFunction::FUNCTION_TYPE::SUM;
@@ -190,34 +167,35 @@
if(freeArguments.size()==numArg)
functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
else
- functionMode = LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH;
+ functionMode = LocalFunction::FUNCTION_TYPE::SUM_AND_SWITCH;
}
}
-void LocalFunction::setProductArguments(QVector<int> arg)
+void LocalFunction::setSumArguments(QVector<int> arg)
{
if(arg.size()<=numArg)
{
- productArguments = arg;
+ sumArguments.clear();
+ sumArguments.append(arg);
freeArguments.clear();
valueTable.clear();
for(int i=0;i<numArg;++i)
- if(!productArguments.contains(i))
+ if(!sumArguments[0].contains(i))
freeArguments<<i;
+
if(freeArguments.size()==0)
- functionMode = LocalFunction::FUNCTION_TYPE::PRODUCT;
+ functionMode = LocalFunction::FUNCTION_TYPE::SUM;
else
if(freeArguments.size()==numArg)
functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
else
- functionMode = LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH;
+ functionMode = LocalFunction::FUNCTION_TYPE::SUM_AND_SWITCH;
}
}
void LocalFunction::setSwitchFunction(void)
{
sumArguments.clear();
- productArguments.clear();
freeArguments.clear();
valueTable.clear();
functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
@@ -244,11 +222,9 @@
switch(functionMode)
{
case LocalFunction::FUNCTION_TYPE::SUM:
- case LocalFunction::FUNCTION_TYPE::PRODUCT:
return 1;
- case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
- case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
+ case LocalFunction::FUNCTION_TYPE::SUM_AND_SWITCH:
return freeArguments.size() + 1;
case LocalFunction::FUNCTION_TYPE::SWITCH:
@@ -271,36 +247,84 @@
}
+bool LocalFunction::setFunctionValue(int value, int sum)
+{
+ int offset;
+ if(sumArguments.size()==0 || sumArguments.size()>1)
+ return 0;
+ if(valueTable.empty())
+ resizeValueTable();
+ switch(functionMode)
+ {
+ case LocalFunction::FUNCTION_TYPE::SUM:
+ valueTable[sum] = value;
+ break;
-bool LocalFunction::addFunctionValue(int value, QVector<int> args)
+ case LocalFunction::FUNCTION_TYPE::SUM_AND_SWITCH:
+ offset = sum * freeArguments.size() * maxArgVal;
+ for(int i=offset;i<freeArguments.size() * maxArgVal + offset;++i)
+ valueTable[i] = value;
+ break;
+
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+
+bool LocalFunction::setFunctionValue(int value, QVector<int> args)
{
- int i, index = 0, t;
if(valueTable.empty())
resizeValueTable();
switch(functionMode)
{
- case LocalFunction::FUNCTION_TYPE::SUM:
- case LocalFunction::FUNCTION_TYPE::PRODUCT:
- index = args[0];
+ case LocalFunction::SWITCH:
+ valueTable[calculateSwitchIndex(args)];
break;
- case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
-
- t = freeArguments.size();
- for(i=0;i<freeArguments.size();++i)
- index += args[i+1] * pow(maxArgVal, i);
- index += args[0] * pow(maxArgVal, freeArguments.size());
- break;
+ default:
+ return 0;
+ }
+ return 1;
+}
- case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
+bool LocalFunction::setFunctionValue(int value, int sum, QVector<int> freeArgs)
+{
+ int index;
+ if(sumArguments.size()==0 || sumArguments.size()>1)
+ return 0;
+ if(valueTable.empty())
+ resizeValueTable();
+ switch(functionMode)
+ {
+ case LocalFunction::SUM_AND_SWITCH:
+ index = calculateSwitchIndex(freeArgs);
+ index = sum * pow(maxArgVal, freeArguments.size()) + index;
+ valueTable[index] = value;
break;
+ default:
+ return 0;
+ }
+ return 1;
+}
- case LocalFunction::FUNCTION_TYPE::SWITCH:
- for(i=0;i<numArg;++i)
- index += args[i] * pow(maxArgVal, i);
- break;
+bool LocalFunction::setFunctionValue(int value, QVector<int> sums, QVector<int> freeArgs)
+{
+ int index;
+ if(sumArguments.size()==0 || freeArguments.size()==0)
+ return 0;
+ if(valueTable.empty())
+ resizeValueTable();
+ switch(functionMode)
+ {
+ case LocalFunction::SUM_AND_SWITCH:
+ index = calculateSumsIndex(sums) + calculateSwitchIndex(freeArgs);
+ valueTable[index] = value;
+ break;
+ default:
+ return 0;
}
- valueTable[index] = value;
return 1;
}
@@ -312,33 +336,17 @@
if(functionMode==LocalFunction::FUNCTION_TYPE::SCRIPT)
return -1;
+ QVector<int> sums, freeArgs;
+ sums = calculateSums(args);
+ freeArgs = calculateSwitchArguments(args);
+
switch(functionMode)
{
- case LocalFunction::FUNCTION_TYPE::SUM:
- case LocalFunction::FUNCTION_TYPE::PRODUCT:
- index = args[0];
- break;
-
- case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
- for(i=0;i<freeArguments.size();++i)
- index += args[freeArguments[i]] * pow(maxArgVal, i);
-
- temp = 0;
- for(i=0;i<sumArguments.size();++i)
- temp += args[sumArguments[i]];
-
- index += temp * pow(maxArgVal, freeArguments.size());
- break;
-
- case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
- break;
-
- case LocalFunction::FUNCTION_TYPE::SWITCH:
- for(i=0;i<numArg;++i)
- index += args[i] * pow(maxArgVal, i);
- break;
case LocalFunction::FUNCTION_TYPE::SCRIPT:
break;
+ default:
+ index = calculateSumsIndex(sums) + calculateSwitchIndex(freeArgs);
+ break;
}
return valueTable[index];
}
@@ -353,11 +361,6 @@
for (i=0;i<args.size();++i)
out += args[i];
break;
- case LocalFunction::FUNCTION_TYPE::PRODUCT:
- out = args[0];
- for (i=1;i<args.size();++i)
- out *= args[i];
- break;
case LocalFunction::FUNCTION_TYPE::SCRIPT:
break;
@@ -369,162 +372,16 @@
QString LocalFunction::toXmlString(void)
{
- int i, fillValue;
- QString data, index;
- QDomDocument dom;
- QDomElement root, element, subElement;
- QDomText textData = dom.createTextNode("");
- root = dom.createElement("LocalFunction");
- root.setAttribute("ArgumentsNumber", numArg);
- root.setAttribute("AlphabetSize", maxArgVal);
- fillValue = mostPopularValue();
- switch(functionMode)
- {
- case LocalFunction::FUNCTION_TYPE::SUM:
- element = dom.createElement("Sum");
- element.setAttribute("Fill", fillValue);
- data = valueTableToString(fillValue);
- textData.setData(data);
- element.appendChild(textData);
- root.appendChild(element);
- break;
-
- case LocalFunction::FUNCTION_TYPE::PRODUCT:
- element = dom.createElement("Product");
- element.setAttribute("Fill", fillValue);
- data = valueTableToString(fillValue);
- textData.setData(data);
- element.appendChild(textData);
- root.appendChild(element);
- break;
-
- case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
- element = dom.createElement("Mixed");
- element.setAttribute("Fill", fillValue);
- data = sumArgumentsToString();
- element.setAttribute("SumArguments", data);
- data = valueTableToString(fillValue);
- textData.setData(data);
- element.appendChild(textData);
- root.appendChild(element);
- break;
- case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
- element = dom.createElement("Mixed");
- element.setAttribute("Fill", fillValue);
- data = productArgumentsToString();
- element.setAttribute("ProductArguments", data);
- data = valueTableToString(fillValue);
- textData.setData(data);
- element.appendChild(textData);
- root.appendChild(element);
-
- break;
-
- case LocalFunction::FUNCTION_TYPE::SWITCH:
- element = dom.createElement("Switch");
- element.setAttribute("Fill", fillValue);
- data = valueTableToString(fillValue);
- textData.setData(data);
- element.appendChild(textData);
- root.appendChild(element);
- break;
-
- case LocalFunction::FUNCTION_TYPE::SCRIPT:
- element = dom.createElement("Script");
- textData.setData(script);
- element.appendChild(textData);
- root.appendChild(element);
- break;
- }
-
- dom.appendChild(root);
- return dom.toString();
+ return QString();
}
bool LocalFunction::fromXmlString(QString *xmlString)
{
- QDomDocument doc;
- QDomElement element;
- doc.setContent(*xmlString);
- element = doc.documentElement();
- return fromDomElement(&element);
+ return 1;
}
bool LocalFunction::fromDomElement(QDomElement *xmlElement)
{
- QDomElement element;
- QDomText domText;
- QString text;
- if(xmlElement->tagName()=="LocalFunction")
- {
- init(xmlElement->attribute("ArgumentsNumber").toInt(), xmlElement->attribute("AlphabetSize").toInt());
- element = xmlElement->firstChildElement();
- if(element.tagName()=="Sum")
- {
...
[truncated message content] |