You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by jo...@apache.org on 2010/10/29 19:26:06 UTC
svn commit: r1028860 - in /qpid/trunk/qpid/cpp: include/qpid/types/Variant.h
src/qpid/messaging/AddressParser.cpp src/qpid/types/Variant.cpp
src/tests/Address.cpp
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-subscribe@qpid.apache.org