95# ifndef DRIVEN_TABLE_H
96# define DRIVEN_TABLE_H
101# include <functional>
103# include <type_traits>
112typedef void * (*Event_Fct)(
void *);
135template <
typename Signature>
176 template <
typename Callable>
193 template <
typename Callable>
232 template <
typename F>
248 template <
typename...
Args>
252 <<
"index " << index <<
" out of range [0, " <<
size() <<
')';
292 template <
typename Callable>
301 template <
typename Callable>
322 bool check(
const size_t index,
void* (*
fct)(
void*))
const
340 <<
"index " << index <<
" out of range [0, " <<
size() <<
')';
377template <
typename Signature>
384 std::unique_ptr<Event_Handler[]>
table;
447 other.size_table = 0;
463 other.size_table = 0;
513template <
typename Signature>
526 return handler ? &handler :
nullptr;
Exception handling system with formatted messages for Aleph-w.
#define ah_range_error_if(C)
Throws std::range_error if condition holds.
Core header for the Aleph-w library.
size_t size() const noexcept
Return the current dimension of array.
Dynamic (growable) event table implementation.
size_t size() const override
Get the current table size (implements Event_Table virtual method)
typename Event_Table< Signature >::Event_Handler Event_Handler
const Event_Handler * read_table(const size_t i) const override
Read event at index (implements Event_Table virtual method)
Dynamic_Event_Table & operator=(const Dynamic_Event_Table &)=delete
Dynamic_Event_Table(Dynamic_Event_Table &&) noexcept=default
Move constructor.
Dynamic_Event_Table(const Dynamic_Event_Table &)=delete
Copying disabled (events may contain non-copyable captures)
Dynamic_Event_Table(const size_t num_events=0)
Construct a dynamic event table.
DynArray< Event_Handler > table
Dynamic array of event handlers.
void clear_slot(size_t i) override
Clear event at index (implements Event_Table virtual method)
void write_table(const size_t i, Event_Handler &&event_fct) override
Write event at index (implements Event_Table virtual method)
void append_event_to_table(Event_Handler &&fct)
void register_event(const size_t index, Callable &&fct)
virtual ~Event_Table()=default
bool check(const size_t index, void *(*fct)(void *)) const
std::function< void *(void *)> Event_Handler
size_t register_event(Callable &&fct)
virtual size_t size() const =0
void unregister_event(const size_t index)
virtual const Event_Handler * read_table(size_t i) const =0
virtual void write_table(size_t i, Event_Handler &&event_fct)=0
virtual void clear_slot(size_t i)=0
void * execute_event(const size_t index, void *input=nullptr) const
bool is_registered(const size_t index) const
Abstract base class for type-safe event tables.
virtual void write_table(size_t i, Event_Handler &&event_fct)=0
virtual size_t size() const =0
Get the number of event slots in the table.
void append_event_to_table(Event_Handler &&fct)
Append an event to the end of the table (internal use).
bool is_registered(const size_t index) const
Check if an event is registered at the given index.
virtual ~Event_Table()=default
Virtual destructor for proper cleanup in derived classes.
void register_event(const size_t index, Callable &&fct)
Register an event at a specific index.
std::function< Signature > Event_Handler
virtual void clear_slot(size_t i)=0
size_t register_event(Callable &&fct)
Append a new event and return its auto-assigned index.
void unregister_event(const size_t index)
Unregister an event at the given index.
bool check(const size_t, F) const
Legacy check method (for backward compatibility).
virtual const Event_Handler * read_table(size_t i) const =0
auto execute_event(const size_t index, Args &&... args) const
Execute the event at the given index with type-safe arguments.
Fixed-size event table implementation.
void write_table(const size_t i, Event_Handler &&event_fct) override
Write event at index (implements Event_Table virtual method)
void clear_slot(size_t i) override
Clear event at index (implements Event_Table virtual method)
Static_Event_Table(const size_t num_events=0)
Construct a static event table with a fixed size.
~Static_Event_Table() override=default
Destructor - automatically frees the underlying array.
Static_Event_Table(const Static_Event_Table &)=delete
Copying disabled (events may contain non-copyable captures)
Static_Event_Table & operator=(const Static_Event_Table &)=delete
Static_Event_Table & operator=(Static_Event_Table &&other) noexcept
Move assignment - transfers ownership of the array.
size_t size_table
Fixed size of the table.
typename Event_Table< Signature >::Event_Handler Event_Handler
std::unique_ptr< Event_Handler[]> table
Array of event handlers.
const Event_Handler * read_table(const size_t i) const override
Read event at index (implements Event_Table virtual method)
Static_Event_Table(Static_Event_Table &&other) noexcept
Move constructor - transfers ownership of the array.
void verify_index(const size_t i) const
Verify index is within valid range.
size_t size() const override
Get table size (implements Event_Table virtual method)
size_t size(Node *root) noexcept
DynList< T > maps(const C &c, Op op)
Classic map operation.
Lazy and scalable dynamic array implementation.