[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