mc_rtc  2.16.0
loader.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2019 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
16 #include <mc_rtc/DataStore.h>
17 #include <mc_rtc/loader_api.h>
18 #include <mc_rtc/logging.h>
19 
20 #include <boost/noncopyable.hpp>
21 
22 #ifndef MC_RTC_BUILD_STATIC
23 # include <ltdl.h>
24 #endif
25 
26 #include <functional>
27 #include <map>
28 #include <memory>
29 #include <mutex>
30 #include <string>
31 #include <vector>
32 
33 namespace mc_rtc
34 {
35 
36 template<typename T>
37 struct ObjectLoader;
38 
42 struct MC_RTC_LOADER_DLLAPI LoaderException : public std::exception
43 {
44 public:
45  LoaderException(const std::string & what) : what_(what) {}
46 
47  virtual const char * what() const noexcept override { return what_.c_str(); }
48 
49 private:
50  std::string what_;
51 };
52 
58 { static std::mutex MTX; };
59 
71 {
83  LTDLHandle(const std::string & class_name, const std::string & path, const std::string & rpath, bool verbose);
84 
86 
87  LTDLHandle(const LTDLHandle &) = delete;
88  LTDLHandle & operator=(const LTDLHandle &) = delete;
89 
94  template<typename SymT>
95  SymT get_symbol(const std::string & name);
96 
98  inline bool valid() const { return valid_; }
99 
101  inline const std::vector<std::string> & classes() const { return classes_; }
102 
104  inline const std::string & path() const { return path_; }
105 
107  std::string dir() const;
108 
109 private:
110  std::string path_;
111  std::string rpath_;
112  bool verbose_;
113 #ifndef MC_RTC_BUILD_STATIC
114  lt_dlhandle handle_;
115 #endif
116  bool valid_ = false;
117  bool global_ = false;
118  bool open_ = false;
119  std::vector<std::string> classes_;
120 
121  bool open();
122  void close();
123 };
124 
125 using LTDLHandlePtr = std::shared_ptr<LTDLHandle>;
126 
131 {
132  template<typename T>
133  friend struct ObjectLoader;
134  typedef std::map<std::string, LTDLHandlePtr> handle_map_t;
135  typedef std::function<void(const std::string &, LTDLHandle &)> callback_t;
136 
137 public:
139 
141  static std::string debug_suffix;
142 
143 protected:
147  static bool init();
148 
152  static bool close();
153 
170  static void load_libraries(const std::string & class_name,
171  const std::vector<std::string> & paths,
172  handle_map_t & out,
173  bool verbose,
174  callback_t cb);
175 
176 private:
177  static unsigned int init_count_;
178 };
179 
183 template<typename T>
184 struct ObjectLoader : public boost::noncopyable
185 {
186 public:
198  ObjectLoader(const std::string & class_name,
199  const std::vector<std::string> & paths,
200  bool verbose,
202 
205 
209  bool has_object(const std::string & name) const;
210 
214  std::vector<std::string> objects() const;
215 
220  void load_libraries(const std::vector<std::string> & paths, Loader::callback_t cb = Loader::default_cb);
221 
223  void clear();
224 
230  void set_verbosity(bool verbose);
231 
242  template<typename RetT, typename... Args>
243  void register_object(const std::string & name, std::function<RetT *(const Args &...)> callback);
244 
251  template<typename... Args>
252  std::shared_ptr<T> create_object(const std::string & name, Args... args);
253 
260  std::string get_object_runtime_directory(const std::string & name) const noexcept;
261 
263  {
265  ObjectDeleter(void (*fn)(T *));
266  void operator()(T * ptr);
267 
268  private:
269  void (*delete_fn_)(T *) = nullptr;
270  };
271 
272  using unique_ptr = std::unique_ptr<T, ObjectDeleter>;
273 
284  template<typename... Args>
285  unique_ptr create_unique_object(const std::string & name, Args... args);
286 
287 protected:
288  std::string class_name;
289  bool verbose;
292  std::unordered_map<std::string, ObjectDeleter> deleters_;
293 
295  template<typename... Args>
296  T * create(const std::string & name, Args... args);
297 
299  template<typename... Args>
300  T * create_from_handles(const std::string & name, Args... args);
301 
303  template<typename... Args>
304  T * create_from_callbacks(const std::string & name, Args... args);
305 };
306 
307 } // namespace mc_rtc
308 
309 #include <mc_rtc/loader.hpp>
bool verbose
#define MC_RTC_LOADER_DLLAPI
Definition: loader_api.h:50
Definition: Contact.h:88
std::shared_ptr< LTDLHandle > LTDLHandlePtr
Definition: loader.h:125
Generic data store.
Definition: DataStore.h:125
Wrapper around lt_dlhandle.
Definition: loader.h:71
LTDLHandle(const std::string &class_name, const std::string &path, const std::string &rpath, bool verbose)
std::string dir() const
const std::vector< std::string > & classes() const
Definition: loader.h:101
const std::string & path() const
Definition: loader.h:104
bool valid() const
Definition: loader.h:98
LTDLHandle & operator=(const LTDLHandle &)=delete
SymT get_symbol(const std::string &name)
LTDLHandle(const LTDLHandle &)=delete
Holds a global mutex for all LTDL operations.
Definition: loader.h:58
static std::mutex MTX
Definition: loader.h:58
Exception thrown by loader interface.
Definition: loader.h:43
virtual const char * what() const noexcept override
Definition: loader.h:47
LoaderException(const std::string &what)
Definition: loader.h:45
General wrapper for ltdl functionnalities.
Definition: loader.h:131
static callback_t default_cb
Definition: loader.h:138
static bool init()
Initialize ltdl.
static std::string debug_suffix
Definition: loader.h:141
static bool close()
Close ltdl. Does nothing until the last call.
static void load_libraries(const std::string &class_name, const std::vector< std::string > &paths, handle_map_t &out, bool verbose, callback_t cb)
Provide libraries handles for the libraries in paths.
std::map< std::string, LTDLHandlePtr > handle_map_t
Definition: loader.h:134
std::function< void(const std::string &, LTDLHandle &)> callback_t
Definition: loader.h:135
Definition: loader.h:263
ObjectDeleter()
Definition: loader.h:264
ltdl wrapper for factory-like classes
Definition: loader.h:185
T * create(const std::string &name, Args... args)
T * create_from_callbacks(const std::string &name, Args... args)
void load_libraries(const std::vector< std::string > &paths, Loader::callback_t cb=Loader::default_cb)
Loader::handle_map_t handles_
Definition: loader.h:290
std::string get_object_runtime_directory(const std::string &name) const noexcept
std::unique_ptr< T, ObjectDeleter > unique_ptr
Definition: loader.h:272
T * create_from_handles(const std::string &name, Args... args)
bool has_object(const std::string &name) const
mc_rtc::DataStore callbacks_
Definition: loader.h:291
std::string class_name
Definition: loader.h:288
void set_verbosity(bool verbose)
std::shared_ptr< T > create_object(const std::string &name, Args... args)
bool verbose
Definition: loader.h:289
std::vector< std::string > objects() const
void register_object(const std::string &name, std::function< RetT *(const Args &...)> callback)
ObjectLoader(const std::string &class_name, const std::vector< std::string > &paths, bool verbose, Loader::callback_t cb=Loader::default_cb)
unique_ptr create_unique_object(const std::string &name, Args... args)
std::unordered_map< std::string, ObjectDeleter > deleters_
Definition: loader.h:292