1 #include <QtScript/QScriptClassPropertyIterator>
2 #include <QtScript/QScriptContext>
3 #include <QtScript/QScriptEngine>
4 #include "vectorclass.h"
5 #include "vectorprototype.h"
10 Q_DECLARE_METATYPE(VectorClass*)
12 class VectorClassPropertyIterator : public QScriptClassPropertyIterator
15 VectorClassPropertyIterator(
const QScriptValue &
object,
const QList<QScriptString>& lst);
16 ~VectorClassPropertyIterator();
21 bool hasPrevious()
const;
27 QScriptString name()
const;
31 QList<QScriptString> m_names;
38 VectorClass::VectorClass(QScriptEngine *engine)
39 : QObject(engine), QScriptClass(engine)
41 qScriptRegisterMetaType<QDaqVector>(engine, toScriptValue, fromScriptValue);
43 length = engine->toStringHandle(QLatin1String(
"length"));
44 circular = engine->toStringHandle(QLatin1String(
"circular"));
45 capacity = engine->toStringHandle(QLatin1String(
"capacity"));
48 QScriptEngine::QtOwnership,
50 QScriptEngine::ExcludeSuperClassMethods |
51 QScriptEngine::ExcludeSuperClassProperties);
52 QScriptValue global = engine->globalObject();
53 proto.setPrototype(global.property(
"Object").property(
"prototype"));
55 ctor = engine->newFunction(construct, proto);
56 ctor.setData(engine->toScriptValue(
this));
60 VectorClass::~VectorClass()
65 QScriptClass::QueryFlags VectorClass::queryProperty(
const QScriptValue &
object,
66 const QScriptString &name,
67 QueryFlags flags, uint *
id)
79 qint32 pos = name.toArrayIndex(&isArrayIndex);
84 if ((flags & HandlesReadAccess) && (pos >= ba->
size()))
85 flags &= ~HandlesReadAccess;
92 QScriptValue VectorClass::property(
const QScriptValue &
object,
93 const QScriptString &name, uint
id)
97 return QScriptValue();
100 }
else if (name == circular) {
102 }
else if (name == capacity) {
106 if ((pos < 0) || (pos >= vec->
size()))
107 return QScriptValue();
108 return vec->
get(pos);
110 return QScriptValue();
115 void VectorClass::setProperty(QScriptValue &
object,
116 const QScriptString &name,
117 uint
id,
const QScriptValue &value)
122 if (name == length) {
124 }
else if (name == circular) {
126 }
else if (name == capacity) {
130 if (pos < 0 || pos >= vec->
size())
132 (*vec)[pos] = value.toNumber();
138 QScriptValue::PropertyFlags VectorClass::propertyFlags(
139 const QScriptValue &,
const QScriptString &, uint )
147 return QScriptValue::Undeletable;
152 QScriptClassPropertyIterator *VectorClass::newIterator(
const QScriptValue &
object)
154 QList<QScriptString> L;
155 L << length << capacity << circular;
156 return new VectorClassPropertyIterator(
object, L);
160 QString VectorClass::name()
const
162 return QLatin1String(
"Vector");
165 QScriptValue VectorClass::prototype()
const
170 QScriptValue VectorClass::constructor()
176 QScriptValue VectorClass::newInstance(
int size)
178 engine()->reportAdditionalMemoryCost(size*
sizeof(
double));
184 QScriptValue VectorClass::newInstance(
const QDaqVector &ba)
186 QScriptValue data = engine()->newVariant(QVariant::fromValue(ba));
187 return engine()->newObject(
this, data);
192 QScriptValue VectorClass::construct(QScriptContext *ctx, QScriptEngine *)
194 VectorClass *cls = qscriptvalue_cast<VectorClass*>(ctx->callee().data());
196 return QScriptValue();
197 if (ctx->argumentCount()) {
198 QScriptValue arg = ctx->argument(0);
199 if (arg.instanceOf(ctx->callee()))
200 return cls->newInstance(qscriptvalue_cast<QDaqVector>(arg));
201 else if (arg.isArray()) {
202 quint32 len = arg.property(
"length").toUInt32();
205 for (quint32 i = 0; i < len; ++i)
206 vec << arg.property(i).toNumber();
207 return cls->newInstance(vec);
209 else if (arg.isNumber()) {
210 int size = arg.toInt32();
211 return cls->newInstance(size);
213 }
else return cls->newInstance();
214 return QScriptValue();
218 QScriptValue VectorClass::toScriptValue(QScriptEngine *eng,
const QDaqVector &ba)
220 QScriptValue ctor = eng->globalObject().property(
"Vector");
221 VectorClass *cls = qscriptvalue_cast<VectorClass*>(ctor.data());
223 return eng->newVariant(QVariant::fromValue(ba));
224 return cls->newInstance(ba);
227 void VectorClass::fromScriptValue(
const QScriptValue &obj,
QDaqVector &v)
229 QVariant var = obj.data().toVariant();
230 if (var.userType()==qMetaTypeId<QDaqVector>()) {
236 quint32 len = obj.property(
"length").toUInt32();
238 for (quint32 i = 0; i < len; ++i)
239 v << obj.property(i).toNumber();
244 void VectorClass::resize(
QDaqVector &ba,
int newSize)
246 int oldSize = ba.
size();
248 if (newSize > oldSize)
249 engine()->reportAdditionalMemoryCost(newSize - oldSize);
255 VectorClassPropertyIterator::VectorClassPropertyIterator(
const QScriptValue &
object,
const QList<QScriptString> &lst)
256 : QScriptClassPropertyIterator(object), m_names(lst), m_offset(lst.size())
261 VectorClassPropertyIterator::~VectorClassPropertyIterator()
266 bool VectorClassPropertyIterator::hasNext()
const
269 return m_index < ba->
size() + m_offset;
272 void VectorClassPropertyIterator::next()
278 bool VectorClassPropertyIterator::hasPrevious()
const
280 return (m_index > 0);
283 void VectorClassPropertyIterator::previous()
289 void VectorClassPropertyIterator::toFront()
295 void VectorClassPropertyIterator::toBack()
298 m_index = ba->
size()+m_offset;
302 QScriptString VectorClassPropertyIterator::name()
const
304 if (m_last<m_offset && m_last>=0)
return m_names.at(m_last);
306 return object().engine()->toStringHandle(QString::number(m_last-m_offset));
309 uint VectorClassPropertyIterator::id()
const
311 return m_last-m_offset;
void setCapacity(int c)
Set the capacity.
int size() const
Return the number of elememts stored in the buffer.
The prototype for the Vector class.
A buffer for storing double numbers.
double get(int i) const
Get the i-th element.
void setCircular(bool on)
Set circular on or off.
bool isCircular() const
Return true if Circular.
int capacity() const
Return the currently allocated memory capacity (in number of elements).