Extend key-value tree serialization and tests
authorTeemu Murtola <teemu.murtola@gmail.com>
Mon, 27 Mar 2017 15:32:38 +0000 (18:32 +0300)
committerTeemu Murtola <teemu.murtola@gmail.com>
Wed, 28 Jun 2017 16:03:18 +0000 (18:03 +0200)
Cover serialization support for key-value tree with basic option types
with tests, and implement missing support for bool values.

Change-Id: I630387393fce1435f64f9115870552067182145b

src/gromacs/fileio/gmxfio-xdr.cpp
src/gromacs/fileio/gmxfio-xdr.h
src/gromacs/options/tests/treesupport.cpp
src/gromacs/utility/inmemoryserializer.cpp
src/gromacs/utility/inmemoryserializer.h
src/gromacs/utility/iserializer.h
src/gromacs/utility/keyvaluetreeserializer.cpp
src/gromacs/utility/tests/keyvaluetreeserializer.cpp

index bdac061185a6d4fb5dc61cc05aba297fecc1e3f5..a9f4253050f98403c668c79885ec991426c00a3b 100644 (file)
@@ -681,6 +681,13 @@ bool FileIOXdrSerializer::reading() const
     return fio_->bRead;
 }
 
+void FileIOXdrSerializer::doBool(bool *value)
+{
+    gmx_bool v = *value;
+    gmx_fio_do_gmx_bool(fio_, v);
+    *value = v;
+}
+
 void FileIOXdrSerializer::doUChar(unsigned char *value)
 {
     gmx_fio_do_uchar(fio_, *value);
index 45118cb2afde236155ed9a59e44a066746a4ff83..6980cc04a365678fdae1a5fce7279a3a30bd0244 100644 (file)
@@ -145,6 +145,7 @@ class FileIOXdrSerializer : public ISerializer
 
         virtual bool reading() const;
 
+        virtual void doBool(bool *value);
         virtual void doUChar(unsigned char *value);
         virtual void doInt(int *value);
         virtual void doInt64(gmx_int64_t *value);
index 53568c774ad2cacfcf6550cb27b388a47a74cd51..f075e377c4087b28553b4b120b434c3e1bee426a 100644 (file)
@@ -240,6 +240,15 @@ class TreeValueSupportTest : public ::testing::Test
             checker.checkKeyValueTreeObject(tree, "Adjusted");
             // Check that assignment works.
             ASSERT_NO_THROW_GMX(gmx::assignOptionsFromKeyValueTree(&options_, tree, nullptr));
+            // Check that serialization works.
+            {
+                std::vector<char>             buffer = serializeTree(tree);
+                gmx::InMemoryDeserializer     deserializer(buffer);
+                gmx::KeyValueTreeObject       output
+                    = gmx::deserializeKeyValueTree(&deserializer);
+                checker.checkKeyValueTreeObject(output, "Adjusted");
+            }
+            // Check that dumping works.
             {
                 gmx::StringOutputStream stream;
                 gmx::TextWriter         writer(&stream);
@@ -250,6 +259,14 @@ class TreeValueSupportTest : public ::testing::Test
 
         gmx::Options              options_;
         gmx::KeyValueTreeBuilder  builder_;
+
+    private:
+        std::vector<char> serializeTree(const gmx::KeyValueTreeObject &tree)
+        {
+            gmx::InMemorySerializer serializer;
+            gmx::serializeKeyValueTree(tree, &serializer);
+            return serializer.finishAndGetBuffer();
+        }
 };
 
 TEST_F(TreeValueSupportTest, SupportsBooleanOption)
index 2249a2279229cc84b90adda85878db5160f88b07..efa0cadb08926c57b852f036a7cfd901c87038c6 100644 (file)
@@ -113,6 +113,11 @@ std::vector<char> InMemorySerializer::finishAndGetBuffer()
     return std::move(impl_->buffer_);
 }
 
+void InMemorySerializer::doBool(bool *value)
+{
+    impl_->doValue(value);
+}
+
 void InMemorySerializer::doUChar(unsigned char *value)
 {
     impl_->doValue(*value);
@@ -182,6 +187,11 @@ InMemoryDeserializer::~InMemoryDeserializer()
 {
 }
 
+void InMemoryDeserializer::doBool(bool *value)
+{
+    impl_->doValue(value);
+}
+
 void InMemoryDeserializer::doUChar(unsigned char *value)
 {
     impl_->doValue(value);
index 2466602399a8cb3ceaa3bcb464e35867e0b7aeff..1b96f1f8e01973ca797eeae08333f1d99efaeb3a 100644 (file)
@@ -61,6 +61,7 @@ class InMemorySerializer : public ISerializer
 
         // From ISerializer
         virtual bool reading() const { return false; }
+        virtual void doBool(bool *value);
         virtual void doUChar(unsigned char *value);
         virtual void doInt(int *value);
         virtual void doInt64(gmx_int64_t *value);
@@ -82,6 +83,7 @@ class InMemoryDeserializer : public ISerializer
 
         // From ISerializer
         virtual bool reading() const { return true; }
+        virtual void doBool(bool *value);
         virtual void doUChar(unsigned char *value);
         virtual void doInt(int *value);
         virtual void doInt64(gmx_int64_t *value);
index aa52b85828409b88f0719a905c02da2cde97dd4d..70d79735111827b386e7fd688d227baedfee78e7 100644 (file)
@@ -67,6 +67,7 @@ class ISerializer
         virtual bool reading() const = 0;
         //! \brief Serialize values of different types.
         ///@{
+        virtual void doBool(bool *value)           = 0;
         virtual void doUChar(unsigned char *value) = 0;
         virtual void doInt(int *value)             = 0;
         virtual void doInt64(gmx_int64_t *value)   = 0;
index 99e40470676bc34c8327efc79ab699fd3c7e76fa..60ca5da2da204e3db62a9316bb18234924c4c15d 100644 (file)
@@ -152,6 +152,21 @@ struct SerializationTraits<std::string>
     }
 };
 
+template <>
+struct SerializationTraits<bool>
+{
+    static void serialize(bool value, ISerializer *serializer)
+    {
+        serializer->doBool(&value);
+    }
+    static void deserialize(KeyValueTreeValueBuilder *builder, ISerializer *serializer)
+    {
+        bool value;
+        serializer->doBool(&value);
+        builder->setValue<bool>(value);
+    }
+};
+
 template <>
 struct SerializationTraits<int>
 {
@@ -236,6 +251,7 @@ void ValueSerializer::initSerializers()
         SERIALIZER('O', KeyValueTreeObject),
         SERIALIZER('A', KeyValueTreeArray),
         SERIALIZER('s', std::string),
+        SERIALIZER('b', bool),
         SERIALIZER('i', int),
         SERIALIZER('l', gmx_int64_t),
         SERIALIZER('f', float),
index 6f2e092c07133d1f67c0f7e7e7d1249aa2d6aa75..ac893f71d3f00555f2a29d05b1f1c4e2443e87df 100644 (file)
@@ -58,6 +58,10 @@ class RefDataSerializer : public gmx::ISerializer
 
         virtual bool reading() const { return false; }
 
+        virtual void doBool(bool *value)
+        {
+            checker_.checkBoolean(*value, nullptr);
+        }
         virtual void doUChar(unsigned char *value)
         {
             checker_.checkUChar(*value, nullptr);