1#ifndef ENTT_PROCESS_PROCESS_HPP
2#define ENTT_PROCESS_PROCESS_HPP
69template<
typename Derived,
typename Delta>
71 enum class state : std::uint8_t {
82 template<
typename Target = Derived>
83 auto next(std::integral_constant<state, state::uninitialized>)
84 ->
decltype(std::declval<Target>().init(), void()) {
85 static_cast<Target *
>(
this)->init();
88 template<
typename Target = Derived>
89 auto next(std::integral_constant<state, state::running>, Delta delta,
void *data)
90 ->
decltype(std::declval<Target>().update(delta, data), void()) {
91 static_cast<Target *
>(
this)->update(delta, data);
94 template<
typename Target = Derived>
95 auto next(std::integral_constant<state, state::succeeded>)
96 ->
decltype(std::declval<Target>().succeeded(), void()) {
97 static_cast<Target *
>(
this)->succeeded();
100 template<
typename Target = Derived>
101 auto next(std::integral_constant<state, state::failed>)
102 ->
decltype(std::declval<Target>().failed(), void()) {
103 static_cast<Target *
>(
this)->failed();
106 template<
typename Target = Derived>
107 auto next(std::integral_constant<state, state::aborted>)
108 ->
decltype(std::declval<Target>().aborted(), void()) {
109 static_cast<Target *
>(
this)->aborted();
112 void next(...)
const noexcept {}
123 current = state::succeeded;
135 current = state::failed;
146 if(current == state::running) {
147 current = state::paused;
158 if(current == state::paused) {
159 current = state::running;
169 static_assert(std::is_base_of_v<process, Derived>,
"Incorrect use of the class template");
180 void abort(
const bool immediately =
false) {
182 current = state::aborted;
194 [[nodiscard]]
bool alive() const noexcept {
195 return current == state::running || current == state::paused;
203 return current == state::finished;
210 [[nodiscard]]
bool paused() const noexcept {
211 return current == state::paused;
219 return current == state::rejected;
227 void tick(
const Delta delta,
void *data =
nullptr) {
229 case state::uninitialized:
230 next(std::integral_constant<state, state::uninitialized>{});
231 current = state::running;
234 next(std::integral_constant<state, state::running>{}, delta, data);
243 case state::succeeded:
244 next(std::integral_constant<state, state::succeeded>{});
245 current = state::finished;
248 next(std::integral_constant<state, state::failed>{});
249 current = state::rejected;
252 next(std::integral_constant<state, state::aborted>{});
253 current = state::rejected;
262 state current{state::uninitialized};
304template<
typename Func,
typename Delta>
311 template<
typename... Args>
313 : Func{std::forward<Args>(args)...} {}
320 void update(
const Delta delta,
void *data) {
325 [
this]() { this->
fail(); });
Base class for processes.
bool finished() const noexcept
Returns true if a process is already terminated.
void pause() noexcept
Stops a process if it's in a running state.
void succeed() noexcept
Terminates a process with success if it's still alive.
void unpause() noexcept
Restarts a process if it's paused.
Delta delta_type
Type used to provide elapsed time.
bool rejected() const noexcept
Returns true if a process terminated with errors.
virtual ~process() noexcept
Default destructor.
void fail() noexcept
Terminates a process with errors if it's still alive.
bool alive() const noexcept
Returns true if a process is either running or paused.
void tick(const Delta delta, void *data=nullptr)
Updates a process and its internal state if required.
bool paused() const noexcept
Returns true if a process is currently paused.
void abort(const bool immediately=false)
Aborts a process if it's still alive.
Adaptor for lambdas and functors to turn them into processes.
void update(const Delta delta, void *data)
Updates a process and its internal state if required.
process_adaptor(Args &&...args)
Constructs a process adaptor from a lambda or a functor.