libos: Document Action.h
This commit is contained in:
parent
d3a347e432
commit
e18ca9bfe0
@ -12,24 +12,57 @@
|
|||||||
|
|
||||||
namespace os
|
namespace os
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @brief Wrapper for callable objects.
|
||||||
|
*
|
||||||
|
* Certain callable types such as capture lambdas don't have a named type, thus they can't be passed to functions as
|
||||||
|
* arguments. The Action type acts as a callable wrapper for such functions, allowing them to be passed as arguments
|
||||||
|
* to any function.
|
||||||
|
*/
|
||||||
class Action
|
class Action
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Construct a new empty Action object.
|
||||||
|
*
|
||||||
|
* Since it is not wrapping any callable object, this object is invalid and attempting to invoke its
|
||||||
|
* (nonexistent) callable object will result in a crash at runtime.
|
||||||
|
*/
|
||||||
Action()
|
Action()
|
||||||
{
|
{
|
||||||
m_action = nullptr;
|
m_action = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Construct a new Action object, moving it from another one.
|
||||||
|
*
|
||||||
|
* @param other The old Action object to move from. This object will become invalid.
|
||||||
|
*/
|
||||||
Action(Action&& other) : m_action(other.m_action)
|
Action(Action&& other) : m_action(other.m_action)
|
||||||
{
|
{
|
||||||
other.m_action = nullptr;
|
other.m_action = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Construct a new Action object from a callable object.
|
||||||
|
*
|
||||||
|
* @tparam T The type of the callable object. Since this can be guessed by template deduction, the object
|
||||||
|
* doesn't actually need a type name.
|
||||||
|
* @param function The callable object to wrap.
|
||||||
|
*/
|
||||||
template <typename T> Action(T&& function)
|
template <typename T> Action(T&& function)
|
||||||
{
|
{
|
||||||
m_action = new (std::nothrow) ActionImpl<T>(move(function));
|
m_action = new (std::nothrow) ActionImpl<T>(move(function));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assign a new callable object to this Action.
|
||||||
|
*
|
||||||
|
* @tparam T The type of the callable object. Since this can be guessed by template deduction, the object
|
||||||
|
* doesn't actually need a type name.
|
||||||
|
* @param function The callable object to wrap.
|
||||||
|
* @return Action& A reference to this object, as required by operator=().
|
||||||
|
*/
|
||||||
template <typename T> Action& operator=(T&& function)
|
template <typename T> Action& operator=(T&& function)
|
||||||
{
|
{
|
||||||
if (m_action) delete m_action;
|
if (m_action) delete m_action;
|
||||||
@ -37,9 +70,12 @@ namespace os
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Call the underlying object.
|
||||||
|
*/
|
||||||
void operator()()
|
void operator()()
|
||||||
{
|
{
|
||||||
check(m_action);
|
expect(m_action, "os::Action called with no underlying callable object");
|
||||||
return m_action->call();
|
return m_action->call();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user