summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2023-01-08 13:20:26 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2023-01-08 17:20:29 +0100
commit5b1887367680c494e27794252fee8d1aacf088ef (patch)
treef4c97d2e98cb81a2ce58cd681ebb2898c1db66de /include
parent7ec9843046705368f7a0888f8f95f8a0400862ba (diff)
Property lookup helpers
Diffstat (limited to 'include')
-rw-r--r--include/erebos/merge.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/include/erebos/merge.h b/include/erebos/merge.h
index bef8212..9705e94 100644
--- a/include/erebos/merge.h
+++ b/include/erebos/merge.h
@@ -2,9 +2,16 @@
#include <erebos/storage.h>
+#include <optional>
+#include <vector>
+
namespace erebos
{
+using std::nullopt;
+using std::optional;
+using std::vector;
+
template<class T> struct Mergeable
{
};
@@ -17,4 +24,50 @@ template<> struct Mergeable<vector<Stored<Object>>>
static vector<Stored<Object>> merge(const vector<Stored<Object>> & x) { return x; }
};
+vector<Stored<Object>> findPropertyObjects(const vector<Stored<Object>> & leaves, const string & prop);
+
+template<typename T>
+optional<Stored<typename Mergeable<T>::Component>> findPropertyComponent(const vector<Stored<typename Mergeable<T>::Component>> & components, const string & prop)
+{
+ vector<Stored<Object>> leaves;
+ leaves.reserve(components.size());
+
+ for (const auto & c : components)
+ leaves.push_back(Stored<Object>::load(c.ref()));
+
+ auto candidates = findPropertyObjects(leaves, prop);
+ if (!candidates.empty())
+ return Stored<typename Mergeable<T>::Component>::load(candidates[0].ref());
+ return nullopt;
+}
+
+template<typename T>
+optional<Stored<typename Mergeable<T>::Component>> findPropertyComponent(const T & x, const string & prop)
+{
+ return findPropertyComponent(x.components(), prop);
+}
+
+template<typename T>
+vector<Stored<typename Mergeable<T>::Component>> findPropertyComponents(const vector<Stored<typename Mergeable<T>::Component>> & components, const string & prop)
+{
+ vector<Stored<Object>> leaves;
+ leaves.reserve(components.size());
+
+ for (const auto & c : components)
+ leaves.push_back(Stored<Object>::load(c.ref()));
+
+ auto candidates = findPropertyObjects(leaves, prop);
+ vector<Stored<typename Mergeable<T>::Component>> result;
+ result.reserve(candidates.size());
+ for (const auto & obj : candidates)
+ result.push_back(Stored<typename Mergeable<T>::Component>::load(obj.ref()));
+ return result;
+}
+
+template<typename T>
+vector<Stored<typename Mergeable<T>::Component>> findPropertyComponents(const T & x, const string & prop)
+{
+ return findPropertyComponents(x.components(), prop);
+}
+
}