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  {
48  IceInternal::Handle<DerivedQueryT> query(new DerivedQueryT);
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>
122  buildQueries() const
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
144  _setChildQueries(QueryT& query,
145  const std::vector<typename ChildT::QueryT>& childQueries) const = 0;
146  };
147 
148 } // namespace armarx::armem::client::query::detail
armarx::armem::client::query::detail
Definition: NameSelectorOps.h:6
armarx::armem::client::query::detail::ChildSelectorOps::withID
virtual DerivedT & withID(const MemoryID &id)=0
armarx::armem::client::query::detail::ChildSelectorOps::_addQuery
DerivedQueryT & _addQuery()
Definition: SelectorOps.h:46
MemoryID.h
armarx::armem::client::query::detail::ParentSelectorOps::_addChild
ChildT & _addChild(const ChildT &child)
Definition: SelectorOps.h:96
armarx::armem::client::query::detail::InnerSelectorOps::buildQueries
virtual std::vector< QueryT > buildQueries() const
Definition: SelectorOps.h:122
armarx::armem::client::query::detail::ParentSelectorOps::~ParentSelectorOps
virtual ~ParentSelectorOps()=default
armarx::armem::client::query::detail::ChildSelectorOps::_queries
std::vector< QueryT > _queries
Definition: SelectorOps.h:53
armarx::armem::client::query::detail::ChildSelectorOps::~ChildSelectorOps
virtual ~ChildSelectorOps()=default
IceInternal::Handle
Definition: forward_declarations.h:8
armarx::armem::client::query::SnapshotSelector
Definition: selectors.h:11
armarx::armem::client::query::detail::ChildSelectorOps::addQueries
void addQueries(const std::vector< IceInternal::Handle< QueryT >> &queries)
Definition: SelectorOps.h:34
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::client::query::detail::InnerSelectorOps::InnerSelectorOps
InnerSelectorOps()=default
armarx::armem::client::query::detail::InnerSelectorOps::_setChildQueries
virtual void _setChildQueries(QueryT &query, const std::vector< typename ChildT::QueryT > &childQueries) const =0
armarx::armem::client::query::detail::InnerSelectorOps
Definition: SelectorOps.h:114
armarx::armem::client::query::detail::ChildSelectorOps< SnapshotSelector, armem::query::data::EntityQueryPtr >::QueryT
armem::query::data::EntityQueryPtr QueryT
Definition: SelectorOps.h:18
armarx::armem::client::query::detail::ChildSelectorOps::addQuery
void addQuery(const IceInternal::Handle< QueryT > &query)
Definition: SelectorOps.h:28
q
#define q
armarx::armem::client::query::detail::ChildSelectorOps::ChildSelectorOps
ChildSelectorOps()=default
armarx::armem::client::query::detail::ParentSelectorOps::ChildT
_ChildT ChildT
Definition: SelectorOps.h:82
armarx::armem::client::query::detail::ChildSelectorOps::_apply
void _apply(T arg)
Definition: SelectorOps.h:63
armarx::armem::client::query::detail::ChildSelectorOps::_apply
void _apply(T arg, Ts... args)
Definition: SelectorOps.h:70
armarx::armem::client::query::detail::ChildSelectorOps::all
virtual DerivedT & all()=0
armarx::armem::client::query::detail::ParentSelectorOps
Definition: SelectorOps.h:78
armarx::armem::client::query::CoreSegmentSelector
Definition: selectors.h:118
armarx::armem::client::query::Builder
The query::Builder class provides a fluent-style specification of hierarchical queries.
Definition: Builder.h:21
T
float T
Definition: UnscentedKalmanFilterTest.cpp:38
armarx::armem::client::query::detail::ParentSelectorOps::_addChild
ChildT & _addChild(Ts... args)
Definition: SelectorOps.h:103
armarx::armem::client::query::detail::ParentSelectorOps::_addChild
ChildT & _addChild()
Definition: SelectorOps.h:90
armarx::armem::client::query::detail::ChildSelectorOps
Definition: SelectorOps.h:14
armarx::armem::client::query::detail::ParentSelectorOps::_children
std::vector< ChildT > _children
Definition: SelectorOps.h:110