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 {
59  static std::mutex MTX;
60 };
61 
73 {
85  LTDLHandle(const std::string & class_name, const std::string & path, const std::string & rpath, bool verbose);
86 
87  ~LTDLHandle();
88 
89  LTDLHandle(const LTDLHandle &) = delete;
90  LTDLHandle & operator=(const LTDLHandle &) = delete;
91 
96  template<typename SymT>
97  SymT get_symbol(const std::string & name);
98 
100  inline bool valid() const { return valid_; }
101 
103  inline const std::vector<std::string> & classes() const { return classes_; }
104 
106  inline const std::string & path() const { return path_; }
107 
109  std::string dir() const;
110 
111 private:
112  std::string path_;
113  std::string rpath_;
114  bool verbose_;
115 #ifndef MC_RTC_BUILD_STATIC
116  lt_dlhandle handle_;
117 #endif
118  bool valid_ = false;
119  bool global_ = false;
120  bool open_ = false;
121  std::vector<std::string> classes_;
122 
123  bool open();
124  void close();
125 };
126 
127 using LTDLHandlePtr = std::shared_ptr<LTDLHandle>;
128 
133 {
134  template<typename T>
135  friend struct ObjectLoader;
136  typedef std::map<std::string, LTDLHandlePtr> handle_map_t;
137  typedef std::function<void(const std::string &, LTDLHandle &)> callback_t;
138 
139 public:
141 
143  static std::string debug_suffix;
144 
145 protected:
149  static bool init();
150 
154  static bool close();
155 
172  static void load_libraries(const std::string & class_name,
173  const std::vector<std::string> & paths,
174  handle_map_t & out,
175  bool verbose,
176  callback_t cb);
177 
178 private:
179  static unsigned int init_count_;
180 };
181 
185 template<typename T>
186 struct ObjectLoader : public boost::noncopyable
187 {
188 public:
200  ObjectLoader(const std::string & class_name,
201  const std::vector<std::string> & paths,
202  bool verbose,
204 
206  ~ObjectLoader();
207 
211  bool has_object(const std::string & name) const;
212 
216  std::vector<std::string> objects() const;
217 
222  void load_libraries(const std::vector<std::string> & paths, Loader::callback_t cb = Loader::default_cb);
223 
225  void clear();
226 
232  void set_verbosity(bool verbose);
233 
244  template<typename RetT, typename... Args>
245  void register_object(const std::string & name, std::function<RetT *(const Args &...)> callback);
246 
253  template<typename... Args>
254  std::shared_ptr<T> create_object(const std::string & name, Args... args);
255 
262  std::string get_object_runtime_directory(const std::string & name) const noexcept;
263 
265  {
267  ObjectDeleter(void (*fn)(T *));
268  void operator()(T * ptr);
269 
270  private:
271  void (*delete_fn_)(T *) = nullptr;
272  };
273 
274  using unique_ptr = std::unique_ptr<T, ObjectDeleter>;
275 
286  template<typename... Args>
287  unique_ptr create_unique_object(const std::string & name, Args... args);
288 
289 protected:
290  std::string class_name;
291  bool verbose;
294  std::unordered_map<std::string, ObjectDeleter> deleters_;
295 
297  template<typename... Args>
298  T * create(const std::string & name, Args... args);
299 
301  template<typename... Args>
302  T * create_from_handles(const std::string & name, Args... args);
303 
305  template<typename... Args>
306  T * create_from_callbacks(const std::string & name, Args... args);
307 };
308 
309 } // namespace mc_rtc
310 
311 #include <mc_rtc/loader.hpp>
DataStore.h
mc_rtc::ObjectLoader< State >::unique_ptr
std::unique_ptr< T, ObjectDeleter > unique_ptr
Definition: loader.h:274
mc_rtc::LoaderException::what
virtual const char * what() const noexcept override
Definition: loader.h:47
mc_rtc::ObjectLoader::ObjectDeleter::operator()
void operator()(T *ptr)
mc_rtc::ObjectLoader
ltdl wrapper for factory-like classes
Definition: loader.h:37
mc_rtc::ObjectLoader::set_verbosity
void set_verbosity(bool verbose)
mc_rtc::ObjectLoader::has_object
bool has_object(const std::string &name) const
mc_rtc::DataStore
Generic data store.
Definition: DataStore.h:132
mc_rtc::ObjectLoader::create_object
std::shared_ptr< T > create_object(const std::string &name, Args... args)
loader_api.h
mc_rtc::ObjectLoader::ObjectDeleter::ObjectDeleter
ObjectDeleter()
Definition: loader.h:266
mc_rtc::ObjectLoader::clear
void clear()
mc_rtc::ObjectLoader::load_libraries
void load_libraries(const std::vector< std::string > &paths, Loader::callback_t cb=Loader::default_cb)
mc_rtc::ObjectLoader::verbose
bool verbose
Definition: loader.h:291
mc_rtc::LoaderException::LoaderException
LoaderException(const std::string &what)
Definition: loader.h:45
mc_rtc::ObjectLoader::create_unique_object
unique_ptr create_unique_object(const std::string &name, Args... args)
MC_RTC_LOADER_DLLAPI
#define MC_RTC_LOADER_DLLAPI
Definition: loader_api.h:50
mc_rtc::ObjectLoader::objects
std::vector< std::string > objects() const
mc_rtc::Loader::callback_t
std::function< void(const std::string &, LTDLHandle &)> callback_t
Definition: loader.h:137
mc_rtc::ObjectLoader::create_from_callbacks
T * create_from_callbacks(const std::string &name, Args... args)
mc_rtc::ObjectLoader::ObjectDeleter
Definition: loader.h:264
mc_rtc::ObjectLoader::create_from_handles
T * create_from_handles(const std::string &name, Args... args)
mc_rtc::ObjectLoader::get_object_runtime_directory
std::string get_object_runtime_directory(const std::string &name) const noexcept
mc_rtc::Loader::default_cb
static callback_t default_cb
Definition: loader.h:140
mc_rtc::Loader::debug_suffix
static std::string debug_suffix
Definition: loader.h:143
mc_rtc::Loader
General wrapper for ltdl functionnalities.
Definition: loader.h:132
mc_rtc::ObjectLoader::ObjectLoader
ObjectLoader(const std::string &class_name, const std::vector< std::string > &paths, bool verbose, Loader::callback_t cb=Loader::default_cb)
mc_rtc::ObjectLoader::class_name
std::string class_name
Definition: loader.h:290
mc_rtc::LoaderException
Exception thrown by loader interface.
Definition: loader.h:42
mc_rtc::ObjectLoader::handles_
Loader::handle_map_t handles_
Definition: loader.h:292
mc_rtc::LTDLHandle::path
const std::string & path() const
Definition: loader.h:106
mc_rtc::ObjectLoader::~ObjectLoader
~ObjectLoader()
mc_rtc::LTDLMutex
Holds a global mutex for all LTDL operations.
Definition: loader.h:57
logging.h
mc_rtc::LTDLMutex::MTX
static std::mutex MTX
Definition: loader.h:59
mc_rtc::ObjectLoader::deleters_
std::unordered_map< std::string, ObjectDeleter > deleters_
Definition: loader.h:294
mc_rtc::LTDLHandle::classes
const std::vector< std::string > & classes() const
Definition: loader.h:103
mc_rtc::LTDLHandle::valid
bool valid() const
Definition: loader.h:100
mc_rtc::ObjectLoader::callbacks_
mc_rtc::DataStore callbacks_
Definition: loader.h:293
mc_rtc::ObjectLoader::register_object
void register_object(const std::string &name, std::function< RetT *(const Args &...)> callback)
mc_rtc::ObjectLoader::create
T * create(const std::string &name, Args... args)
mc_rtc::LTDLHandle
Wrapper around lt_dlhandle.
Definition: loader.h:72
mc_rtc::Loader::handle_map_t
std::map< std::string, LTDLHandlePtr > handle_map_t
Definition: loader.h:136
mc_rtc::LTDLHandlePtr
std::shared_ptr< LTDLHandle > LTDLHandlePtr
Definition: loader.h:127
mc_rtc
Definition: Contact.h:87