summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2009-12-17 11:14:57 +0000
committerGordon Sim <gsim@apache.org>2009-12-17 11:14:57 +0000
commit62a08a90f3d13e1618a4dceeecef1242ba820dd7 (patch)
tree636f2d55ec53f50d4ba83fc2115e7c14d3210bfa
parent9c5549a09d261f3a66ce569560af7baf14d48d25 (diff)
downloadqpid-python-62a08a90f3d13e1618a4dceeecef1242ba820dd7.tar.gz
QPID-2289: Fixed copy constructor in qpid::messaging::Message, added in equality operator for qpid::messaging::Variant
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@891636 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--cpp/include/qpid/messaging/Variant.h3
-rw-r--r--cpp/src/qpid/messaging/Message.cpp2
-rw-r--r--cpp/src/qpid/messaging/Variant.cpp57
-rw-r--r--cpp/src/tests/CMakeLists.txt1
-rw-r--r--cpp/src/tests/ClientMessage.cpp46
-rw-r--r--cpp/src/tests/Makefile.am3
-rw-r--r--cpp/src/tests/Variant.cpp16
7 files changed, 123 insertions, 5 deletions
diff --git a/cpp/include/qpid/messaging/Variant.h b/cpp/include/qpid/messaging/Variant.h
index c63138178b..de5cef4d67 100644
--- a/cpp/include/qpid/messaging/Variant.h
+++ b/cpp/include/qpid/messaging/Variant.h
@@ -149,6 +149,8 @@ class Variant
QPID_CLIENT_EXTERN void setEncoding(const std::string&);
QPID_CLIENT_EXTERN const std::string& getEncoding() const;
+ QPID_CLIENT_EXTERN bool isEqualTo(const Variant& a) const;
+
QPID_CLIENT_EXTERN void reset();
private:
VariantImpl* impl;
@@ -157,6 +159,7 @@ class Variant
QPID_CLIENT_EXTERN std::ostream& operator<<(std::ostream& out, const Variant& value);
QPID_CLIENT_EXTERN std::ostream& operator<<(std::ostream& out, const Variant::Map& map);
QPID_CLIENT_EXTERN std::ostream& operator<<(std::ostream& out, const Variant::List& list);
+QPID_CLIENT_EXTERN bool operator==(const Variant& a, const Variant& b);
typedef Variant::Map VariantMap;
diff --git a/cpp/src/qpid/messaging/Message.cpp b/cpp/src/qpid/messaging/Message.cpp
index fb4e800eaa..deb40b6aa3 100644
--- a/cpp/src/qpid/messaging/Message.cpp
+++ b/cpp/src/qpid/messaging/Message.cpp
@@ -27,7 +27,7 @@ namespace messaging {
Message::Message(const std::string& bytes) : impl(new MessageImpl(bytes)) {}
Message::Message(const char* bytes, size_t count) : impl(new MessageImpl(bytes, count)) {}
-Message::Message(const Message& m) : impl(new MessageImpl(m.getContent())) {}
+Message::Message(const Message& m) : impl(new MessageImpl(*m.impl)) {}
Message::~Message() { delete impl; }
Message& Message::operator=(const Message& m) { *impl = *m.impl; return *this; }
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
diff --git a/cpp/src/tests/CMakeLists.txt b/cpp/src/tests/CMakeLists.txt
index 43f92b2d2d..469d777dce 100644
--- a/cpp/src/tests/CMakeLists.txt
+++ b/cpp/src/tests/CMakeLists.txt
@@ -140,6 +140,7 @@ set(unit_tests_to_build
ClientMessageTest
PollableCondition
Variant
+ ClientMessage
${xml_tests}
CACHE STRING "Which unit tests to build"
)
diff --git a/cpp/src/tests/ClientMessage.cpp b/cpp/src/tests/ClientMessage.cpp
new file mode 100644
index 0000000000..ab1cf9d102
--- /dev/null
+++ b/cpp/src/tests/ClientMessage.cpp
@@ -0,0 +1,46 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include <iostream>
+#include "qpid/messaging/Message.h"
+
+#include "unit_test.h"
+
+using namespace qpid::messaging;
+
+namespace qpid {
+namespace tests {
+
+QPID_AUTO_TEST_SUITE(ClientMessageSuite)
+
+QPID_AUTO_TEST_CASE(testCopyConstructor)
+{
+ Message m("my-data");
+ m.setSubject("my-subject");
+ m.getHeaders()["a"] = "ABC";
+ Message c(m);
+ BOOST_CHECK_EQUAL(m.getContent(), c.getContent());
+ BOOST_CHECK_EQUAL(m.getSubject(), c.getSubject());
+ BOOST_CHECK_EQUAL(m.getHeaders()["a"], c.getHeaders()["a"]);
+}
+
+QPID_AUTO_TEST_SUITE_END()
+
+}} // namespace qpid::tests
diff --git a/cpp/src/tests/Makefile.am b/cpp/src/tests/Makefile.am
index 013efa8c05..9a6e67ca2e 100644
--- a/cpp/src/tests/Makefile.am
+++ b/cpp/src/tests/Makefile.am
@@ -116,7 +116,8 @@ unit_test_SOURCES= unit_test.cpp unit_test.h \
ClientMessageTest.cpp \
PollableCondition.cpp \
Variant.cpp \
- Address.cpp
+ Address.cpp \
+ ClientMessage.cpp
if HAVE_XML
unit_test_SOURCES+= XmlClientSessionTest.cpp
diff --git a/cpp/src/tests/Variant.cpp b/cpp/src/tests/Variant.cpp
index 2d68bb842c..21005779f0 100644
--- a/cpp/src/tests/Variant.cpp
+++ b/cpp/src/tests/Variant.cpp
@@ -157,6 +157,22 @@ QPID_AUTO_TEST_CASE(testMap)
BOOST_CHECK_EQUAL(std::string("now it's a string"), value.asMap()["my-key"].asString());
}
+QPID_AUTO_TEST_CASE(testIsEqualTo)
+{
+ BOOST_CHECK_EQUAL(Variant("abc"), Variant("abc"));
+ BOOST_CHECK_EQUAL(Variant(1234), Variant(1234));
+
+ Variant a = Variant::Map();
+ a.asMap()["colour"] = "red";
+ a.asMap()["pi"] = 3.14f;
+ a.asMap()["my-key"] = 1234;
+ Variant b = Variant::Map();
+ b.asMap()["colour"] = "red";
+ b.asMap()["pi"] = 3.14f;
+ b.asMap()["my-key"] = 1234;
+ BOOST_CHECK_EQUAL(a, b);
+}
+
QPID_AUTO_TEST_SUITE_END()
}} // namespace qpid::tests