Lunchbox  1.17.0
Multi-threaded C++ toolbox library for all application developers creating high-performance multi-threaded programs.
pluginFactory.h
1 
2 /* Copyright (c) 2013-2017, EPFL/Blue Brain Project
3  * Raphael Dumusc <raphael.dumusc@epfl.ch>
4  * Stefan.Eilemann@epfl.ch
5  *
6  * This file is part of Lunchbox <https://github.com/Eyescale/Lunchbox>
7  *
8  * This library is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU Lesser General Public License version 2.1 as published
10  * by the Free Software Foundation.
11  *
12  * This library is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 
22 #ifndef LUNCHBOX_PLUGINFACTORY_H
23 #define LUNCHBOX_PLUGINFACTORY_H
24 
25 #include <lunchbox/algorithm.h> // used inline
26 #include <lunchbox/debug.h> // LBTHROW
27 #include <lunchbox/dso.h> // used inline
28 #include <lunchbox/file.h> // searchDirectory() used inline
29 #include <lunchbox/plugin.h> // member
30 #include <lunchbox/types.h>
31 #include <servus/uri.h> // Default template type
32 
33 #include <unordered_map>
34 
35 namespace lunchbox
36 {
55 template <class T>
57 {
58 public:
59  typedef Plugin<T> PluginT;
60  typedef std::vector<PluginT> Plugins;
61 
63  static PluginFactory& getInstance();
64 
66  bool handles(const typename T::InitDataT& initData);
67 
76  T* create(const typename T::InitDataT& initData);
77 
79  void register_(const PluginT& plugin);
80 
82  bool deregister(const PluginT& plugin);
83 
85  void deregisterAll();
86 
88  std::string getDescriptions() const;
89 
108  void load(const int version, const std::string& path,
109  const std::string& pattern);
110  void load(const int version, const Strings& paths,
111  const std::string& pattern);
113 
114 private:
115  PluginFactory() {}
116  PluginFactory(const PluginFactory&) = delete;
117  PluginFactory(PluginFactory&&) = delete;
118  PluginFactory& operator=(const PluginFactory&) = delete;
119  PluginFactory& operator=(PluginFactory&&) = delete;
120 
121 #pragma warning(disable : 4251)
122  Plugins _plugins;
123  typedef std::unordered_map<DSO*, PluginT> PluginMap;
124  PluginMap _libraries;
125 #pragma warning(default : 4251)
126 
127  ~PluginFactory();
128 };
129 }
130 
131 #include "pluginFactory.ipp" // template implementation
132 
133 #endif // LUNCHBOX_PLUGINFACTORY_H
Basic type definitions not provided by the operating system.
void deregisterAll()
Unregister all plugin types.
Factory for Plugin classes.
Definition: pluginFactory.h:56
std::string getDescriptions() const
T * create(const typename T::InitDataT &initData)
Create a plugin instance.
void register_(const PluginT &plugin)
Register a plugin type.
std::vector< std::string > Strings
A vector of std::strings.
Definition: types.h:220
void load(const int version, const std::string &path, const std::string &pattern)
Load all compatible plugin libraries from a directory matching a pattern.
Abstraction layer and common utilities for multi-threaded programming.
Definition: algorithm.h:29
bool handles(const typename T::InitDataT &initData)
static PluginFactory & getInstance()
Get the single class instance.
bool deregister(const PluginT &plugin)
Deregister a plugin type.