Getter for mapped paths from KeyValueTreeTransform
authorTeemu Murtola <teemu.murtola@gmail.com>
Sun, 2 Oct 2016 05:20:12 +0000 (08:20 +0300)
committerDavid van der Spoel <davidvanderspoel@gmail.com>
Thu, 13 Oct 2016 06:45:37 +0000 (08:45 +0200)
This allows identifying which values the transform will use.  In the
long run, this may be replaced with another mechanism (or removed
altogether), but for now, this makes it easier to do piecewise
transition from old mdp parsing to using KeyValueTree and options.

Currently, the values are returned in alphabetical order, but subsequent
work may need this in the order the rules are added.  That will be easy
to change internally to the transform.

Change-Id: I3f225ce4f693644e5ac17685f0a887eec02807a8

src/gromacs/utility/keyvaluetreetransform.cpp
src/gromacs/utility/keyvaluetreetransform.h
src/gromacs/utility/tests/keyvaluetreetransform.cpp
src/gromacs/utility/tests/refdata/TreeValueTransformTest_ObjectFromMultipleStrings.xml
src/gromacs/utility/tests/refdata/TreeValueTransformTest_ObjectFromString.xml
src/gromacs/utility/tests/refdata/TreeValueTransformTest_SimpleTransforms.xml
src/gromacs/utility/tests/refdata/TreeValueTransformTest_SimpleTransformsCaseAndDashInsensitive.xml
src/gromacs/utility/tests/refdata/TreeValueTransformTest_SimpleTransformsToObject.xml

index 6ac2975e7260afd751d8828ca9c1af84d1d84b8f..e30c3314cdc513a423d6eb76ce712818d8910d2d 100644 (file)
@@ -112,6 +112,24 @@ class KeyValueTreeTransformerImpl : public IKeyValueTreeTransformRules
                     return &result.first->second;
                 }
 
+                void collectMappedPaths(const std::string        &prefix,
+                                        std::vector<std::string> *result) const
+                {
+                    for (const auto &value : childRules_)
+                    {
+                        std::string path = prefix + "/" + value.first;
+                        const Rule &rule = value.second;
+                        if (rule.transform_)
+                        {
+                            result->push_back(path);
+                        }
+                        else
+                        {
+                            rule.collectMappedPaths(path, result);
+                        }
+                    }
+                }
+
                 std::vector<std::string>    targetPath_;
                 std::string                 targetKey_;
                 TransformFunction           transform_;
@@ -219,6 +237,16 @@ IKeyValueTreeTransformRules *KeyValueTreeTransformer::rules()
     return impl_.get();
 }
 
+std::vector<std::string> KeyValueTreeTransformer::mappedPaths() const
+{
+    std::vector<std::string> result;
+    if (impl_->rootRule_)
+    {
+        impl_->rootRule_->collectMappedPaths("", &result);
+    }
+    return result;
+}
+
 KeyValueTreeObject KeyValueTreeTransformer::transform(const KeyValueTreeObject &tree) const
 {
     gmx::KeyValueTreeBuilder builder;
index 90fd653cfdee2516d92a52a155262a9186d2b6bd..625f8940c4d0b52f57caecc9a3043e6ee19097d4 100644 (file)
@@ -45,6 +45,7 @@
 
 #include <functional>
 #include <string>
+#include <vector>
 
 #include "gromacs/utility/classhelpers.h"
 #include "gromacs/utility/variant.h"
@@ -81,6 +82,8 @@ class KeyValueTreeTransformer
 
         IKeyValueTreeTransformRules *rules();
 
+        std::vector<std::string> mappedPaths() const;
+
         KeyValueTreeObject transform(const KeyValueTreeObject &tree) const;
 
     private:
index 2c1071abd0b74dace0bc9bff39991a61f1ca8dda..316e69a703c0778c0ec019235e40ed95f5757d2f 100644 (file)
@@ -63,6 +63,8 @@ class TreeValueTransformTest : public ::testing::Test
             gmx::test::TestReferenceData    data;
             gmx::test::TestReferenceChecker checker(data.rootChecker());
             checker.checkKeyValueTreeObject(input, "Input");
+            auto mappedPaths = transform.mappedPaths();
+            checker.checkSequence(mappedPaths.begin(), mappedPaths.end(), "MappedPaths");
             checker.checkKeyValueTreeObject(result, "Tree");
         }
 };
index 42e41f483e3adcd318982fb50d4cf6ebad7f9af3..86708bf77ea5ec1e0d2ffc4e77eb74c2b2b179ae 100644 (file)
@@ -5,6 +5,11 @@
     <String Name="a">1</String>
     <String Name="b">2 3</String>
   </Object>
+  <Sequence Name="MappedPaths">
+    <Int Name="Length">2</Int>
+    <String>/a</String>
+    <String>/b</String>
+  </Sequence>
   <Object Name="Tree">
     <Object Name="foo">
       <Int Name="a">1</Int>
index a47a3801bac5cc1bce14c95507547ee1258e1108..dd3353469c813d621108bc95a8494ce7bab27e78 100644 (file)
@@ -4,6 +4,10 @@
   <Object Name="Input">
     <String Name="a">1 2</String>
   </Object>
+  <Sequence Name="MappedPaths">
+    <Int Name="Length">1</Int>
+    <String>/a</String>
+  </Sequence>
   <Object Name="Tree">
     <Object Name="foo">
       <Int Name="a">1</Int>
index eb275c7545346b8503c718765c5bb729eed8f717..892eefb35741e8f61a4ee3c640cbe58f5c61dae5 100644 (file)
@@ -5,6 +5,11 @@
     <String Name="a">1</String>
     <String Name="b">2</String>
   </Object>
+  <Sequence Name="MappedPaths">
+    <Int Name="Length">2</Int>
+    <String>/a</String>
+    <String>/b</String>
+  </Sequence>
   <Object Name="Tree">
     <Int Name="i">1</Int>
     <Int Name="j">2</Int>
index d7c8a1488c76cb2c96475883ca83cee3d409a6ef..ae12f4ab671636e37cac8bc6d5c00a1af48c64b5 100644 (file)
@@ -5,6 +5,11 @@
     <String Name="a-x">1</String>
     <String Name="by">2</String>
   </Object>
+  <Sequence Name="MappedPaths">
+    <Int Name="Length">2</Int>
+    <String>/Ax</String>
+    <String>/B-Y</String>
+  </Sequence>
   <Object Name="Tree">
     <Int Name="i">1</Int>
     <Int Name="j">2</Int>
index 72e2c388dba2d6b8e9401ec24665c1534795decc..7a80978d548233e52e290fdda87c70e61f686dd1 100644 (file)
@@ -5,6 +5,11 @@
     <String Name="a">1</String>
     <String Name="b">2</String>
   </Object>
+  <Sequence Name="MappedPaths">
+    <Int Name="Length">2</Int>
+    <String>/a</String>
+    <String>/b</String>
+  </Sequence>
   <Object Name="Tree">
     <Object Name="foo">
       <Int Name="i">1</Int>