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_;
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;
#include <functional>
#include <string>
+#include <vector>
#include "gromacs/utility/classhelpers.h"
#include "gromacs/utility/variant.h"
IKeyValueTreeTransformRules *rules();
+ std::vector<std::string> mappedPaths() const;
+
KeyValueTreeObject transform(const KeyValueTreeObject &tree) const;
private:
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");
}
};
<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>
<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>
<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>
<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>
<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>