Qt 4.8
qscriptobjectsnapshot.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtSCriptTools module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
43 
44 #include <QtCore/qmap.h>
45 #include <QtCore/qset.h>
46 #include <QtCore/qvector.h>
47 #include <QtCore/qnumeric.h>
48 #include <QtScript/qscriptvalueiterator.h>
49 
51 
53 {
54 }
55 
57 {
58 }
59 
60 static bool _q_equal(const QScriptValue &v1, const QScriptValue &v2)
61 {
62  if (v1.strictlyEquals(v2))
63  return true;
64  if (v1.isNumber() && v2.isNumber() && qIsNaN(v1.toNumber()) && qIsNaN(v2.toNumber()))
65  return true;
66  return false;
67 }
68 
70 {
71  Delta result;
73  QHash<QString, int> propertyNameToIndex;
74  {
75  int i = 0;
76  QScriptValueIterator it(object);
77  while (it.hasNext()) {
78  it.next();
79  QScriptValueProperty prop(it.name(), it.value(), it.flags());
80  currProps.insert(it.name(), prop);
81  propertyNameToIndex.insert(it.name(), i);
82  ++i;
83  }
84  if (object.prototype().isValid()) {
85  QString __proto__ = QString::fromLatin1("__proto__");
86  QScriptValueProperty protoProp(
87  __proto__, object.prototype(),
89  currProps.insert(__proto__, protoProp);
90  propertyNameToIndex.insert(__proto__, i);
91  ++i;
92  }
93  }
94 
95  QSet<QString> prevSet;
96  for (int i = 0; i < m_properties.size(); ++i)
97  prevSet.insert(m_properties.at(i).name());
98  QSet<QString> currSet = currProps.keys().toSet();
99  QSet<QString> removedProperties = prevSet - currSet;
100  QSet<QString> addedProperties = currSet - prevSet;
101  QSet<QString> maybeChangedProperties = currSet & prevSet;
102 
103  {
106  for (it = addedProperties.constBegin(); it != addedProperties.constEnd(); ++it) {
107  int idx = propertyNameToIndex[*it];
108  am[idx] = currProps[*it];
109  }
110  result.addedProperties = am.values();
111  }
112 
113  {
115  for (it = maybeChangedProperties.constBegin(); it != maybeChangedProperties.constEnd(); ++it) {
116  const QScriptValueProperty &p1 = currProps[*it];
117  const QScriptValueProperty &p2 = findProperty(*it);
118  if (!_q_equal(p1.value(), p2.value())
119  || (p1.flags() != p2.flags())) {
120  result.changedProperties.append(p1);
121  }
122  }
123  }
124 
125  result.removedProperties = removedProperties.toList();
126 
127  m_properties = currProps.values();
128 
129  return result;
130 }
131 
133 {
134  for (int i = 0; i < m_properties.size(); ++i) {
135  if (m_properties.at(i).name() == name)
136  return m_properties.at(i);
137  }
138  return QScriptValueProperty();
139 }
140 
142 {
143  return m_properties;
144 }
145 
#define QT_END_NAMESPACE
This macro expands to.
Definition: qglobal.h:90
QSet< T > toSet() const
Returns a QSet object with the data contained in this QList.
Definition: qset.h:309
#define it(className, varName)
QScriptValuePropertyList m_properties
const_iterator constEnd() const
Definition: qset.h:171
QList< T > values() const
Returns a list containing all the values in the map, in ascending order of their keys.
Definition: qmap.h:863
QString name() const
Returns the name of the last property that was jumped over using next() or previous().
QScriptValuePropertyList addedProperties
The QString class provides a Unicode character string.
Definition: qstring.h:83
QString name() const
Returns the name of this QScriptValueProperty.
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition: qhash.h:753
QScriptValue::PropertyFlags flags() const
Returns the flags of this QScriptValueProperty.
void append(const T &t)
Inserts value at the end of the list.
Definition: qlist.h:507
#define QT_BEGIN_NAMESPACE
This macro expands to.
Definition: qglobal.h:89
QList< T > toList() const
Definition: qset.h:296
const char * name
const T & at(int i) const
Returns the item at index position i in the list.
Definition: qlist.h:468
const_iterator insert(const T &value)
Definition: qset.h:179
QList< Key > keys() const
Returns a list containing all the keys in the map in ascending order.
Definition: qmap.h:818
QScriptValuePropertyList properties() const
Q_CORE_EXPORT bool qIsNaN(double d)
Returns true if the double {d} is not a number (NaN).
Definition: qnumeric.cpp:55
qsreal toNumber() const
Returns the number value of this QScriptValue, as defined in ECMA-262 section 9.3, "ToNumber".
static QByteArray prototype(const QList< QByteArray > &parameterTypes, const QList< QByteArray > &parameterNames, bool *ok)
Definition: qaxserver.cpp:685
QScriptValue::PropertyFlags flags() const
Returns the flags of the last property that was jumped over using next() or previous().
bool isNumber() const
Returns true if this QScriptValue is of the primitive type Number; otherwise returns false...
The QScriptValueIterator class provides a Java-style iterator for QScriptValue.
QScriptValue value() const
Returns the value of this QScriptValueProperty.
static QString fromLatin1(const char *, int size=-1)
Returns a QString initialized with the first size characters of the Latin-1 string str...
Definition: qstring.cpp:4188
iterator insert(const Key &key, const T &value)
Inserts a new item with the key key and a value of value.
Definition: qmap.h:559
QScriptValue value() const
Returns the value of the last property that was jumped over using next() or previous().
static bool _q_equal(const QScriptValue &v1, const QScriptValue &v2)
int size() const
Returns the number of items in the list.
Definition: qlist.h:137
Delta capture(const QScriptValue &object)
const_iterator constBegin() const
Definition: qset.h:168
QScriptValueProperty findProperty(const QString &name) const
QScriptValuePropertyList changedProperties
bool strictlyEquals(const QScriptValue &other) const
Returns true if this QScriptValue is equal to other using strict comparison (no conversion), otherwise returns false.
The QScriptValue class acts as a container for the Qt Script data types.
Definition: qscriptvalue.h:57
void next()
Advances the iterator by one position.
The QMap class is a template class that provides a skip-list-based dictionary.
Definition: qdatastream.h:67
bool hasNext() const
Returns true if there is at least one item ahead of the iterator (i.e.