preloading_class_loader.hpp
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <string>
13 
16 
18 
19 /*
20  * In the classes where you need to use this classloader, insert the following code at the very beginning of the CPP
21  * file:
22  *
23 // HACK: we need to alter the private lowlever_class_loader_ of pluginlib::ClassLoader
24 #define private public
25 #include <pluginlib/class_loader.hpp>
26 #undef private
27  *
28  */
29 
36 template <typename Impl, typename Base>
38 {
39 protected:
45  {
46  const auto implType = cras::getTypeName<Impl>();
47  const auto baseType = cras::getTypeName<Base>();
48  auto metaObject = new class_loader::impl::MetaObject<Impl, Base>(implType, baseType);
49  metaObject->addOwningClassLoader(this);
50  class_loader::impl::getFactoryMapForBaseClass<Base>()[implType] = metaObject;
51  }
52 
53 public:
55  {
56  const auto implType = cras::getTypeName<Impl>();
57  auto metaObject = class_loader::impl::getFactoryMapForBaseClass<Base>()[implType];
58  metaObject->removeOwningClassLoader(this);
59  class_loader::impl::getFactoryMapForBaseClass<Base>().erase(implType);
60  delete metaObject;
61  }
62 
68  static void preload(const std::string& pluginlibType, pluginlib::ClassLoader<Base>& loader)
69  {
70  const auto implType = cras::getTypeName<Impl>();
71  const auto baseType = cras::getTypeName<Base>();
73  loader.classes_available_.insert({pluginlibType, {pluginlibType, implType, baseType, "", "", "", ""}});
74  loader.classes_available_.at(pluginlibType).resolved_library_path_ = implType;
75  }
76 
84  static void unPreload(const std::string& pluginlibType, pluginlib::ClassLoader<Base>& loader)
85  {
86  loader.unloadLibraryForClass(pluginlibType);
87  }
88 };
This pluginlib classloader alternative can load compiled-in classes and provide them as if they were ...
PreloadingClassLoader()
Construct the class loader.
class_loader::MultiLibraryClassLoader lowlevel_class_loader_
static void unPreload(const std::string &pluginlibType, pluginlib::ClassLoader< Base > &loader)
Revert the effect of preload().
virtual int unloadLibraryForClass(const std::string &lookup_name)
static void preload(const std::string &pluginlibType, pluginlib::ClassLoader< Base > &loader)
"Install" the preloading classloader into the given classloader.
Utilities for working with C++ types.
CLASS_LOADER_PUBLIC ClassLoader(const std::string &library_path, bool ondemand_load_unload=false)
void addOwningClassLoader(ClassLoader *loader)
LibraryToClassLoaderMap active_class_loaders_
std::map< std::string, ClassDesc > classes_available_


cras_cpp_common
Author(s): Martin Pecka
autogenerated on Sat Jun 17 2023 02:32:53