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