1 #ifndef ENTT_PROCESS_PROCESS_HPP 2 #define ENTT_PROCESS_PROCESS_HPP 7 #include "../config/config.h" 72 template<
typename Derived,
typename Delta>
74 enum class state: unsigned int {
85 using state_value_t = std::integral_constant<state, value>;
87 template<
typename Target = Derived>
88 auto tick(
int, state_value_t<state::UNINITIALIZED>)
89 -> decltype(std::declval<Target>().init()) {
90 static_cast<Target *
>(
this)->init();
93 template<
typename Target = Derived>
94 auto tick(
int, state_value_t<state::RUNNING>, Delta delta,
void *data)
95 -> decltype(std::declval<Target>().update(delta, data)) {
96 static_cast<Target *
>(
this)->update(delta, data);
99 template<
typename Target = Derived>
100 auto tick(
int, state_value_t<state::SUCCEEDED>)
101 -> decltype(std::declval<Target>().succeeded()) {
102 static_cast<Target *
>(
this)->succeeded();
105 template<
typename Target = Derived>
106 auto tick(
int, state_value_t<state::FAILED>)
107 -> decltype(std::declval<Target>().failed()) {
108 static_cast<Target *
>(
this)->failed();
111 template<
typename Target = Derived>
112 auto tick(
int, state_value_t<state::ABORTED>)
113 -> decltype(std::declval<Target>().aborted()) {
114 static_cast<Target *
>(
this)->aborted();
117 template<state value,
typename... Args>
118 void tick(
char, state_value_t<value>, Args &&...)
const ENTT_NOEXCEPT {}
129 current = state::SUCCEEDED;
141 current = state::FAILED;
152 if(current == state::RUNNING) {
153 current = state::PAUSED;
164 if(current == state::PAUSED) {
165 current = state::RUNNING;
175 static_assert(std::is_base_of_v<process, Derived>);
186 void abort(
const bool immediately =
false) ENTT_NOEXCEPT {
188 current = state::ABORTED;
201 return current == state::RUNNING || current == state::PAUSED;
208 bool dead() const ENTT_NOEXCEPT {
209 return current == state::FINISHED;
217 return current == state::PAUSED;
233 void tick(
const Delta delta,
void *data =
nullptr) {
235 case state::UNINITIALIZED:
236 tick(0, state_value_t<state::UNINITIALIZED>{});
237 current = state::RUNNING;
240 tick(0, state_value_t<state::RUNNING>{}, delta, data);
249 case state::SUCCEEDED:
250 tick(0, state_value_t<state::SUCCEEDED>{});
251 current = state::FINISHED;
254 tick(0, state_value_t<state::FAILED>{});
255 current = state::FINISHED;
259 tick(0, state_value_t<state::ABORTED>{});
260 current = state::FINISHED;
270 state current{state::UNINITIALIZED};
314 template<
typename Func,
typename Delta>
321 template<
typename... Args>
323 : Func{std::forward<Args>(args)...}
331 void update(
const Delta delta,
void *data) {
332 Func::operator()(delta, data, [
this]() { this->
succeed(); }, [
this]() { this->
fail(); });
340 #endif // ENTT_PROCESS_PROCESS_HPP void unpause() ENTT_NOEXCEPT
Restarts a process if it's paused.
bool rejected() const ENTT_NOEXCEPT
Returns true if a process terminated with errors.
bool alive() const ENTT_NOEXCEPT
Returns true if a process is either running or paused.
bool dead() const ENTT_NOEXCEPT
Returns true if a process is already terminated.
Delta delta_type
Type used to provide elapsed time.
void pause() ENTT_NOEXCEPT
Stops a process if it's in a running state.
void succeed() ENTT_NOEXCEPT
Terminates a process with success if it's still alive.
bool paused() const ENTT_NOEXCEPT
Returns true if a process is currently paused.
void abort(const bool immediately=false) ENTT_NOEXCEPT
Aborts a process if it's still alive.
void tick(const Delta delta, void *data=nullptr)
Updates a process and its internal state if required.
virtual ~process() ENTT_NOEXCEPT
Default destructor.
void update(const Delta delta, void *data)
Updates a process and its internal state if required.
Base class for processes.
Adaptor for lambdas and functors to turn them into processes.
void fail() ENTT_NOEXCEPT
Terminates a process with errors if it's still alive.
process_adaptor(Args &&... args)
Constructs a process adaptor from a lambda or a functor.