Parasol Planning Library (PPL)
TMPMethodSet.h
Go to the documentation of this file.
1 #ifndef TMPMethod_SET_H_
2 #define TMPMethod_SET_H_
3 
4 #include <functional>
5 #include <iostream>
6 #include <map>
7 #include <memory>
8 #include <string>
9 
10 #include <boost/mpl/list.hpp>
11 #include <boost/mpl/next_prior.hpp>
12 
13 #include "IOUtils.h"
14 #include "XMLNode.h"
15 
16 class TMPLibrary;
20 template <typename TMPMethod>
22 
25 
26  typedef std::shared_ptr<TMPMethod> TMPMethodPointer;
27 
31 
33  return TMPMethodPointer(new TMPMethod(_node));
34  }
35 
37 
38 };
39 
40 
55 template<typename TMPMethod>
56 class TMPMethodSet {
57 
58  public:
59 
62 
63  typedef std::shared_ptr<TMPMethod> TMPMethodPointer;
64  typedef typename std::map<std::string, TMPMethodPointer> TMPMethodMap;
65 
66  typedef std::function<TMPMethodPointer(XMLNode&)> FactoryType;
67  typedef typename std::map<std::string, FactoryType> FactoryMap;
68 
69  typedef typename TMPMethodMap::iterator iterator;
70  typedef typename TMPMethodMap::const_iterator const_iterator;
71 
75 
79  template <typename TMPMethodTypeList>
80  TMPMethodSet(TMPLibrary* const _p, const TMPMethodTypeList& _mtl,
81  const std::string& _name);
82 
86 
88  void ParseXML(XMLNode& _node);
89 
90  void AddMethod(XMLNode& _node);
91 
92  void AddMethod(TMPMethodPointer _e, const std::string& _label);
93 
97  TMPMethodPointer GetMethod(const std::string& _label);
98 
102  iterator FindMethod(std::string _label);
103 
106  void Initialize();
107 
109  void Print(std::ostream& _os) const;
110 
115 
116  iterator begin() noexcept;
117  iterator end() noexcept;
118  const_iterator begin() const noexcept;
119  const_iterator end() const noexcept;
120 
122 
123  private:
124 
129 
131  template <typename First, typename Last>
132  void AddToUniverse(First, Last);
133 
135  template <typename Last>
136  void AddToUniverse(Last, Last);
137 
141 
142  TMPLibrary* m_tmpLibrary;
143 
144  std::string m_name;
145  std::string m_default;
146 
147  FactoryMap m_universe;
148  TMPMethodMap m_elements;
149 
151 
152 };
153 
154 /*----------------------------------------------------------------------------*/
155 #include "TMPLibrary/TMPLibrary.h"
156 
157 /*------------------------------- TMPMethod Set ---------------------------------*/
158 
159 template <typename TMPMethod>
160 template <typename TMPMethodTypeList>
162 TMPMethodSet(TMPLibrary* const _p, const TMPMethodTypeList& _mtl,
163  const std::string& _name) : m_tmpLibrary(_p), m_name(_name) {
164  AddToUniverse(typename boost::mpl::begin<TMPMethodTypeList>::type(),
165  typename boost::mpl::end<TMPMethodTypeList>::type());
166 }
167 
168 
169 template <typename TMPMethod>
170 void
172 ParseXML(XMLNode& _node) {
173  for(auto& child : _node)
174  AddMethod(child);
175 }
176 
177 
178 template <typename TMPMethod>
179 void
181 AddMethod(XMLNode& _node) {
182  auto iter = m_universe.find(_node.Name());
183 
184  // Skip if TMPMethod isn't in universe.
185  if(iter == m_universe.end())
186  return;
187 
188  TMPMethodPointer e = iter->second(_node);
189  AddMethod(e, e->m_label);
190 }
191 
192 
193 template <typename TMPMethod>
194 void
196 AddMethod(TMPMethodPointer _e, const std::string& _label) {
197  auto iter = m_universe.find(_e->m_name);
198 
199  // Throw exception if TMPMethod isn't in universe.
200  if(iter == m_universe.end())
201  throw ParseException(WHERE, "TMPMethod '" + _e->m_name +
202  "' is not contained within the motion planning universe.");
203 
204  _e->SetTMPLibrary(m_tmpLibrary);
205  _e->SetLabel(_label);
206  if(m_elements.empty())
207  m_default = _label;
208  if(m_elements.find(_label) == m_elements.end())
209  m_elements[_label] = _e;
210  else
211  std::cerr << "\nWarning, TMPMethod list already has a pointer associated with "
212  << "\"" << _label << "\", not added\n";
213 }
214 
215 
216 template <typename TMPMethod>
219 GetMethod(const std::string& _label) {
220  TMPMethodPointer element = (_label == "") ? m_elements[m_default] :
221  m_elements[_label];
222  if(element.get() == nullptr) {
223  std::string err = "Element '" + _label + "' does not exist in " + m_name +
224  ". Choices are: ";
225  for(auto& elem : m_elements)
226  if(elem.second.get())
227  err += " '" + elem.first + "',";
228  err.pop_back();
229  throw RunTimeException(WHERE, err);
230  }
231  return element;
232 }
233 
234 
235 template <typename TMPMethod>
238 FindMethod(std::string _label) {
239  if(_label == "")
240  _label = m_default;
241  return m_elements.find(_label);
242 }
243 
244 
245 template <typename TMPMethod>
246 void
248 Initialize() {
249  for(auto& elem : m_elements)
250  elem.second->Initialize();
251 }
252 
253 
254 template <typename TMPMethod>
255 void
257 Print(std::ostream& _os) const {
258  size_t count = 0;
259 
260  _os << "\n" << m_name << " has these TMPMethods available::\n\n";
261 
262  for(auto& elem : m_elements) {
263  _os << ++count << ") \"" << elem.first << "\" (" << elem.second->m_name
264  << ")\n";
265  elem.second->Print(_os);
266  _os << std::endl;
267  }
268  _os << std::endl;
269 }
270 
271 /*--------------------------------- Iteration --------------------------------*/
272 
273 template <typename TMPMethod>
276 begin() noexcept {
277  return m_elements.begin();
278 }
279 
280 
281 template <typename TMPMethod>
284 end() noexcept {
285  return m_elements.end();
286 }
287 
288 
289 template <typename TMPMethod>
292 begin() const noexcept {
293  return m_elements.begin();
294 }
295 
296 
297 template <typename TMPMethod>
300 end() const noexcept {
301  return m_elements.end();
302 }
303 
304 /*-------------------------- Initialization Helpers --------------------------*/
305 
306 template <typename TMPMethod>
307 template <typename First, typename Last>
308 void
310 AddToUniverse(First, Last) {
311  using FirstType = typename boost::mpl::deref<First>::type;
312  FirstType first;
313  m_universe[first.GetName()] = TMPMethodFactory<FirstType>();
314  AddToUniverse(typename boost::mpl::next<First>::type(), Last());
315 }
316 
317 
318 template <typename TMPMethod>
319 template <typename Last>
320 void
322 AddToUniverse(Last, Last) {}
323 
324 #endif
#define WHERE
Macro for retrieving info about file, function, and line number.
Definition: RuntimeUtils.h:32
Definition: TMPMethodSet.h:56
void AddMethod(XMLNode &_node)
Definition: TMPMethodSet.h:181
iterator end() noexcept
Definition: TMPMethodSet.h:284
std::function< TMPMethodPointer(XMLNode &)> FactoryType
Definition: TMPMethodSet.h:66
TMPMethodMap::iterator iterator
Definition: TMPMethodSet.h:69
void Print(std::ostream &_os) const
Display the instantiated TMPMethods.
Definition: TMPMethodSet.h:257
void ParseXML(XMLNode &_node)
Add the appropriate TMPMethods from an XML node.
Definition: TMPMethodSet.h:172
TMPMethodMap::const_iterator const_iterator
Definition: TMPMethodSet.h:70
std::map< std::string, TMPMethodPointer > TMPMethodMap
Definition: TMPMethodSet.h:64
void Initialize()
Definition: TMPMethodSet.h:248
TMPMethodPointer GetMethod(const std::string &_label)
Definition: TMPMethodSet.h:219
iterator begin() noexcept
Definition: TMPMethodSet.h:276
iterator FindMethod(std::string _label)
Definition: TMPMethodSet.h:238
TMPMethodSet(TMPLibrary *const _p, const TMPMethodTypeList &_mtl, const std::string &_name)
Definition: TMPMethodSet.h:162
std::map< std::string, FactoryType > FactoryMap
Definition: TMPMethodSet.h:67
std::shared_ptr< TMPMethod > TMPMethodPointer
Definition: TMPMethodSet.h:63
Definition: XMLNode.h:27
const std::string & Name() const
Get the XMLNode name.
Definition: XMLNode.cpp:90
Definition: PMPLExceptions.h:38
Definition: PMPLExceptions.h:62
Creates new TMPMethod instances from an XML node.
Definition: TMPMethodSet.h:21
TMPMethodPointer operator()(XMLNode &_node) const
Definition: TMPMethodSet.h:32
std::shared_ptr< TMPMethod > TMPMethodPointer
Definition: TMPMethodSet.h:26