From b5b1898d949013f95775fef2644a8b5c0aedec81 Mon Sep 17 00:00:00 2001 From: Jeremie Deray <jeremie.deray@pal-robotics.com> Date: Tue, 4 Oct 2016 18:47:31 +0200 Subject: [PATCH] replace ProcessorFactory class with new factory typedef --- src/CMakeLists.txt | 1 - src/processor_factory.cpp | 51 --------------------------------------- src/processor_factory.h | 35 +++++++++------------------ src/processor_imu.cpp | 8 ++---- 4 files changed, 13 insertions(+), 82 deletions(-) delete mode 100644 src/processor_factory.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f0dcb97c0..f228608b4 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 956051d49..000000000 --- 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 620fe1854..1684e39d6 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 5e3bd8ade..1b5c88586 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) -- GitLab