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) {
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(); });