[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [okteta] kasten/controllers/view/structures: structures: store array length function in AdditionalDa
From: Alex Richardson <arichardson.kde () googlemail ! com>
Date: 2013-03-12 23:40:12
Message-ID: 20130312234012.23510A60EC () git ! kde ! org
[Download RAW message or body]
Git commit 15a55ea357e2530a548236321b57d4300b8fe702 by Alex Richardson.
Committed on 12/03/2013 at 15:13.
Pushed by arichardson into branch 'master'.
structures: store array length function in AdditionalData aswell
M +1 -1 kasten/controllers/view/structures/datatypes/additionaldata.h
M +48 -0 kasten/controllers/view/structures/datatypes/array/abstractarraydata.cpp
M +3 -0 kasten/controllers/view/structures/datatypes/array/abstractarraydata.h
M +13 -69 kasten/controllers/view/structures/datatypes/array/arraydatainformation.cpp
M +2 -10 kasten/controllers/view/structures/datatypes/array/arraydatainformation.h
M +6 -7 kasten/controllers/view/structures/datatypes/datainformation.cpp
M +3 -3 kasten/controllers/view/structures/datatypes/datainformation.h
M +3 -3 kasten/controllers/view/structures/structtool.cpp
http://commits.kde.org/okteta/15a55ea357e2530a548236321b57d4300b8fe702
diff --git a/kasten/controllers/view/structures/datatypes/additionaldata.h \
b/kasten/controllers/view/structures/datatypes/additionaldata.h index \
5e70b89..54a712a 100644
--- a/kasten/controllers/view/structures/datatypes/additionaldata.h
+++ b/kasten/controllers/view/structures/datatypes/additionaldata.h
@@ -32,7 +32,7 @@ class AdditionalData
{
public:
enum AdditionalDataType {
- UpdateFunction, ValidationFunction, ValidationError
+ UpdateFunction, ValidationFunction, ValidationError, ArrayLengthFunction
};
explicit AdditionalData();
AdditionalData(const AdditionalData& data);
diff --git a/kasten/controllers/view/structures/datatypes/array/abstractarraydata.cpp \
b/kasten/controllers/view/structures/datatypes/array/abstractarraydata.cpp index \
d0b50c9..3cf8433 100644
--- a/kasten/controllers/view/structures/datatypes/array/abstractarraydata.cpp
+++ b/kasten/controllers/view/structures/datatypes/array/abstractarraydata.cpp
@@ -23,6 +23,9 @@
#include "abstractarraydata.h"
#include "arraydatainformation.h"
+#include "primitivearraydata.h"
+#include "complexarraydata.h"
+#include "../primitive/primitivedatainformation.h"
AbstractArrayData::AbstractArrayData(DataInformation* childType, \
ArrayDataInformation* parent) : mParent(parent), mChildType(childType)
@@ -41,3 +44,48 @@ void AbstractArrayData::setParent(ArrayDataInformation* parent)
mChildType->setParent(parent);
setNewParentForChildren();
}
+
+AbstractArrayData* AbstractArrayData::newArrayData(uint length, DataInformation* \
type, ArrayDataInformation* parent) +{
+ Q_CHECK_PTR(type);
+ if (!type->isPrimitive())
+ return new ComplexArrayData(length, type, parent);
+ PrimitiveDataInformation* data = type->asPrimitive();
+
+ switch (data->type().value)
+ {
+ case Type_Char:
+ return new PrimitiveArrayData<Type_Char>(length, data, parent);
+ case Type_Int8:
+ return new PrimitiveArrayData<Type_Int8>(length, data, parent);
+ case Type_Int16:
+ return new PrimitiveArrayData<Type_Int16>(length, data, parent);
+ case Type_Int32:
+ return new PrimitiveArrayData<Type_Int32>(length, data, parent);
+ case Type_Int64:
+ return new PrimitiveArrayData<Type_Int64>(length, data, parent);
+ case Type_UInt8:
+ return new PrimitiveArrayData<Type_UInt8>(length, data, parent);
+ case Type_UInt16:
+ return new PrimitiveArrayData<Type_UInt16>(length, data, parent);
+ case Type_UInt32:
+ return new PrimitiveArrayData<Type_UInt32>(length, data, parent);
+ case Type_UInt64:
+ return new PrimitiveArrayData<Type_UInt64>(length, data, parent);
+ case Type_Bool8:
+ return new PrimitiveArrayData<Type_Bool8>(length, data, parent);
+ case Type_Bool16:
+ return new PrimitiveArrayData<Type_Bool16>(length, data, parent);
+ case Type_Bool32:
+ return new PrimitiveArrayData<Type_Bool32>(length, data, parent);
+ case Type_Bool64:
+ return new PrimitiveArrayData<Type_Bool64>(length, data, parent);
+ case Type_Float:
+ return new PrimitiveArrayData<Type_Float>(length, data, parent);
+ case Type_Double:
+ return new PrimitiveArrayData<Type_Double>(length, data, parent);
+ default:
+ // enum/bitfield/pointer need complex array data
+ return new ComplexArrayData(length, data, parent);
+ }
+}
diff --git a/kasten/controllers/view/structures/datatypes/array/abstractarraydata.h \
b/kasten/controllers/view/structures/datatypes/array/abstractarraydata.h index \
b8e9742..bdde8ad 100644
--- a/kasten/controllers/view/structures/datatypes/array/abstractarraydata.h
+++ b/kasten/controllers/view/structures/datatypes/array/abstractarraydata.h
@@ -81,6 +81,9 @@ public:
virtual QWidget* createChildEditWidget(uint index, QWidget* parent) const = 0;
virtual QVariant dataFromChildWidget(uint index, const QWidget* w) const = 0;
virtual void setChildWidgetData(uint index, QWidget* w) const = 0;
+
+ /** Takes ownership over @p type ! */
+ static AbstractArrayData* newArrayData(uint length, DataInformation* type, \
ArrayDataInformation* parent); protected:
virtual void setNewParentForChildren() = 0;
protected:
diff --git a/kasten/controllers/view/structures/datatypes/array/arraydatainformation.cpp \
b/kasten/controllers/view/structures/datatypes/array/arraydatainformation.cpp index \
b7451d0..519f28c 100644
--- a/kasten/controllers/view/structures/datatypes/array/arraydatainformation.cpp
+++ b/kasten/controllers/view/structures/datatypes/array/arraydatainformation.cpp
@@ -35,9 +35,13 @@
ArrayDataInformation::ArrayDataInformation(const QString& name, uint length, \
DataInformation* childType, DataInformation* parent, const QScriptValue& \
lengthFunction)
- : DataInformationWithDummyChildren(name, parent), \
mLengthFunction(lengthFunction) + : DataInformationWithDummyChildren(name, \
parent) {
- Q_ASSERT(!lengthFunction.isValid() || lengthFunction.isFunction());
+ if (lengthFunction.isValid())
+ {
+ Q_ASSERT(lengthFunction.isFunction());
+ setLengthFunction(lengthFunction);
+ }
if (length > MAX_LEN)
{
logWarn() << length << "exceeds maximum length of" << MAX_LEN
@@ -46,19 +50,15 @@ ArrayDataInformation::ArrayDataInformation(const QString& name, \
uint length, Dat }
Q_CHECK_PTR(childType);
childType->setParent(this);
- mData.reset(arrayDataFromType(length, childType));
+ mData.reset(AbstractArrayData::newArrayData(length, childType, this));
}
ArrayDataInformation::ArrayDataInformation(const ArrayDataInformation& d)
- : DataInformationWithDummyChildren(d), mData(0), \
mLengthFunction(d.mLengthFunction) + : DataInformationWithDummyChildren(d), \
mData(0) {
- if (d.mData)
- {
- uint length = d.mData->length();
- DataInformation* childType = \
static_cast<ComplexArrayData*>(d.mData.data())->childType();
- mData.reset(arrayDataFromType(length, childType->clone()));
- Q_CHECK_PTR(mData);
- }
+ uint length = d.mData->length();
+ DataInformation* childType = d.mData.data()->childType();
+ mData.reset(AbstractArrayData::newArrayData(length, childType->clone(), this));
}
ArrayDataInformation::~ArrayDataInformation()
@@ -97,7 +97,7 @@ void ArrayDataInformation::setArrayType(DataInformation* \
newChildType) {
//first create with length of 0, then change length to actual length (to \
ensure model is correct) topLevel->_childCountAboutToChange(this, len, 0);
- mData.reset(arrayDataFromType(0, newChildType));
+ mData.reset(AbstractArrayData::newArrayData(0, newChildType, this));
topLevel->_childCountChanged(this, len, 0);
topLevel->_childCountAboutToChange(this, 0, len);
@@ -107,7 +107,7 @@ void ArrayDataInformation::setArrayType(DataInformation* \
newChildType) else
{
//no need to emit the signals, which cause expensive model update
- mData.reset(arrayDataFromType(len, newChildType));
+ mData.reset(AbstractArrayData::newArrayData(len, newChildType, this));
//only the type of the array changed -> emit that this has changed data
topLevel->setChildDataChanged();
}
@@ -195,62 +195,6 @@ QScriptClass* \
ArrayDataInformation::scriptClass(ScriptHandlerInfo* handlerInfo) return \
handlerInfo->mArrayClass.data(); }
-AbstractArrayData* ArrayDataInformation::primitiveArrayFromType(uint length, \
PrimitiveDataInformation* data)
-{
- switch (data->type().value)
- {
- case Type_Char:
- return new PrimitiveArrayData<Type_Char>(length, data, this);
- case Type_Int8:
- return new PrimitiveArrayData<Type_Int8>(length, data, this);
- case Type_Int16:
- return new PrimitiveArrayData<Type_Int16>(length, data, this);
- case Type_Int32:
- return new PrimitiveArrayData<Type_Int32>(length, data, this);
- case Type_Int64:
- return new PrimitiveArrayData<Type_Int64>(length, data, this);
- case Type_UInt8:
- return new PrimitiveArrayData<Type_UInt8>(length, data, this);
- case Type_UInt16:
- return new PrimitiveArrayData<Type_UInt16>(length, data, this);
- case Type_UInt32:
- return new PrimitiveArrayData<Type_UInt32>(length, data, this);
- case Type_UInt64:
- return new PrimitiveArrayData<Type_UInt64>(length, data, this);
- case Type_Bool8:
- return new PrimitiveArrayData<Type_Bool8>(length, data, this);
- case Type_Bool16:
- return new PrimitiveArrayData<Type_Bool16>(length, data, this);
- case Type_Bool32:
- return new PrimitiveArrayData<Type_Bool32>(length, data, this);
- case Type_Bool64:
- return new PrimitiveArrayData<Type_Bool64>(length, data, this);
- case Type_Float:
- return new PrimitiveArrayData<Type_Float>(length, data, this);
- case Type_Double:
- return new PrimitiveArrayData<Type_Double>(length, data, this);
- default:
- kDebug() << "Cannot use" << data->typeName() << "for primitive arrays, using \
complex array";
- return 0;
- }
-}
-
-AbstractArrayData* ArrayDataInformation::arrayDataFromType(uint length, \
DataInformation* data)
-{
- Q_CHECK_PTR(data);
- AbstractArrayData* ret = 0;
- if (data->isPrimitive())
- {
- ret = primitiveArrayFromType(length, data->asPrimitive());
- }
- if (!ret)
- {
- //the conversion failed (i.e. it was not primitive or an \
enum/bitfield/pointer)
- ret = new ComplexArrayData(length, data, this);
- }
- return ret;
-}
-
QScriptValue ArrayDataInformation::childToScriptValue(uint index, QScriptEngine* \
engine, ScriptHandlerInfo* handlerInfo) const
{
diff --git a/kasten/controllers/view/structures/datatypes/array/arraydatainformation.h \
b/kasten/controllers/view/structures/datatypes/array/arraydatainformation.h index \
9f798fc..5046b3f 100644
--- a/kasten/controllers/view/structures/datatypes/array/arraydatainformation.h
+++ b/kasten/controllers/view/structures/datatypes/array/arraydatainformation.h
@@ -89,13 +89,8 @@ public:
virtual BitCount64 childPosition(const DataInformation* child, Okteta::Address \
start) const; protected:
virtual QScriptClass* scriptClass(ScriptHandlerInfo* handlerInfo) const;
-private:
- /** Takes ownership of @p data ! */
- AbstractArrayData* arrayDataFromType(uint length, DataInformation* data);
- AbstractArrayData* primitiveArrayFromType(uint length, PrimitiveDataInformation* \
type); protected:
QScopedPointer<AbstractArrayData> mData;
- QScriptValue mLengthFunction;
static const uint MAX_LEN = 10000;
};
@@ -173,15 +168,12 @@ inline QString ArrayDataInformation::childTypeName(uint index) \
const
inline QScriptValue ArrayDataInformation::lengthFunction() const
{
- return mLengthFunction;
+ return mAdditionalData.get(AdditionalData::ArrayLengthFunction).value<QScriptValue>();
}
inline void ArrayDataInformation::setLengthFunction(QScriptValue newFunc)
{
- if (!newFunc.isFunction())
- logError() << "New length function is not a function. It was: " << \
newFunc.toString();
- else
- mLengthFunction = newFunc;
+ setAdditionalFunction(AdditionalData::ArrayLengthFunction, newFunc, "array \
length function"); }
#endif /* ARRAYDATAINFORMATION_H_ */
diff --git a/kasten/controllers/view/structures/datatypes/datainformation.cpp \
b/kasten/controllers/view/structures/datatypes/datainformation.cpp index \
a6d1dc3..c7017d4 100644
--- a/kasten/controllers/view/structures/datatypes/datainformation.cpp
+++ b/kasten/controllers/view/structures/datatypes/datainformation.cpp
@@ -34,16 +34,15 @@
#include <KColorScheme>
DataInformation::DataInformation(const QString& name, DataInformationBase* parent)
- : mValidationSuccessful(false), mHasBeenValidated(false), \
mHasBeenUpdated(false),
- mWasAbleToRead(false), mByteOrder(EndianessInherit), \
mLoggedData(ScriptLogger::LogInvalid),
- mParent(parent), mName(name)
+ : mParent(parent), mName(name), mValidationSuccessful(false), \
mHasBeenValidated(false), mHasBeenUpdated(false), + mWasAbleToRead(false), \
mByteOrder(EndianessInherit), mLoggedData(ScriptLogger::LogInvalid) {
}
DataInformation::DataInformation(const DataInformation& d)
- : mValidationSuccessful(false), mHasBeenValidated(false), \
mHasBeenUpdated(false),
- mWasAbleToRead(false), mByteOrder(d.mByteOrder), \
mLoggedData(ScriptLogger::LogInvalid),
- mAdditionalData(d.mAdditionalData), mParent(0), mName(d.mName)
+ : mAdditionalData(d.mAdditionalData), mParent(0), mName(d.mName),
+ mValidationSuccessful(false), mHasBeenValidated(false), \
mHasBeenUpdated(false), + mWasAbleToRead(false), mByteOrder(d.mByteOrder), \
mLoggedData(ScriptLogger::LogInvalid) {
}
@@ -137,7 +136,7 @@ void \
DataInformation::setAdditionalFunction(AdditionalData::AdditionalDataType e }
if (!value.isFunction())
{
- logWarn() << "cannot set" << name << "since" << value.toString() << "is not \
a function!"; + logError() << "cannot set" << name << "since" << \
value.toString() << "is not a function!"; return;
}
mAdditionalData.set(entry, QVariant::fromValue(value));
diff --git a/kasten/controllers/view/structures/datatypes/datainformation.h \
b/kasten/controllers/view/structures/datatypes/datainformation.h index \
b1f5a06..0f9df8b 100644
--- a/kasten/controllers/view/structures/datatypes/datainformation.h
+++ b/kasten/controllers/view/structures/datatypes/datainformation.h
@@ -222,15 +222,15 @@ private:
void setValidationError(QString errorMessage); //only called by ScriptHandler
QSysInfo::Endian byteOrderFromSettings() const; //so there is no need to include \
structviewpreferences.h here protected:
+ AdditionalData mAdditionalData;
+ DataInformationBase* mParent;
+ QString mName;
bool mValidationSuccessful :1;
bool mHasBeenValidated :1;
bool mHasBeenUpdated :1;
bool mWasAbleToRead :1;
DataInformationEndianess mByteOrder :2;
mutable ScriptLogger::LogLevel mLoggedData :2; //mutable is ugly but i guess it \
is the best solution
- AdditionalData mAdditionalData;
- DataInformationBase* mParent;
- QString mName;
};
Q_DECLARE_METATYPE(DataInformation*)
diff --git a/kasten/controllers/view/structures/structtool.cpp \
b/kasten/controllers/view/structures/structtool.cpp index 5a06ec6..10ba7dd 100644
--- a/kasten/controllers/view/structures/structtool.cpp
+++ b/kasten/controllers/view/structures/structtool.cpp
@@ -179,7 +179,7 @@ bool StructTool::setData(const QVariant& value, int role, \
DataInformation* item, BitCount64 position = item->positionInFile(structureStart);
const quint64 remainingBits = qMax(d->mByteArrayModel->size() * 8 - \
qint64(position), qint64(0)); quint8 bitOffs = position % 8;
- ret = item->setData(value, d->mByteArrayModel, position / 8, remainingBits, \
bitOffs); + ret = item->setData(value, d->mByteArrayModel, \
Okteta::Address(position / 8), remainingBits, bitOffs); d->mWritingData = false; \
//finished
//XXX: this is inefficient, best would be to only update the changed value
updateData(Okteta::ArrayChangeMetricsList()); //update once after writing
@@ -321,7 +321,7 @@ void StructTool::setSelectedStructuresInView()
Okteta::Address StructTool::startAddress(const TopLevelDataInformation* data)
{
if (data->isLockedFor(d->mByteArrayModel))
- return data->lockPositionFor(d->mByteArrayModel);
+ return Okteta::Address(data->lockPositionFor(d->mByteArrayModel));
else
return d->mCursorIndex;
}
@@ -339,7 +339,7 @@ void StructTool::mark(const QModelIndex& idx)
int length = data->size() / 8;
const int maxLen = d->mByteArrayModel->size() - baseAddress;
length = qMin(length, maxLen);
- const Okteta::Address startOffset = data->positionInFile(baseAddress) / 8;
+ const Okteta::Address startOffset = \
Okteta::Address(data->positionInFile(baseAddress) / 8);
const Okteta::AddressRange markingRange = \
Okteta::AddressRange::fromWidth(startOffset, length); \
d->mByteArrayView->setMarking(markingRange, true); }
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic