69 lines
1.4 KiB
C++
69 lines
1.4 KiB
C++
#pragma once
|
|
#include <luna/Heap.h>
|
|
|
|
namespace ui
|
|
{
|
|
class Action
|
|
{
|
|
public:
|
|
Action()
|
|
{
|
|
m_action = nullptr;
|
|
}
|
|
|
|
Action(Action&& other) : m_action(other.m_action)
|
|
{
|
|
other.m_action = nullptr;
|
|
}
|
|
|
|
template <typename T> Action(T&& function)
|
|
{
|
|
m_action = new (std::nothrow) ActionImpl<T>(move(function));
|
|
}
|
|
|
|
template <typename T> Action& operator=(T&& function)
|
|
{
|
|
if (m_action) delete m_action;
|
|
m_action = new (std::nothrow) ActionImpl<T>(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 <typename T> 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;
|
|
};
|
|
}
|