aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-08-26 14:42:04 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-08-29 09:16:01 +0200
commita3207a7293f0ee06d51146a6e98c3a3b1833ae54 (patch)
tree7b22b9dbe0d5c59422ece736a0ce7c0aa100a9d6 /src/lib/corelib/language
parent58f3c809ec0c7e9a9ddc87a6baf926738513bbd0 (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.cpp49
-rw-r--r--src/lib/corelib/language/resolvedfilecontext.cpp4
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();