1 #ifndef ENTT_PROCESS_PROCESS_HPP 2 #define ENTT_PROCESS_PROCESS_HPP 62 template<
typename Derived,
typename Delta>
64 enum class State: unsigned int {
75 using tag = std::integral_constant<State, state>;
77 template<
typename Target = Derived>
78 auto tick(
int, tag<State::UNINITIALIZED>,
void *data)
79 -> decltype(std::declval<Target>().init(data)) {
80 static_cast<Target *
>(
this)->init(data);
83 template<
typename Target = Derived>
84 auto tick(
int, tag<State::RUNNING>, Delta delta,
void *data)
85 -> decltype(std::declval<Target>().update(delta, data)) {
86 static_cast<Target *
>(
this)->update(delta, data);
89 template<
typename Target = Derived>
90 auto tick(
int, tag<State::SUCCEEDED>)
91 -> decltype(std::declval<Target>().succeeded()) {
92 static_cast<Target *
>(
this)->succeeded();
95 template<
typename Target = Derived>
96 auto tick(
int, tag<State::FAILED>)
97 -> decltype(std::declval<Target>().failed()) {
98 static_cast<Target *
>(
this)->failed();
101 template<
typename Target = Derived>
102 auto tick(
int, tag<State::ABORTED>)
103 -> decltype(std::declval<Target>().aborted()) {
104 static_cast<Target *
>(
this)->aborted();
107 template<State S,
typename... Args>
108 void tick(
char, tag<S>, Args&&...) {}
119 current = State::SUCCEEDED;
131 current = State::FAILED;
142 if(current == State::RUNNING) {
143 current = State::PAUSED;
154 if(current == State::PAUSED) {
155 current = State::RUNNING;
165 static_assert(std::is_base_of<Process, Derived>::value,
"!");
176 void abort(
bool immediately =
false) noexcept {
178 current = State::ABORTED;
191 return current == State::RUNNING || current == State::PAUSED;
199 return current == State::FINISHED;
207 return current == State::PAUSED;
223 void tick(Delta delta,
void *data =
nullptr) {
225 case State::UNINITIALIZED:
226 tick(0, tag<State::UNINITIALIZED>{}, data);
227 current = State::RUNNING;
230 tick(0, tag<State::RUNNING>{}, delta, data);
238 case State::SUCCEEDED:
239 tick(0, tag<State::SUCCEEDED>{});
240 current = State::FINISHED;
243 tick(0, tag<State::FAILED>{});
244 current = State::FINISHED;
248 tick(0, tag<State::ABORTED>{});
249 current = State::FINISHED;
259 State current{State::UNINITIALIZED};
302 template<
typename Func,
typename Delta>
309 template<
typename... Args>
311 : Func{std::forward<Args>(args)...}
320 Func::operator()(delta, data, [
this](){ this->
succeed(); }, [
this](){ this->
fail(); });
328 #endif // ENTT_PROCESS_PROCESS_HPP bool rejected() const noexcept
Returns true if a process terminated with errors.
void succeed() noexcept
Terminates a process with success if it's still alive.
void unpause() noexcept
Restarts a process if it's paused.
void fail() noexcept
Terminates a process with errors if it's still alive.
Base class for processes.
ProcessAdaptor(Args &&... args)
Constructs a process adaptor from a lambda or a functor.
bool alive() const noexcept
Returns true if a process is either running or paused.
Adaptor for lambdas and functors to turn them into processes.
Delta delta_type
Type used to provide elapsed time.
void abort(bool immediately=false) noexcept
Aborts a process if it's still alive.
~Process() noexcept
Default destructor.
bool dead() const noexcept
Returns true if a process is already terminated.
void update(Delta delta, void *data)
Updates a process and its internal state if required.
void pause() noexcept
Stops a process if it's in a running state.
bool paused() const noexcept
Returns true if a process is currently paused.
void tick(Delta delta, void *data=nullptr)
Updates a process and its internal state if required.