diff options
author | Gordon Sim <gsim@apache.org> | 2009-12-17 11:14:57 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2009-12-17 11:14:57 +0000 |
commit | a0970a27bbac9300170ca19237f99da4aceb2969 (patch) | |
tree | c52866d245de6a0de26b4f5fcda5277f64f62bbd | |
parent | dce77f3f14bc9b11999f2a38e5b005d77bc37307 (diff) | |
download | qpid-python-a0970a27bbac9300170ca19237f99da4aceb2969.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@891636 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/include/qpid/messaging/Variant.h | 3 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/messaging/Message.cpp | 2 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/messaging/Variant.cpp | 57 | ||||
-rw-r--r-- | qpid/cpp/src/tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | qpid/cpp/src/tests/ClientMessage.cpp | 46 | ||||
-rw-r--r-- | qpid/cpp/src/tests/Makefile.am | 3 | ||||
-rw-r--r-- | qpid/cpp/src/tests/Variant.cpp | 16 |
7 files changed, 123 insertions, 5 deletions
diff --git a/qpid/cpp/include/qpid/messaging/Variant.h b/qpid/cpp/include/qpid/messaging/Variant.h index c63138178b..de5cef4d67 100644 --- a/qpid/cpp/include/qpid/messaging/Variant.h +++ b/qpid/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/qpid/cpp/src/qpid/messaging/Message.cpp b/qpid/cpp/src/qpid/messaging/Message.cpp index fb4e800eaa..deb40b6aa3 100644 --- a/qpid/cpp/src/qpid/messaging/Message.cpp +++ b/qpid/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/qpid/cpp/src/qpid/messaging/Variant.cpp b/qpid/cpp/src/qpid/messaging/Variant.cpp index 71f9fbe646..9c2f92f47a 100644 --- a/qpid/cpp/src/qpid/messaging/Variant.cpp +++ b/qpid/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/qpid/cpp/src/tests/CMakeLists.txt b/qpid/cpp/src/tests/CMakeLists.txt index 43f92b2d2d..469d777dce 100644 --- a/qpid/cpp/src/tests/CMakeLists.txt +++ b/qpid/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/qpid/cpp/src/tests/ClientMessage.cpp b/qpid/cpp/src/tests/ClientMessage.cpp new file mode 100644 index 0000000000..ab1cf9d102 --- /dev/null +++ b/qpid/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/qpid/cpp/src/tests/Makefile.am b/qpid/cpp/src/tests/Makefile.am index 013efa8c05..9a6e67ca2e 100644 --- a/qpid/cpp/src/tests/Makefile.am +++ b/qpid/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/qpid/cpp/src/tests/Variant.cpp b/qpid/cpp/src/tests/Variant.cpp index 2d68bb842c..21005779f0 100644 --- a/qpid/cpp/src/tests/Variant.cpp +++ b/qpid/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 |