From 5654e8ac8ba2f4e622c110e13bcc61a7d6ba3141 Mon Sep 17 00:00:00 2001 From: Christian Engwer <christi@dune-project.org> Date: Thu, 14 Jul 2016 15:31:10 +0200 Subject: [PATCH] [test] modified extended parameterizedfactorytest - add more use cases - add a factory, which is managed by a singleton - add some predefined types to factory in a separate object to make sure that we can properly access the same factory from different compilation units - access to the factory singleton is managed by a global function --- dune/common/test/CMakeLists.txt | 3 +- .../parameterizedobjectfactorysingleton.cc | 21 +++++++++++ .../parameterizedobjectfactorysingleton.hh | 28 ++++++++++++++ dune/common/test/parameterizedobjecttest.cc | 37 ++++++------------- 4 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 dune/common/test/parameterizedobjectfactorysingleton.cc create mode 100644 dune/common/test/parameterizedobjectfactorysingleton.hh diff --git a/dune/common/test/CMakeLists.txt b/dune/common/test/CMakeLists.txt index 740453618..e3e3aa29e 100644 --- a/dune/common/test/CMakeLists.txt +++ b/dune/common/test/CMakeLists.txt @@ -148,7 +148,8 @@ dune_add_test(NAME mpihelpertest2 dune_add_test(SOURCES overloadsettest.cc LINK_LIBRARIES dunecommon) -dune_add_test(SOURCES parameterizedobjecttest.cc +dune_add_test(NAME parameterizedobjecttest + SOURCES parameterizedobjecttest.cc parameterizedobjectfactorysingleton.cc LINK_LIBRARIES dunecommon ) diff --git a/dune/common/test/parameterizedobjectfactorysingleton.cc b/dune/common/test/parameterizedobjectfactorysingleton.cc new file mode 100644 index 000000000..a85955e48 --- /dev/null +++ b/dune/common/test/parameterizedobjectfactorysingleton.cc @@ -0,0 +1,21 @@ +#include "config.h" +#include <iostream> +#include <cassert> +#include <tuple> +#include <dune/common/parameterizedobject.hh> +#include <dune/common/parametertree.hh> +#include <dune/common/shared_ptr.hh> + +#include "parameterizedobjectfactorysingleton.hh" + +DefineImplementation(InterfaceA, Aix, int); +DefineImplementation(InterfaceA, Bix, int); + +int init_Factory() +{ + globalPtrFactory<InterfaceA>().define<Aix>("Aix"); + globalPtrFactory<InterfaceA>().define("Bix", [](int i) { return Dune::Std::make_unique<Bix>(i); }); + return 0; +} + +static const int init = init_Factory(); diff --git a/dune/common/test/parameterizedobjectfactorysingleton.hh b/dune/common/test/parameterizedobjectfactorysingleton.hh new file mode 100644 index 000000000..a1507b9ba --- /dev/null +++ b/dune/common/test/parameterizedobjectfactorysingleton.hh @@ -0,0 +1,28 @@ +#include <dune/common/parameterizedobject.hh> +#include <dune/common/singleton.hh> +#include <string> + +#define DefineImplementation(IF,T,PARAM...) \ + struct T : public IF { \ + T(PARAM) {} \ + virtual std::string info() { \ + return #T; \ + } \ + } + +struct InterfaceA +{ + virtual std::string info() = 0; +}; + +struct InterfaceB +{ + virtual std::string info() = 0; +}; + +template<typename Interface> +Dune::ParameterizedObjectFactory<std::unique_ptr<Interface>(int)> & +globalPtrFactory() +{ + return Dune::Singleton<Dune::ParameterizedObjectFactory<std::unique_ptr<Interface>(int)>>::instance(); +} diff --git a/dune/common/test/parameterizedobjecttest.cc b/dune/common/test/parameterizedobjecttest.cc index 323604b97..0c561282d 100644 --- a/dune/common/test/parameterizedobjecttest.cc +++ b/dune/common/test/parameterizedobjecttest.cc @@ -2,27 +2,10 @@ #include <iostream> #include <cassert> #include <tuple> -#include <dune/common/parameterizedobject.hh> #include <dune/common/parametertree.hh> #include <dune/common/shared_ptr.hh> -#define DefineImplementation(IF,T,PARAM...) \ - struct T : public IF { \ - T(PARAM) {} \ - virtual std::string info() { \ - return #T; \ - } \ - } - -struct InterfaceA -{ - virtual std::string info() = 0; -}; - -struct InterfaceB -{ - virtual std::string info() = 0; -}; +#include "parameterizedobjectfactorysingleton.hh" DefineImplementation(InterfaceA, Ai, int); DefineImplementation(InterfaceA, Bi, int); @@ -36,7 +19,6 @@ DefineImplementation(InterfaceB, Bis, int, std::string); #define CheckInstance(F,T,PARAM...) \ assert(#T == F.create(#T,##PARAM)->info()) - struct AImp : public InterfaceA { AImp(std::string s) : @@ -57,13 +39,16 @@ struct AImp : public InterfaceA int main() { // int as parameter - Dune::ParameterizedObjectFactory<std::unique_ptr<InterfaceA>(int)> FactoryA; - FactoryA.define<Ai>("Ai"); - FactoryA.define<Bi>("Bi"); - FactoryA.define("Ax", [](int i) { return Dune::Std::make_unique<Ax>(); }); - CheckInstance(FactoryA, Ai, 0); - CheckInstance(FactoryA, Bi, 1); - CheckInstance(FactoryA, Ax, 1); + // Dune::ParameterizedObjectFactory<std::unique_ptr<InterfaceA>(int)> FactoryA; + globalPtrFactory<InterfaceA>().define<Ai>("Ai"); + globalPtrFactory<InterfaceA>().define<Bi>("Bi"); + globalPtrFactory<InterfaceA>().define("Ax", [](int i) { return Dune::Std::make_unique<Ax>(); }); + CheckInstance(globalPtrFactory<InterfaceA>(), Ai, 0); + CheckInstance(globalPtrFactory<InterfaceA>(), Bi, 1); + CheckInstance(globalPtrFactory<InterfaceA>(), Ax, 1); + // int as parameter for external factory + CheckInstance(globalPtrFactory<InterfaceA>(), Aix, 0); + CheckInstance(globalPtrFactory<InterfaceA>(), Bix, 1); // default constructor Dune::ParameterizedObjectFactory<std::shared_ptr<InterfaceA>()> FactoryAd; -- GitLab