/** * @file Action.h * @author apio (cloudapio.eu) * @brief Wrapper for callable objects, like function pointers or lambdas. * * @copyright Copyright (c) 2023, the Luna authors. * */ #pragma once #include namespace os { class Action { public: Action() { m_action = nullptr; } Action(Action&& other) : m_action(other.m_action) { other.m_action = nullptr; } template Action(T&& function) { m_action = new (std::nothrow) ActionImpl(move(function)); } template Action& operator=(T&& function) { if (m_action) delete m_action; m_action = new (std::nothrow) ActionImpl(move(function)); return *this; } void operator()() { check(m_action); return m_action->call(); } ~Action() { if (m_action) delete m_action; } private: class ActionBase { public: virtual void call() = 0; virtual ~ActionBase() = default; }; template class ActionImpl final : public ActionBase { public: ActionImpl(T&& function) : m_function(move(function)) { } void call() { return m_function(); } private: T m_function; }; ActionBase* m_action; }; }