Author: jonathan Date: Fri Oct 29 17:26:05 2010 New Revision: 1028860 URL: http://svn.apache.org/viewvc?rev=1028860&view=rev Log: Corrects AddressParser to use typed simple values.
Adds Variant::fromString(). Resolves QPID-2896 and QPID-2908. Modified: qpid/trunk/qpid/cpp/include/qpid/types/Variant.h qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp qpid/trunk/qpid/cpp/src/qpid/types/Variant.cpp qpid/trunk/qpid/cpp/src/tests/Address.cpp Modified: qpid/trunk/qpid/cpp/include/qpid/types/Variant.h URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/types/Variant.h?rev=1028860&r1=1028859&r2=1028860&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/include/qpid/types/Variant.h (original) +++ qpid/trunk/qpid/cpp/include/qpid/types/Variant.h Fri Oct 29 17:26:05 2010 @@ -113,6 +113,8 @@ class Variant QPID_TYPES_EXTERN Variant& operator=(const Variant&); QPID_TYPES_EXTERN Variant& operator=(const Uuid&); + QPID_TYPES_EXTERN Variant& fromString(const std::string&); + QPID_TYPES_EXTERN bool asBool() const; QPID_TYPES_EXTERN uint8_t asUint8() const; QPID_TYPES_EXTERN uint16_t asUint16() const; Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp?rev=1028860&r1=1028859&r2=1028860&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/messaging/AddressParser.cpp Fri Oct 29 17:26:05 2010 @@ -196,13 +196,14 @@ bool AddressParser::readQuotedValue(Vari return false; } } - -bool AddressParser::readSimpleValue(Variant& value) + +bool AddressParser::readSimpleValue(Variant& value) { std::string s; if (readWord(s)) { - value = s; + value.fromString(s); return true; + } else { return false; } Modified: qpid/trunk/qpid/cpp/src/qpid/types/Variant.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/types/Variant.cpp?rev=1028860&r1=1028859&r2=1028860&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/types/Variant.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/types/Variant.cpp Fri Oct 29 17:26:05 2010 @@ -23,6 +23,7 @@ #include "qpid/log/Statement.h" #include <boost/format.hpp> #include <boost/lexical_cast.hpp> +#include <boost/algorithm/string.hpp> #include <algorithm> #include <limits> #include <sstream> @@ -766,6 +767,42 @@ Variant& Variant::operator=(const Varian return *this; } + +template <class T> +bool from_string(T& t, const std::string& s) +{ + char c; // Make sure there are no extra characters + + std::istringstream iss(s); + return !(iss >> t).fail() && (iss>>c).fail(); +} + +Variant& Variant::fromString(const std::string& s) +{ + double d; + int i; + + if (from_string<int>(i, s)) { + return operator=(i); + } + else if (from_string<double>(d, s)) { + return operator=(d); + } + else { + std::string upper(boost::to_upper_copy(s)); + if (upper == "TRUE") { + return operator=(true); + } + else if (upper == "FALSE") { + return operator=(false); + } + else { + return operator=(s); + } + } +} + + VariantType Variant::getType() const { return impl ? impl->getType() : VAR_VOID; } bool Variant::isVoid() const { return getType() == VAR_VOID; } bool Variant::asBool() const { return impl && impl->asBool(); } Modified: qpid/trunk/qpid/cpp/src/tests/Address.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/Address.cpp?rev=1028860&r1=1028859&r2=1028860&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/tests/Address.cpp (original) +++ qpid/trunk/qpid/cpp/src/tests/Address.cpp Fri Oct 29 17:26:05 2010 @@ -49,8 +49,15 @@ QPID_AUTO_TEST_CASE(testParseOptions) { Address address("my-topic; {a:bc, x:101, y:'a string'}"); BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName()); + + BOOST_CHECK_EQUAL(std::string("bc"), address.getOptions()["a"]); + BOOST_CHECK_EQUAL(101, static_cast<int>(address.getOptions()["x"])); + BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"]); + + // Test asString() and asInt64() once here + BOOST_CHECK_EQUAL(std::string("bc"), address.getOptions()["a"].asString()); - BOOST_CHECK_EQUAL((uint16_t) 101, address.getOptions()["x"].asInt64()); + BOOST_CHECK_EQUAL(static_cast<uint16_t>(101), address.getOptions()["x"].asInt64()); BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"].asString()); } @@ -59,19 +66,19 @@ QPID_AUTO_TEST_CASE(testParseSubjectAndO Address address("my-topic/my-subject; {a:bc, x:101, y:'a string'}"); BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName()); BOOST_CHECK_EQUAL(std::string("my-subject"), address.getSubject()); - BOOST_CHECK_EQUAL(std::string("bc"), address.getOptions()["a"].asString()); - BOOST_CHECK_EQUAL((uint16_t) 101, address.getOptions()["x"].asInt64()); - BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"].asString()); + + BOOST_CHECK_EQUAL(std::string("bc"), address.getOptions()["a"]); + BOOST_CHECK_EQUAL(101, static_cast<int>(address.getOptions()["x"])); + BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"]); } QPID_AUTO_TEST_CASE(testParseNestedOptions) { Address address("my-topic; {a:{p:202, q:'another string'}, x:101, y:'a string'}"); BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName()); - BOOST_CHECK_EQUAL((uint16_t) 202, address.getOptions()["a"].asMap()["p"].asInt64()); - BOOST_CHECK_EQUAL(std::string("another string"), address.getOptions()["a"].asMap()["q"].asString()); - BOOST_CHECK_EQUAL((uint16_t) 101, address.getOptions()["x"].asInt64()); - BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"].asString()); + BOOST_CHECK_EQUAL(202, static_cast<int>(address.getOptions()["a"].asMap()["p"])); + BOOST_CHECK_EQUAL(std::string("another string"), address.getOptions()["a"].asMap()["q"]); + BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"]); } QPID_AUTO_TEST_CASE(testParseOptionsWithList) --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:commits-subscr...@qpid.apache.org