LCOV - code coverage report
Current view: top level - lunchbox - pluginFactory.h (source / functions) Hit Total Coverage
Test: Lunchbox Lines: 1 1 100.0 %
Date: 2016-11-11 05:21:33 Functions: 1 1 100.0 %

          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_PLUGINFACTORY_H
      23             : #define LUNCHBOX_PLUGINFACTORY_H
      24             : 
      25             : #include <lunchbox/types.h>
      26             : #include <lunchbox/algorithm.h> // used inline
      27             : #include <lunchbox/debug.h> // LBTHROW
      28             : #include <lunchbox/dso.h> // used inline
      29             : #include <lunchbox/file.h> // searchDirectory() used inline
      30             : #include <servus/uri.h> // Default template type
      31             : 
      32             : #include <unordered_map>
      33             : 
      34             : namespace lunchbox
      35             : {
      36             : 
      37             : /**
      38             :  * Factory for Plugin classes.
      39             :  *
      40             :  * The PluginFactory selects the a plugin for a given T::InitDataT, based on a
      41             :  * plugin's handles() function. In case a InitDataT can be handled by multiple
      42             :  * plugins, which plugin is chosen is undefined.
      43             :  *
      44             :  * This class has been designed as a singleton to allow for link time plugin
      45             :  * registration, but nothing prevents an application from registering new types
      46             :  * at run time.
      47             :  *
      48             :  * To do the registration of a plugin during the static initialization phase
      49             :  * use the PluginRegisterer.
      50             :  *
      51             :  * Example: @include tests/pluginFactory.cpp
      52             :  *
      53             :  * @version 1.11.0
      54             :  */
      55             : template< class T > class PluginFactory
      56             : {
      57             : public:
      58             :     typedef Plugin< T > PluginT;
      59             :     typedef std::vector< PluginT > Plugins;
      60             : 
      61             :     /** Get the single class instance. @version 1.11.0 */
      62             :     static PluginFactory& getInstance();
      63             : 
      64             :     /**
      65             :      * Create a plugin instance.
      66             :      * @param initData The initData passed to the plugin constructor.
      67             :      * @return A new PluginT instance. The user is responsible for deleting
      68             :      *         the returned object.
      69             :      * @throws std::runtime_error if no plugin can handle the initData.
      70             :      * @version 1.11.0
      71             :      */
      72             :     T* create( const typename T::InitDataT& initData );
      73             : 
      74             :     /** Register a plugin type. @version 1.11.0 */
      75             :     void register_( const PluginT& plugin );
      76             : 
      77             :     /** Deregister a plugin type. @version 1.11.0 */
      78             :     bool deregister( const PluginT& plugin );
      79             : 
      80             :     /** Unregister all plugin types. @version 1.11.0 */
      81             :     void deregisterAll();
      82             : 
      83             :     /** @name Automatic loading of plugin DSOs. */
      84             :     //@{
      85             :     /**
      86             :      * Load all compatible plugin libraries from a directory matching a pattern.
      87             :      *
      88             :      * The pattern is the core name of the library, and is extended by the
      89             :      * system-specific shared library suffix and postfix. The plugin has to
      90             :      * implement the C functions 'int LunchboxPluginGetVersion()' and 'bool
      91             :      * LunchboxPluginRegister()'. Only plugins with the same ABI version as the
      92             :      * given one are registered.
      93             :      *
      94             :      * @param version the current ABI version of the application loading the
      95             :      *                plugins.
      96             :      * @param path the directory to search for plugins.
      97             :      * @param pattern the core pattern of plugin names.
      98             :      * @version 1.11.0
      99             :      * @sa getLibraryPath()
     100             :      */
     101             :     void load( const int version, const std::string& path,
     102             :                const std::string& pattern );
     103             :     void load( const int version, const Strings& paths,
     104             :                const std::string& pattern );
     105             :     //@}
     106             : 
     107             : private:
     108           1 :     PluginFactory() {}
     109             :     PluginFactory( const PluginFactory& ) = delete;
     110             :     PluginFactory( PluginFactory&& ) = delete;
     111             :     PluginFactory& operator = ( const PluginFactory& ) = delete;
     112             :     PluginFactory& operator = ( PluginFactory&& ) = delete;
     113             : 
     114             : #pragma warning( disable: 4251 )
     115             :     Plugins _plugins;
     116             :     typedef std::unordered_map< DSO*, PluginT > PluginMap;
     117             :     PluginMap _libraries;
     118             : #pragma warning( default: 4251 )
     119             : 
     120             :     ~PluginFactory();
     121             : };
     122             : 
     123             : }
     124             : 
     125             : #include "pluginFactory.ipp" // template implementation
     126             : 
     127             : #endif // LUNCHBOX_PLUGINFACTORY_H

Generated by: LCOV version 1.11