SelectorOps.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4
5#include <Ice/Handle.h>
6
7#include <RobotAPI/interface/armem/query.h>
9
11{
12
13 template <class _DerivedT, class _QueryT>
15 {
16 public:
17 using DerivedT = _DerivedT;
18 using QueryT = _QueryT;
19
20 ChildSelectorOps() = default;
21 virtual ~ChildSelectorOps() = default;
22
23
24 virtual DerivedT& all() = 0;
25 virtual DerivedT& withID(const MemoryID& id) = 0;
26
27 void
29 {
30 _queries.push_back(query);
31 }
32
33 void
34 addQueries(const std::vector<IceInternal::Handle<QueryT>>& queries)
35 {
36 for (auto q : queries)
37 {
38 addQuery(q);
39 }
40 }
41
42
43 protected:
44 template <class DerivedQueryT>
45 DerivedQueryT&
47 {
49 _queries.push_back(query);
50 return *query;
51 }
52
53 std::vector<QueryT> _queries;
54
55
56 // Only friends have access to these.
57
58 template <class ParentDerivedT, class ParentChildT>
59 friend class ParentSelectorOps;
60
61 template <class T>
62 inline void
63 _apply(T arg)
64 {
65 arg(dynamic_cast<DerivedT&>(*this));
66 }
67
68 template <class T, class... Ts>
69 inline void
70 _apply(T arg, Ts... args)
71 {
72 _apply(arg);
73 _apply(args...);
74 }
75 };
76
77 template <class _DerivedT, class _ChildT>
79 {
80 public:
81 using DerivedT = _DerivedT;
82 using ChildT = _ChildT;
83
84
85 public:
86 virtual ~ParentSelectorOps() = default;
87
88 protected:
89 ChildT&
91 {
92 return _children.emplace_back();
93 }
94
95 ChildT&
96 _addChild(const ChildT& child)
97 {
98 return _children.emplace_back(child);
99 }
100
101 template <class... Ts>
102 ChildT&
103 _addChild(Ts... args)
104 {
105 ChildT& sel = _addChild();
106 sel._apply(args...);
107 return sel;
108 }
109
110 std::vector<ChildT> _children;
111 };
112
113 template <class DerivedT, class QueryT, class ChildT>
115 public ParentSelectorOps<DerivedT, ChildT>,
116 public ChildSelectorOps<DerivedT, QueryT>
117 {
118 public:
119 InnerSelectorOps() = default;
120
121 virtual std::vector<QueryT>
123 {
124 std::vector<typename ChildT::QueryT> childQueries;
125 for (const auto& child : this->_children)
126 {
127 for (auto& query : child.buildQueries())
128 {
129 childQueries.push_back(query);
130 }
131 }
132
133 std::vector<QueryT> queries = this->_queries;
134 for (auto& query : queries)
135 {
136 this->_setChildQueries(query, childQueries);
137 }
138 return queries;
139 }
140
141
142 protected:
143 virtual void
145 const std::vector<typename ChildT::QueryT>& childQueries) const = 0;
146 };
147
148} // namespace armarx::armem::client::query::detail
virtual DerivedT & withID(const MemoryID &id)=0
void addQueries(const std::vector< IceInternal::Handle< QueryT > > &queries)
Definition SelectorOps.h:34
void addQuery(const IceInternal::Handle< QueryT > &query)
Definition SelectorOps.h:28
virtual void _setChildQueries(QueryT &query, const std::vector< typename ChildT::QueryT > &childQueries) const =0
virtual std::vector< QueryT > buildQueries() const
#define q