/* * utility_function.hpp * * Created on: Jun 20, 2021 * Author: erki */ #ifndef SKULLC_UTILITY_FUNCTION_HPP_ #define SKULLC_UTILITY_FUNCTION_HPP_ namespace Utility { template class IFunction; template class IFunction { public: using result_type = R; virtual ~IFunction() {} virtual result_type operator()(Args... args) = 0; }; template class Function; template class Function : public IFunction { public: using result_type = R; using signature = R (*)(Args...); Function() = delete; explicit Function(signature callable) : callable_(callable) { assert(callable_); } ~Function() override { } result_type operator()(Args... args) override { return (*callable_)(args...); } private: signature callable_ = nullptr; }; template class FunctionOwned; template class FunctionOwned : public IFunction { public: using source = H; using result_type = R; using signature = R (source::*)(Args...); FunctionOwned() = delete; explicit FunctionOwned(source& src, signature callable) : src_(&src), callable_(callable) { assert(callable_); } ~FunctionOwned() override {} result_type operator()(Args... args) override { return (src_->*callable_)(args...); } private: source* src_ = nullptr; signature callable_ = nullptr; }; }// namespace Utility #endif /* SKULLC_UTILITY_FUNCTION_HPP_ */