Line data Source code
1 :
2 : /* Copyright (c) 2013-2016, 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_PLUGINREGISTERER_H
23 : #define LUNCHBOX_PLUGINREGISTERER_H
24 :
25 : #include <lunchbox/plugin.h> // used inline
26 : #include <lunchbox/pluginFactory.h> // used inline
27 :
28 : #include <boost/bind.hpp> // used inline
29 : #include <boost/version.hpp>
30 : #include <boost/functional/factory.hpp>
31 :
32 : namespace lunchbox
33 : {
34 : /**
35 : * Helper class to statically register derived plugin classes. If MyInitDataType
36 : * is not given, default value is servus::URI.
37 : *
38 : * The following code can be placed in a plugin's cpp file:
39 : * @code
40 : * namespace
41 : * {
42 : * PluginRegisterer< MyPluginInterface > registerer;
43 : * }
44 : * @endcode
45 : *
46 : * Also note that it needs the following type definition to be placed in the
47 : * plugin's interface (or in all its implementations that are to be registered):
48 : * @code
49 : * class MyPluginInterface
50 : * {
51 : * public:
52 : * typedef MyPluginInterface InterfaceT;
53 : * typedef MyPluginInitData InitDataT;
54 : * ( optional for InitDataT == servus::URI )
55 : * }
56 : * @endcode
57 : *
58 : * @version 1.11.0
59 : */
60 :
61 : template< typename T > class PluginRegisterer
62 : {
63 : public:
64 : /** Construct and register the Plugin< T > class. @version 1.11.0 */
65 4 : PluginRegisterer()
66 : {
67 : Plugin< typename T::InterfaceT > plugin(
68 : boost::bind( boost::factory< T* >(), _1 ),
69 8 : boost::bind( &T::handles, _1 ));
70 4 : PluginFactory< typename T::InterfaceT >::getInstance().register_(
71 : plugin );
72 4 : }
73 : };
74 : }
75 :
76 : #endif
|