1 | // Copyright (C) 2019 The Qt Company Ltd. |
---|---|
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #include "qqmltypemodule_p.h" |
5 | |
6 | #include <private/qqmltype_p_p.h> |
7 | |
8 | #include <QtCore/qmutex.h> |
9 | |
10 | QT_BEGIN_NAMESPACE |
11 | |
12 | void QQmlTypeModule::addMinorVersion(quint8 version) |
13 | { |
14 | for (int oldVersion = m_minMinorVersion.loadRelaxed(); |
15 | oldVersion > version && !m_minMinorVersion.testAndSetOrdered(expectedValue: oldVersion, newValue: version); |
16 | oldVersion = m_minMinorVersion.loadRelaxed()) { |
17 | } |
18 | |
19 | for (int oldVersion = m_maxMinorVersion.loadRelaxed(); |
20 | oldVersion < version && !m_maxMinorVersion.testAndSetOrdered(expectedValue: oldVersion, newValue: version); |
21 | oldVersion = m_maxMinorVersion.loadRelaxed()) { |
22 | } |
23 | } |
24 | |
25 | void QQmlTypeModule::add(QQmlTypePrivate *type) |
26 | { |
27 | QMutexLocker lock(&m_mutex); |
28 | |
29 | if (type->version.hasMinorVersion()) |
30 | addMinorVersion(version: type->version.minorVersion()); |
31 | |
32 | QList<QQmlTypePrivate *> &list = m_typeHash[type->elementName]; |
33 | for (int ii = 0; ii < list.size(); ++ii) { |
34 | QQmlTypePrivate *in_list = list.at(i: ii); |
35 | Q_ASSERT(in_list); |
36 | if (in_list->version.minorVersion() < type->version.minorVersion()) { |
37 | list.insert(i: ii, t: type); |
38 | return; |
39 | } else if (in_list->version.minorVersion() == type->version.minorVersion()) { |
40 | list[ii] = type; |
41 | return; |
42 | } |
43 | } |
44 | list.append(t: type); |
45 | } |
46 | |
47 | void QQmlTypeModule::remove(const QQmlTypePrivate *type) |
48 | { |
49 | QMutexLocker lock(&m_mutex); |
50 | for (auto elementIt = m_typeHash.begin(); elementIt != m_typeHash.end(); ++elementIt) |
51 | QQmlMetaType::removeQQmlTypePrivate(container&: elementIt.value(), reference: type); |
52 | } |
53 | |
54 | QQmlType QQmlTypeModule::findType(const QList<QQmlTypePrivate *> *types, QTypeRevision version) |
55 | { |
56 | if (types) { |
57 | for (int ii = 0; ii < types->size(); ++ii) |
58 | if (types->at(i: ii)->version.minorVersion() <= version.minorVersion()) |
59 | return QQmlType(types->at(i: ii)); |
60 | } |
61 | |
62 | return QQmlType(); |
63 | } |
64 | |
65 | void QQmlTypeModule::walkCompositeSingletons(const std::function<void(const QQmlType &)> &callback) const |
66 | { |
67 | QMutexLocker lock(&m_mutex); |
68 | for (auto typeCandidates = m_typeHash.begin(), end = m_typeHash.end(); |
69 | typeCandidates != end; ++typeCandidates) { |
70 | for (auto type: typeCandidates.value()) { |
71 | if (type->regType == QQmlType::CompositeSingletonType) |
72 | callback(QQmlType(type)); |
73 | } |
74 | } |
75 | } |
76 | |
77 | QT_END_NAMESPACE |
78 |