summaryrefslogtreecommitdiff
path: root/src/core/variant
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2014-12-09 14:40:54 +0100
committerBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2014-12-09 14:40:54 +0100
commit37fc54402744b84b65ba87178387d7f6009d50df (patch)
tree037201b17e8006a74bae0cabc892543192c00c1d /src/core/variant
parente90a7ced80c6a7dbcdc75bf60c65bcc23f727ca2 (diff)
added comparison operators for Variant.
Diffstat (limited to 'src/core/variant')
-rw-r--r--src/core/variant/Variant.hpp73
1 files changed, 71 insertions, 2 deletions
diff --git a/src/core/variant/Variant.hpp b/src/core/variant/Variant.hpp
index 6476780..1e62644 100644
--- a/src/core/variant/Variant.hpp
+++ b/src/core/variant/Variant.hpp
@@ -65,8 +65,7 @@ public:
/**
* Exception thrown whenever a variant is accessed via a getter function
- * that
- * is not supported for the current variant type.
+ * that is not supported for the current variant type.
*/
class TypeException : public OusiaException {
private:
@@ -686,6 +685,76 @@ public:
// TODO: Use proper serialization function
return os << "\"" << v.first << "\": " << v.second.toString(true);
}
+
+ /*
+ * Comprison operators.
+ */
+
+ friend bool operator<(const Variant &lhs, const Variant &rhs)
+ {
+ // If the types do not match, we can not do a meaningful comparison.
+ if (lhs.getType() != rhs.getType()) {
+ throw TypeException(lhs.getType(), rhs.getType());
+ }
+ switch (lhs.getType()) {
+ case Type::NULLPTR:
+ return false;
+ case Type::BOOL:
+ return lhs.boolVal < rhs.boolVal;
+ case Type::INT:
+ return lhs.intVal < rhs.intVal;
+ case Type::DOUBLE:
+ return lhs.doubleVal < rhs.doubleVal;
+ case Type::STRING:
+ return lhs.asString() < rhs.asString();
+ case Type::ARRAY:
+ return lhs.asArray() < rhs.asArray();
+ case Type::MAP:
+ return lhs.asMap() < rhs.asMap();
+ }
+ throw OusiaException("Internal Error! Unknown type!");
+ }
+ friend bool operator>(const Variant &lhs, const Variant &rhs)
+ {
+ return rhs < lhs;
+ }
+ friend bool operator<=(const Variant &lhs, const Variant &rhs)
+ {
+ return !(lhs > rhs);
+ }
+ friend bool operator>=(const Variant &lhs, const Variant &rhs)
+ {
+ return !(lhs < rhs);
+ }
+
+ friend bool operator==(const Variant &lhs, const Variant &rhs)
+ {
+ if (lhs.getType() != rhs.getType()) {
+ return false;
+ }
+ switch (lhs.getType()) {
+ case Type::NULLPTR:
+ return true;
+ case Type::BOOL:
+ return lhs.boolVal == rhs.boolVal;
+ case Type::INT:
+ return lhs.intVal == rhs.intVal;
+ case Type::DOUBLE:
+ return lhs.doubleVal == rhs.doubleVal;
+ case Type::STRING:
+ return lhs.asString() == rhs.asString();
+ case Type::ARRAY:
+ return lhs.asArray() == rhs.asArray();
+ case Type::MAP:
+ return lhs.asMap() == rhs.asMap();
+ }
+ throw OusiaException("Internal Error! Unknown type!");
+ }
+
+ friend bool operator!=(const Variant &lhs, const Variant &rhs)
+ {
+ return !(lhs == rhs);
+ }
};
}