Files
Coroutines/docs/coroutines/Predicate.md
T
2026-09-14 09:42:06 -03:00

1.9 KiB

Predicate

#include <acrux/coroutines/Predicate.h>

Description

Predicate is a small-buffer-optimized, type-erased bool() callable. Any callable that fits within its inline buffer is stored directly, without a heap allocation — covering the common case of a lambda capturing this and a small number of local values.

It is used directly by Coroutine::promise_type to store whatever condition the currently suspended coroutine is waiting on (see Coroutine.md), and by the helpers in standard/WaitConditions.h. Unlike those helpers, Predicate is part of the core module — the scheduler's ability to wait on an arbitrary condition depends on it.

Predicate p1 = [this]{ return this->targetInRange; };
Predicate p2 = [hp = enemy->hp]{ return hp <= 0; };

Members

Member Description
Predicate() Constructs an empty predicate. operator bool() returns false; calling operator() asserts.
Predicate(f) Constructs from any callable f convertible to bool(). Requires sizeof(std::decay_t<F>) <= 32 bytes and alignof(std::decay_t<F>) <= alignof(std::max_align_t); both are enforced with static_assert. A lambda exceeding this size should capture by pointer or reference instead of by value.
operator()() const Invokes the stored callable. Asserts if the predicate is empty.
operator bool() const explicit. true if a callable is currently stored.
Move construction / assignment Transfers the stored callable.
Copy construction / assignment Deleted. Predicate is move-only.

Notes

The 32-byte inline buffer size is fixed at compile time and is not configurable per instance. Storage larger than this is not supported; there is no fallback to heap allocation. Predicate is implemented with a small, hand-written function-pointer table rather than std::function, specifically to guarantee no heap allocation for anything that fits.