summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/qpid/messaging/AddressParser.cpp7
-rw-r--r--cpp/src/qpid/types/Variant.cpp37
-rw-r--r--cpp/src/tests/Address.cpp23
3 files changed, 56 insertions, 11 deletions
diff --git a/cpp/src/qpid/messaging/AddressParser.cpp b/cpp/src/qpid/messaging/AddressParser.cpp
index c34c9c0f56..d088b94f32 100644
--- a/cpp/src/qpid/messaging/AddressParser.cpp
+++ b/cpp/src/qpid/messaging/AddressParser.cpp
@@ -196,13 +196,14 @@ bool AddressParser::readQuotedValue(Variant& value)
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;
}
diff --git a/cpp/src/qpid/types/Variant.cpp b/cpp/src/qpid/types/Variant.cpp
index bf255b4423..ea4f5ffbbf 100644
--- a/cpp/src/qpid/types/Variant.cpp
+++ b/cpp/src/qpid/types/Variant.cpp
@@ -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 Variant& v)
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(); }
diff --git a/cpp/src/tests/Address.cpp b/cpp/src/tests/Address.cpp
index 6339e3a435..f41f27b6df 100644
--- a/cpp/src/tests/Address.cpp
+++ b/cpp/src/tests/Address.cpp
@@ -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(testParseSubjectAndOptions)
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)