73 lines
1.2 KiB
C++
73 lines
1.2 KiB
C++
/*
|
|
* utility_function.hpp
|
|
*
|
|
* Created on: Jun 20, 2021
|
|
* Author: erki
|
|
*/
|
|
|
|
#ifndef SKULLC_UTILITY_FUNCTION_HPP_
|
|
#define SKULLC_UTILITY_FUNCTION_HPP_
|
|
|
|
namespace Utility
|
|
{
|
|
|
|
template<class>
|
|
class Function;
|
|
|
|
template<typename R, typename... Args>
|
|
class Function<R(Args...)>
|
|
{
|
|
public:
|
|
using result_type = R;
|
|
|
|
using signature = R (*)(Args...);
|
|
|
|
Function() = delete;
|
|
explicit Function(signature callable)
|
|
: callable_(callable)
|
|
{
|
|
assert(callable_);
|
|
}
|
|
|
|
result_type operator()(Args&&... args)
|
|
{
|
|
return (*callable_)(std::forward<Args>(args)...);
|
|
}
|
|
|
|
private:
|
|
signature callable_ = nullptr;
|
|
};
|
|
|
|
template<class, class>
|
|
class FunctionOwned;
|
|
|
|
template<typename H, typename R, typename... Args>
|
|
class FunctionOwned<H, R(Args...)>
|
|
{
|
|
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_);
|
|
}
|
|
|
|
result_type operator()(Args&&... args)
|
|
{
|
|
return (src_->*callable_)(std::forward<Args>(args)...);
|
|
}
|
|
|
|
private:
|
|
source* src_ = nullptr;
|
|
signature callable_ = nullptr;
|
|
};
|
|
|
|
}// namespace Utility
|
|
|
|
#endif /* SKULLC_UTILITY_FUNCTION_HPP_ */
|