diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-04-06 11:30:10 +0100 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-04-07 08:45:51 +0100 | 
| commit | 66107ea15378cc30260224b668a0152acbcc353d (patch) | |
| tree | c6750cfe82fe3d371dcd7ac7432ed8b3b0a44562 | |
| parent | C++17 (diff) | |
| download | libadhocutil-66107ea15378cc30260224b668a0152acbcc353d.tar.bz2 libadhocutil-66107ea15378cc30260224b668a0152acbcc353d.tar.xz libadhocutil-66107ea15378cc30260224b668a0152acbcc353d.zip | |
C++17
Adds a friendly wrapper function to construct and install a plugin
(similar interface std::make_...)
| -rw-r--r-- | libadhocutil/plugins.h | 15 | ||||
| -rw-r--r-- | libadhocutil/unittests/testPlugins.cpp | 10 | 
2 files changed, 25 insertions, 0 deletions
| diff --git a/libadhocutil/plugins.h b/libadhocutil/plugins.h index 0fab76e..fe86834 100644 --- a/libadhocutil/plugins.h +++ b/libadhocutil/plugins.h @@ -129,6 +129,21 @@ namespace AdHoc {  			template<typename T> void add(const std::shared_ptr<T> & i, const std::string & n, const std::string & f, int l);  			/** +			 * Create and install a plugin +			 * @tparam T Base type of plugin +			 * @tparam I Implementation type of plugin +			 * @tparam Args Constructor arguments types +			 * @param n Name of plugin. +			 * @param f Filename of plugin. +			 * @param l Line number. +			 * @param args Arguments to construct an instance of I with. +			 */ +			template<typename T, typename I, typename ... Args> void create(const std::string & n, const std::string & f, int l, const Args & ... args) +			{ +				add<T>(std::make_shared<I>(args...), n, f, l); +			} + +			/**  			 * Uninstall a plugin.  			 * @param n Name of plugin.  			 */ diff --git a/libadhocutil/unittests/testPlugins.cpp b/libadhocutil/unittests/testPlugins.cpp index 84d00c7..a8380fb 100644 --- a/libadhocutil/unittests/testPlugins.cpp +++ b/libadhocutil/unittests/testPlugins.cpp @@ -72,6 +72,16 @@ BOOST_AUTO_TEST_CASE( removeManual )  	BOOST_REQUIRE(PluginManager::getDefault()->get<BaseThing>("ImplOfThing"));  } +BOOST_AUTO_TEST_CASE( createAndRemove ) +{ +	PluginManager::getDefault()->create<BaseThing, ImplOfThing>("custom1", __FILE__, __LINE__); +	BOOST_REQUIRE_EQUAL(2, PluginManager::getDefault()->count()); +	auto c1 = PluginManager::getDefault()->get<BaseThing>("custom1"); +	BOOST_REQUIRE(c1); +	PluginManager::getDefault()->remove<BaseThing>("custom1"); +	 +} +  BOOST_AUTO_TEST_CASE( nameAndTypeClash )  {  	// Same name, different type | 
