• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdesdk API Reference
  • KDE Home
  • Contact Us
 

okteta

  • sources
  • kde-4.12
  • kdesdk
  • okteta
  • kasten
  • controllers
  • view
  • structures
  • datatypes
  • array
complexarraydata.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the Okteta Kasten Framework, made within the KDE community.
3  *
4  * Copyright 2011, 2012 Alex Richardson <alex.richardson@gmx.de>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) version 3, or any
10  * later version accepted by the membership of KDE e.V. (or its
11  * successor approved by the membership of KDE e.V.), which shall
12  * act as a proxy defined in Section 6 of version 3 of the license.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 #include "complexarraydata.h"
24 
25 #include <QScriptValue>
26 #include <QVariant>
27 #include <KLocalizedString>
28 #include <KDebug>
29 #include "arraydatainformation.h"
30 #include "../topleveldatainformation.h"
31 #include "../structuredatainformation.h"
32 #include "../../script/scripthandlerinfo.h"
33 #include "../../script/scriptlogger.h"
34 
35 ComplexArrayData::ComplexArrayData(unsigned int initialLength, DataInformation* data,
36  ArrayDataInformation* parent): AbstractArrayData(data, parent)
37 {
38  mChildren.reserve(initialLength);
39  appendChildren(0, initialLength);
40 }
41 
42 ComplexArrayData::~ComplexArrayData()
43 {
44  qDeleteAll(mChildren);
45 }
46 
47 void ComplexArrayData::appendChildren(uint from, uint to)
48 {
49  for (uint i = from; i < to; ++i)
50  {
51  DataInformation* arrayElem = mChildType->clone();
52  arrayElem->setName(QString::number(i));
53  arrayElem->setParent(mParent);
54  mChildren.append(arrayElem);
55  }
56 }
57 
58 void ComplexArrayData::setLength(uint newLength)
59 {
60  uint oldLength = mChildren.count();
61  if (newLength > oldLength)
62  {
63  mChildren.reserve(newLength);
64  appendChildren(oldLength, newLength);
65  }
66  else if (newLength < oldLength) //XXX maybe keep some cached
67  {
68  qDeleteAll(mChildren.begin() + newLength, mChildren.end());
69  mChildren.resize(newLength);
70  }
71  //else nothing to do, length stays the same
72 }
73 
74 DataInformation* ComplexArrayData::childAt(unsigned int idx)
75 {
76  Q_ASSERT(idx < uint(mChildren.size()));
77  return mChildren.at(idx);
78 }
79 
80 QVariant ComplexArrayData::dataAt(uint index, int column, int role)
81 {
82  Q_ASSERT(index < uint(mChildren.size()));
83  //this is slightly more efficient that delegating to the child
84  if (role == Qt::DisplayRole && column == DataInformation::ColumnName)
85  return QString(QLatin1Char('[') + QString::number(index) + QLatin1Char(']'));
86  return mChildren.at(index)->data(column, role);
87 }
88 
89 unsigned int ComplexArrayData::length() const
90 {
91  return mChildren.size();
92 }
93 
94 BitCount32 ComplexArrayData::size() const
95 {
96  int max = mChildren.size();
97  uint total = 0;
98  for (int i = 0; i < max; ++i) {
99  total += mChildren.at(i)->size();
100  }
101  return total;
102 }
103 
104 QString ComplexArrayData::typeName() const
105 {
106  QString type = mChildType->typeName();
107  return i18nc("type name, then array length", "%1[%2]", type, QString::number(length()));
108 }
109 
110 void ComplexArrayData::setNewParentForChildren() {
111  for (int i = 0; i < mChildren.size(); ++i)
112  mChildren.at(i)->setParent(mParent);
113 }
114 
115 BitCount64 ComplexArrayData::offset(const DataInformation* child) const
116 {
117  BitCount64 offset = 0;
118  //sum size of elements up to index
119  for (int i = 0; i < mChildren.size(); ++i)
120  {
121  DataInformation* current = mChildren.at(i);
122  if (current == child)
123  return offset;
124  offset += current->size();
125  }
126  Q_ASSERT(false); //should never be reached
127  return offset;
128 }
129 
130 int ComplexArrayData::indexOf(const DataInformation* const data) const
131 {
132  const int size = mChildren.size();
133  for (int i = 0; i < size; ++i)
134  {
135  if (mChildren.at(i) == data)
136  return i;
137  }
138  mParent->logWarn() << data->fullObjectPath() << "is not a valid child!";
139  Q_ASSERT(false); //should never land here
140  return -1;
141 }
142 
143 QScriptValue ComplexArrayData::toScriptValue(uint index, QScriptEngine* engine,
144  ScriptHandlerInfo* handlerInfo)
145 {
146  Q_ASSERT(index < length());
147  return mChildren.at(index)->toScriptValue(engine, handlerInfo);
148 }
149 
150 qint64 ComplexArrayData::readData(Okteta::AbstractByteArrayModel* input, Okteta::Address address, BitCount64 bitsRemaining)
151 {
152  qint64 readBits = 0;
153  TopLevelDataInformation* top = mParent->topLevelDataInformation();
154  quint8 bitOffset = 0; //FIXME no more padding before and after arrays!
155  StructureDataInformation::readChildren(mChildren, input, address, bitsRemaining, &bitOffset, &readBits, top);
156  return readBits;
157 }
158 
159 bool ComplexArrayData::setChildData(uint row, QVariant value, Okteta::AbstractByteArrayModel* out,
160  Okteta::Address address, BitCount64 bitsRemaining)
161 {
162  Q_ASSERT(row < unsigned(mChildren.size()));
163  unsigned int bits = 0;
164  for (uint i = 0; i < row; ++i)
165  {
166  bits += mChildren.at(i)->size();
167  }
168  return mChildren.at(row)->setData(value, out, address + (bits / 8), bitsRemaining - bits, bits % 8);
169 }
170 
171 PrimitiveDataType ComplexArrayData::primitiveType() const
172 {
173  if (mChildType->isBitfield())
174  return Type_Bitfield;
175  else
176  return Type_Invalid;
177 }
178 
179 BitCount32 ComplexArrayData::sizeAt(uint index)
180 {
181  Q_ASSERT(index < length());
182  return mChildren.at(index)->size();
183 }
184 
185 Qt::ItemFlags ComplexArrayData::childFlags(int index, int column, bool fileLoaded)
186 {
187  Q_ASSERT(index >= 0 && uint(index) < length());
188  return mChildren.at(index)->flags(column, fileLoaded);
189 }
190 
191 QWidget* ComplexArrayData::createChildEditWidget(uint index, QWidget* parent) const
192 {
193  Q_ASSERT(index < length());
194  return mChildren.at(index)->createEditWidget(parent);
195 }
196 
197 QVariant ComplexArrayData::dataFromChildWidget(uint index, const QWidget* w) const
198 {
199  Q_ASSERT(index < length());
200  return mChildren.at(index)->dataFromWidget(w);
201 
202 }
203 
204 void ComplexArrayData::setChildWidgetData(uint index, QWidget* w) const
205 {
206  Q_ASSERT(index < length());
207  mChildren.at(index)->setWidgetData(w);
208 }
ComplexArrayData::setChildData
virtual bool setChildData(uint row, QVariant value, Okteta::AbstractByteArrayModel *out, Okteta::Address address, BitCount64 bitsRemaining)
Definition: complexarraydata.cpp:159
DataInformation
Interface that must be implemented by all datatypes.
Definition: datainformation.h:67
ComplexArrayData::childFlags
virtual Qt::ItemFlags childFlags(int row, int column, bool fileLoaded)
Definition: complexarraydata.cpp:185
Okteta::Address
qint32 Address
Definition: address.h:34
Okteta::AbstractByteArrayModel
could it be useful to hide the data access behind an iterator? * class KDataBufferIterator { public: ...
Definition: abstractbytearraymodel.h:79
DataInformation::fullObjectPath
QString fullObjectPath() const
Definition: datainformation.cpp:258
DataInformation::topLevelDataInformation
TopLevelDataInformation * topLevelDataInformation() const
Definition: datainformation.cpp:240
ComplexArrayData::readData
virtual qint64 readData(Okteta::AbstractByteArrayModel *input, Okteta::Address address, BitCount64 bitsRemaining)
Definition: complexarraydata.cpp:150
complexarraydata.h
BitCount64
quint64 BitCount64
Definition: datainformationbase.h:42
DataInformation::setName
void setName(const QString &newName)
Definition: datainformation.h:263
ComplexArrayData::setChildWidgetData
virtual void setChildWidgetData(uint index, QWidget *w) const
Definition: complexarraydata.cpp:204
ComplexArrayData::size
virtual BitCount32 size() const
Definition: complexarraydata.cpp:94
QWidget
BitCount32
quint32 BitCount32
Definition: datainformationbase.h:37
ComplexArrayData::dataFromChildWidget
virtual QVariant dataFromChildWidget(uint index, const QWidget *w) const
Definition: complexarraydata.cpp:197
AbstractArrayData
Definition: abstractarraydata.h:46
ComplexArrayData::~ComplexArrayData
virtual ~ComplexArrayData()
Definition: complexarraydata.cpp:42
ArrayDataInformation
Definition: arraydatainformation.h:36
PrimitiveDataType
Definition: primitivedatatype.h:54
TopLevelDataInformation
Definition: topleveldatainformation.h:46
DataInformation::setParent
void setParent(DataInformationBase *newParent)
Definition: datainformation.h:303
ComplexArrayData::offset
virtual BitCount64 offset(const DataInformation *child) const
Definition: complexarraydata.cpp:115
ComplexArrayData::length
virtual unsigned int length() const
Definition: complexarraydata.cpp:89
AbstractArrayData::mChildType
QScopedPointer< DataInformation > mChildType
Definition: abstractarraydata.h:91
ComplexArrayData::typeName
virtual QString typeName() const
Definition: complexarraydata.cpp:104
Type_Bitfield
Definition: primitivedatatype.h:48
DataInformation::ColumnName
Definition: datainformation.h:84
AbstractArrayData::mParent
ArrayDataInformation * mParent
Definition: abstractarraydata.h:90
StructureDataInformation::readChildren
static bool readChildren(const QVector< DataInformation * > children, Okteta::AbstractByteArrayModel *input, Okteta::Address address, BitCount64 bitsRemaining, quint8 *bitOffset, qint64 *readBitsPtr, TopLevelDataInformation *top)
Definition: structuredatainformation.cpp:71
ComplexArrayData::childAt
virtual DataInformation * childAt(unsigned int idx)
Definition: complexarraydata.cpp:74
ScriptHandlerInfo
Definition: scripthandlerinfo.h:39
arraydatainformation.h
Type_Invalid
!! DO NOT CHANGE ORDER OF ITEMS !!!
Definition: primitivedatatype.h:31
ComplexArrayData::createChildEditWidget
virtual QWidget * createChildEditWidget(uint index, QWidget *parent) const
Definition: complexarraydata.cpp:191
ComplexArrayData::primitiveType
virtual PrimitiveDataType primitiveType() const
the primitive type or Type_Invalid for structs etc
Definition: complexarraydata.cpp:171
ComplexArrayData::dataAt
virtual QVariant dataAt(uint index, int column, int role)
Definition: complexarraydata.cpp:80
ComplexArrayData::sizeAt
virtual BitCount32 sizeAt(uint index)
Definition: complexarraydata.cpp:179
ComplexArrayData::setNewParentForChildren
virtual void setNewParentForChildren()
Definition: complexarraydata.cpp:110
ComplexArrayData::setLength
virtual void setLength(uint newLength)
Definition: complexarraydata.cpp:58
ComplexArrayData::indexOf
virtual int indexOf(const DataInformation *data) const
Definition: complexarraydata.cpp:130
DataInformation::size
virtual BitCount32 size() const =0
the size in bits of this element
DataInformation::logWarn
QDebug logWarn() const
just a shorthand for logger->warn(this)
Definition: datainformation.h:319
ComplexArrayData::ComplexArrayData
ComplexArrayData(unsigned int initialLength, DataInformation *data, ArrayDataInformation *parent)
Takes ownership of data !
Definition: complexarraydata.cpp:35
ComplexArrayData::toScriptValue
virtual QScriptValue toScriptValue(uint index, QScriptEngine *engine, ScriptHandlerInfo *handlerInfo)
Definition: complexarraydata.cpp:143
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:04:07 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okteta

Skip menu "okteta"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • umbrello
  •   umbrello

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal