Author: gsim
Date: Fri Sep 19 15:31:45 2008
New Revision: 697269

URL: http://svn.apache.org/viewvc?rev=697269&view=rev
Log:
Support floats and doubles in field tables.


Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h
    incubator/qpid/trunk/qpid/cpp/src/tests/FieldTable.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp?rev=697269&r1=697268&r2=697269&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.cpp Fri Sep 19 
15:31:45 2008
@@ -87,6 +87,14 @@
     values[name] = ValuePtr(new ArrayValue(value));
 }
 
+void FieldTable::setFloat(const std::string& name, float value){
+    values[name] = ValuePtr(new FloatValue(value));
+}
+
+void FieldTable::setDouble(const std::string& name, double value){
+    values[name] = ValuePtr(new DoubleValue(value));
+}
+
 FieldTable::ValuePtr FieldTable::get(const std::string& name) const
 {
     ValuePtr value;
@@ -131,6 +139,27 @@
     return getEncodedValue<Array>(get(name), value);
 }
 
+template <class T, int width, uint8_t typecode>
+bool getRawFixedWidthValue(FieldTable::ValuePtr vptr, T& value) 
+{
+    if (vptr && vptr->getType() == typecode) {
+        FixedWidthValue<width>* fwv = dynamic_cast< FixedWidthValue<width>* 
>(&vptr->getData());
+        if (fwv) {
+            fwv->copyInto(reinterpret_cast<uint8_t*>(&value));
+            return true;
+        }
+    }
+    return false;
+}
+
+bool FieldTable::getFloat(const std::string& name, float& value) const {    
+    return getRawFixedWidthValue<float, 4, 0x23>(get(name), value);
+}
+
+bool FieldTable::getDouble(const std::string& name, double& value) const {    
+    return getRawFixedWidthValue<double, 8, 0x33>(get(name), value);
+}
+
 void FieldTable::encode(Buffer& buffer) const{    
     buffer.putLong(size() - 4);
     buffer.putLong(values.size());

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.h?rev=697269&r1=697268&r2=697269&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldTable.h Fri Sep 19 
15:31:45 2008
@@ -66,6 +66,8 @@
     void setTimestamp(const std::string& name, uint64_t value);
     void setTable(const std::string& name, const FieldTable& value);
     void setArray(const std::string& name, const Array& value);
+    void setFloat(const std::string& name, float value);
+    void setDouble(const std::string& name, double value);
     //void setDecimal(string& name, xxx& value);
 
     std::string getString(const std::string& name) const;
@@ -73,6 +75,8 @@
 //    uint64_t getTimestamp(const std::string& name) const;
     bool getTable(const std::string& name, FieldTable& value) const;
     bool getArray(const std::string& name, Array& value) const;
+    bool getFloat(const std::string& name, float& value) const;
+    bool getDouble(const std::string& name, double& value) const;
 //    //void getDecimal(string& name, xxx& value);
 //    //void erase(const std::string& name);
     

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp?rev=697269&r1=697268&r2=697269&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.cpp Fri Sep 19 
15:31:45 2008
@@ -138,6 +138,14 @@
 {
 }
 
+FloatValue::FloatValue(float v) :
+    FieldValue(0x23, new FixedWidthValue<4>(reinterpret_cast<uint8_t*>(&v)))
+{}
+
+DoubleValue::DoubleValue(double v) :
+    FieldValue(0x33, new FixedWidthValue<8>(reinterpret_cast<uint8_t*>(&v)))
+{}
+
 TimeValue::TimeValue(uint64_t v) :
     FieldValue(0x32, new FixedWidthValue<8>(v))
 {

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h?rev=697269&r1=697268&r2=697269&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/FieldValue.h Fri Sep 19 
15:31:45 2008
@@ -126,6 +126,10 @@
   public:
     FixedWidthValue() {}
     FixedWidthValue(const uint8_t (&data)[width]) : octets(data) {}
+    FixedWidthValue(const uint8_t* const data)
+    {
+        for (int i = 0; i < width; i++) octets[i] = data[i];
+    }
     FixedWidthValue(uint64_t v)
     {
         for (int i = width; i > 0; --i) {
@@ -133,7 +137,6 @@
         }
         octets[0] = (uint8_t) (0xFF & v);
     }
-
     uint32_t size() const { return width; }
     void encode(Buffer& buffer) { buffer.putRawData(octets, width); }
     void decode(Buffer& buffer) { buffer.getRawData(octets, width); }
@@ -153,6 +156,10 @@
         v |= octets[width-1];
         return v;
     }
+    void copyInto(uint8_t* const data) const
+    {
+        for (uint i = 0; i < width; ++i) data[i] = octets[i];
+    }
 
     void print(std::ostream& o) const { o << "F" << width << ":"; };
 };
@@ -247,6 +254,16 @@
     Struct32Value(const std::string& v);
 };
 
+class FloatValue : public FieldValue
+{
+  public:
+    FloatValue(float f);
+};
+class DoubleValue : public FieldValue
+{
+  public:
+    DoubleValue(double f);
+};
 
 /*
  * Basic integer value encodes as signed 32 bit
@@ -285,6 +302,7 @@
     return false;
 }
 
+
 }} // qpid::framing
 
 #endif

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/FieldTable.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/FieldTable.cpp?rev=697269&r1=697268&r2=697269&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/FieldTable.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/FieldTable.cpp Fri Sep 19 15:31:45 
2008
@@ -122,4 +122,39 @@
     }
 }
 
+QPID_AUTO_TEST_CASE(testFloatAndDouble)
+{
+    char buff[100];
+    float f = 5.672;
+    double d = 56.720001;
+    {
+        FieldTable a;
+        a.setString("string", "abc");
+        a.setInt("int", 5672);
+        a.setFloat("float", f);
+        a.setDouble("double", d);
+
+        Buffer wbuffer(buff, 100);
+        wbuffer.put(a);
+    }
+    {
+        Buffer rbuffer(buff, 100);
+        FieldTable a;
+        rbuffer.get(a);
+        BOOST_CHECK(string("abc") == a.getString("string"));
+        BOOST_CHECK(5672 == a.getInt("int"));
+        float f2;
+        BOOST_CHECK(!a.getFloat("string", f2));
+        BOOST_CHECK(!a.getFloat("int", f2));
+        BOOST_CHECK(a.getFloat("float", f2));
+        BOOST_CHECK(f2 == f);
+
+        double d2;
+        BOOST_CHECK(!a.getDouble("string", d2));
+        BOOST_CHECK(!a.getDouble("int", d2));
+        BOOST_CHECK(a.getDouble("double", d2));
+        BOOST_CHECK(d2 == d);
+    }
+}
+
 QPID_AUTO_TEST_SUITE_END()


Reply via email to