diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-08-26 14:42:04 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-08-29 09:16:01 +0200 |
commit | a3207a7293f0ee06d51146a6e98c3a3b1833ae54 (patch) | |
tree | 7b22b9dbe0d5c59422ece736a0ce7c0aa100a9d6 /src/lib/corelib/language | |
parent | 58f3c809ec0c7e9a9ddc87a6baf926738513bbd0 (diff) |
Fix equality operators.
The Standard does not allow to dereference null pointers, even if that
reference is then only used to compare the pointer values. So introduce
a wrapper function that does the pointer-related checks first.
Task-number: QBS-674
Change-Id: I9a14b4871b91102699f09ed922b9ab0e0265209a
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Reviewed-by: Jake Petroules <jake.petroules@petroules.com>
Diffstat (limited to 'src/lib/corelib/language')
-rw-r--r-- | src/lib/corelib/language/language.cpp | 49 | ||||
-rw-r--r-- | src/lib/corelib/language/resolvedfilecontext.cpp | 4 |
2 files changed, 17 insertions, 36 deletions
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp index 5e711241c..af68f7cfa 100644 --- a/src/lib/corelib/language/language.cpp +++ b/src/lib/corelib/language/language.cpp @@ -55,6 +55,16 @@ namespace qbs { namespace Internal { +template<typename T> bool equals(const T *v1, const T *v2) +{ + if (v1 == v2) + return true; + if (!v1 != !v2) + return false; + return *v1 == *v2; +} + + FileTagger::FileTagger(const QStringList &patterns, const FileTags &fileTags) : m_fileTags(fileTags) { @@ -288,13 +298,9 @@ void ScriptFunction::store(PersistentPool &pool) const bool operator==(const ScriptFunction &a, const ScriptFunction &b) { - if (&a == &b) - return true; - if (!!&a != !!&b) - return false; return a.sourceCode == b.sourceCode && a.location == b.location - && *a.fileContext == *b.fileContext; + && equals(a.fileContext.data(), b.fileContext.data()); } void ResolvedModule::load(PersistentPool &pool) @@ -315,19 +321,10 @@ void ResolvedModule::store(PersistentPool &pool) const bool operator==(const ResolvedModule &m1, const ResolvedModule &m2) { - if (&m1 == &m2) - return true; - if (!!&m1 != !!&m2) - return false; return m1.name == m2.name && m1.moduleDependencies.toSet() == m2.moduleDependencies.toSet() - && *m1.setupBuildEnvironmentScript == *m2.setupBuildEnvironmentScript - && *m1.setupRunEnvironmentScript == *m2.setupRunEnvironmentScript; -} - -static bool modulesAreEqual(const ResolvedModuleConstPtr &m1, const ResolvedModuleConstPtr &m2) -{ - return *m1 == *m2; + && equals(m1.setupBuildEnvironmentScript.data(), m2.setupBuildEnvironmentScript.data()) + && equals(m1.setupRunEnvironmentScript.data(), m2.setupRunEnvironmentScript.data()); } QString Rule::toString() const @@ -1114,7 +1111,7 @@ template<typename T> bool listsAreEqual(const QList<T> &l1, const QList<T> &l2) const T value2 = map2.value(key); if (!value2) return false; - if (*map1.value(key) != *value2) + if (!equals(map1.value(key).data(), value2.data())) return false; } return true; @@ -1132,10 +1129,6 @@ QString keyFromElem(const ArtifactPropertiesPtr &ap) bool operator==(const SourceArtifact &sa1, const SourceArtifact &sa2) { - if (&sa1 == &sa2) - return true; - if (!!&sa1 != !!&sa2) - return false; return sa1.absoluteFilePath == sa2.absoluteFilePath && sa1.fileTags == sa2.fileTags && sa1.overrideFileTags == sa2.overrideFileTags @@ -1150,10 +1143,10 @@ bool sourceArtifactSetsAreEqual(const QList<SourceArtifactPtr> &l1, bool operator==(const ResolvedTransformer &t1, const ResolvedTransformer &t2) { - return modulesAreEqual(t1.module, t2.module) + return equals(t1.module.data(), t2.module.data()) && t1.inputs.toSet() == t2.inputs.toSet() && sourceArtifactSetsAreEqual(t1.outputs, t2.outputs) - && *t1.transform == *t2.transform + && equals(t1.transform.data(), t2.transform.data()) && t1.explicitlyDependsOn == t2.explicitlyDependsOn; } @@ -1165,14 +1158,10 @@ bool transformerListsAreEqual(const QList<ResolvedTransformerPtr> &l1, bool operator==(const Rule &r1, const Rule &r2) { - if (&r1 == &r2) - return true; - if (!&r1 != !&r2) - return false; if (r1.artifacts.count() != r2.artifacts.count()) return false; for (int i = 0; i < r1.artifacts.count(); ++i) { - if (*r1.artifacts.at(i) != *r2.artifacts.at(i)) + if (!equals(r1.artifacts.at(i).data(), r2.artifacts.at(i).data())) return false; } @@ -1195,10 +1184,6 @@ bool ruleListsAreEqual(const QList<RulePtr> &l1, const QList<RulePtr> &l2) bool operator==(const RuleArtifact &a1, const RuleArtifact &a2) { - if (&a1 == &a2) - return true; - if (!&a1 != !&a2) - return false; return a1.filePath == a2.filePath && a1.fileTags == a2.fileTags && a1.alwaysUpdated == a2.alwaysUpdated diff --git a/src/lib/corelib/language/resolvedfilecontext.cpp b/src/lib/corelib/language/resolvedfilecontext.cpp index 50cf241ed..7ef99c6e9 100644 --- a/src/lib/corelib/language/resolvedfilecontext.cpp +++ b/src/lib/corelib/language/resolvedfilecontext.cpp @@ -73,10 +73,6 @@ void ResolvedFileContext::store(PersistentPool &pool) const bool operator==(const ResolvedFileContext &a, const ResolvedFileContext &b) { - if (&a == &b) - return true; - if (!!&a != !!&b) - return false; return a.filePath() == b.filePath() && a.jsExtensions() == b.jsExtensions() && a.jsImports() == b.jsImports(); |