diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f0dcb97c07c4e58cbb0cb1e2e488c2b0488936b0..f228608b48e6f91dc38fba6632eb1a8a54684490 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -217,7 +217,6 @@ SET(SRCS node_base.cpp problem.cpp processor_base.cpp - processor_factory.cpp processor_imu.cpp processor_odom_2D.cpp processor_odom_3D.cpp diff --git a/src/processor_factory.cpp b/src/processor_factory.cpp deleted file mode 100644 index 956051d496ecd81c0b7523778d0da31901780646..0000000000000000000000000000000000000000 --- a/src/processor_factory.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/** - * \file processor_factory.cpp - * - * Created on: May 4, 2016 - * \author: jsola - */ - -#include "processor_factory.h" - -#include <iostream> -#include <iomanip> - -namespace wolf -{ - -bool ProcessorFactory::registerCreator(const std::string& _processor_type, CreateProcessorCallback createFn) -{ - bool reg = callbacks_.insert(CallbackMap::value_type(_processor_type, createFn)).second; - if (reg) - std::cout << std::setw(22) << std::left << "ProcessorFactory" << " : registered " << _processor_type << std::endl; - else - std::cout << "ProcessorFactory : processor " << _processor_type << " already registered. Skipping. " << std::endl; - - return reg; -} - -bool ProcessorFactory::unregisterCreator(const std::string& _processor_type) -{ - return callbacks_.erase(_processor_type) == 1; -} - -ProcessorBase* ProcessorFactory::create(const std::string& _processor_type, const std::string& _name, const ProcessorParamsBase* _params) -{ - CallbackMap::const_iterator creator_callback_it = callbacks_.find(_processor_type); - if (creator_callback_it == callbacks_.end()) - { - // not found - throw std::runtime_error("Unknown Processor type"); - } - // Invoke the creation function - return (creator_callback_it->second)(_name, _params); -} - -ProcessorFactory& ProcessorFactory::get() // Unique point of access; -{ - static ProcessorFactory instance_; // Guaranteed to be destroyed. - // Instantiated on first use. - return instance_; -} - -} /* namespace wolf */ diff --git a/src/processor_factory.h b/src/processor_factory.h index 620fe1854d822a12abb2314dec895ff9312f2a5b..1684e39d6b49006b41f4ebaaadcfc13998620bd3 100644 --- a/src/processor_factory.h +++ b/src/processor_factory.h @@ -16,6 +16,7 @@ struct ProcessorParamsBase; // wolf #include "wolf.h" +#include "factory.h" // std #include <string> @@ -166,32 +167,18 @@ namespace wolf * * You can also check the code in the example file ````src/examples/test_wolf_factories.cpp````. */ -class ProcessorFactory -{ - public: - typedef ProcessorBase* (*CreateProcessorCallback)(const std::string& _unique_name, const ProcessorParamsBase* _params); - private: - typedef std::map<std::string, CreateProcessorCallback> CallbackMap; - public: - bool registerCreator(const std::string& _processor_type, CreateProcessorCallback createFn); - bool unregisterCreator(const std::string& _processor_type); - ProcessorBase* create(const std::string& _processor_type, const std::string& _unique_name, const ProcessorParamsBase* _params = nullptr); - private: - CallbackMap callbacks_; - // Singleton --------------------------------------------------- - // This class is a singleton. The code below guarantees this. - // See: http://stackoverflow.com/questions/1008019/c-singleton-design-pattern - public: - static ProcessorFactory& get(); // Unique point of access +typedef Factory<ProcessorBase, const std::string&, const ProcessorParamsBase*> ProcessorFactory; + +template<> +inline std::string ProcessorFactory::getClass() +{ + return "ProcessorFactory"; +} - public: // see http://stackoverflow.com/questions/1008019/c-singleton-design-pattern - ProcessorFactory(const ProcessorFactory&) = delete; - void operator=(ProcessorFactory const&) = delete; - private: - ProcessorFactory() { } - ~ProcessorFactory() { } -}; +#define WOLF_REGISTER_PROCESSOR(ProcessorType, ProcessorName) \ + namespace wolf{ namespace{ const bool ProcessorName##Registered = \ + ProcessorFactory::get().registerCreator(ProcessorType, ProcessorName::create); }};\ } /* namespace wolf */ diff --git a/src/processor_imu.cpp b/src/processor_imu.cpp index 5e3bd8ade0f3cc01e76b6dd4d4d2bfb2d05755c5..1b5c88586d30ffe83ffa27d91f19494dc4f71fa7 100644 --- a/src/processor_imu.cpp +++ b/src/processor_imu.cpp @@ -41,9 +41,5 @@ ProcessorBase* ProcessorIMU::create(const std::string& _unique_name, const Proce // Register in the SensorFactory #include "processor_factory.h" -namespace wolf { -namespace -{ -const bool registered_prc_imu = ProcessorFactory::get().registerCreator("IMU", ProcessorIMU::create); -} -} // namespace wolf + +WOLF_REGISTER_PROCESSOR("IMU", ProcessorIMU)