summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/messaging/Variant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/messaging/Variant.cpp')
-rw-r--r--cpp/src/qpid/messaging/Variant.cpp57
1 files changed, 54 insertions, 3 deletions
diff --git a/cpp/src/qpid/messaging/Variant.cpp b/cpp/src/qpid/messaging/Variant.cpp
index 71f9fbe646..9c2f92f47a 100644
--- a/cpp/src/qpid/messaging/Variant.cpp
+++ b/cpp/src/qpid/messaging/Variant.cpp
@@ -21,11 +21,10 @@
#include "qpid/messaging/Variant.h"
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
+#include <algorithm>
+#include <sstream>
namespace qpid {
-namespace client {
-}
-
namespace messaging {
InvalidConversion::InvalidConversion(const std::string& msg) : Exception(msg) {}
@@ -81,6 +80,9 @@ class VariantImpl
void setEncoding(const std::string&);
const std::string& getEncoding() const;
+ bool isEqualTo(VariantImpl&) const;
+ bool isEquivalentTo(VariantImpl&) const;
+
static VariantImpl* create(const Variant&);
private:
const VariantType type;
@@ -170,6 +172,18 @@ bool toBool(const std::string& s)
throw InvalidConversion(QPID_MSG("Cannot convert " << s << " to bool"));
}
+template <class T> std::string toString(const T& t)
+{
+ std::stringstream out;
+ out << t;
+ return out.str();
+}
+
+template <class T> bool equal(const T& a, const T& b)
+{
+ return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());
+}
+
}
bool VariantImpl::asBool() const
@@ -298,10 +312,37 @@ std::string VariantImpl::asString() const
case VAR_DOUBLE: return boost::lexical_cast<std::string>(value.d);
case VAR_FLOAT: return boost::lexical_cast<std::string>(value.f);
case VAR_STRING: return *reinterpret_cast<std::string*>(value.v);
+ case VAR_LIST: return toString(asList());
+ case VAR_MAP: return toString(asMap());
default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_STRING)));
}
}
+bool VariantImpl::isEqualTo(VariantImpl& other) const
+{
+ if (type == other.type) {
+ switch(type) {
+ case VAR_VOID: return true;
+ case VAR_BOOL: return value.b == other.value.b;
+ case VAR_UINT8: return value.ui8 == other.value.ui8;
+ case VAR_UINT16: return value.ui16 == other.value.ui16;
+ case VAR_UINT32: return value.ui32 == other.value.ui32;
+ case VAR_UINT64: return value.ui64 == other.value.ui64;
+ case VAR_INT8: return value.i8 == other.value.i8;
+ case VAR_INT16: return value.i16 == other.value.i16;
+ case VAR_INT32: return value.i32 == other.value.i32;
+ case VAR_INT64: return value.i64 == other.value.i64;
+ case VAR_DOUBLE: return value.d == other.value.d;
+ case VAR_FLOAT: return value.f == other.value.f;
+ case VAR_STRING: return *reinterpret_cast<std::string*>(value.v)
+ == *reinterpret_cast<std::string*>(other.value.v);
+ case VAR_LIST: return equal(asList(), other.asList());
+ case VAR_MAP: return equal(asMap(), other.asMap());
+ }
+ }
+ return false;
+}
+
const Variant::Map& VariantImpl::asMap() const
{
switch(type) {
@@ -605,4 +646,14 @@ std::ostream& operator<<(std::ostream& out, const Variant& value)
return out;
}
+bool operator==(const Variant& a, const Variant& b)
+{
+ return a.isEqualTo(b);
+}
+
+bool Variant::isEqualTo(const Variant& other) const
+{
+ return impl->isEqualTo(*other.impl);
+}
+
}} // namespace qpid::messaging