/* * according to https://forums.accellera.org/topic/5754-unit-testing-with-gtest/ * factory.h * * Created on: Oct 1, 2022 * Author: eyck */ #ifndef SRC_FACTORY_H_ #define SRC_FACTORY_H_ #include #include #include #include class factory { public: static factory& get_instance(); template class add { public: add(Args&&... args); add(const std::string& name, Args&&... args); }; template static T& get(const std::string& name = ""); void create(); void destroy(); private: using destructor = std::function; using object = std::unique_ptr; using constructor = std::function; factory(); factory(const factory& other) = delete; factory& operator=(const factory& other) = delete; void add_object(const std::string& name, constructor create); void* get_object(const std::string& name); std::map m_constructors; std::map m_objects; }; template factory::add::add(Args&&... args) { add("", args...); } template factory::add::add(const std::string& name, Args&&... args) { factory::get_instance().add_object(name, [args...]() -> object { return object{new T(std::forward(args)...), [](void* obj) { delete static_cast(obj); }}; }); } template auto factory::get(const std::string& name) -> T& { return *static_cast(factory::get_instance().get_object(name)); } #endif /* SRC_FACTORY_H_ */