Helios Engine 0.1.0
A modular ECS based data-oriented C++23 game engine
 
Loading...
Searching...
No Matches
event_writer.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <concepts>
7#include <ranges>
8
9namespace helios::ecs {
10
11/**
12 * @brief Type-safe writer for events.
13 * @details Provides a clean, ergonomic API for writing events to the event system.
14 * EventWriter is a lightweight wrapper around EventManager that enforces type safety
15 * and provides convenient methods for bulk operations and in-place construction.
16 * @note EventWriter holds a non-const reference to EventManager and is not thread-safe.
17 * EventWriter is intended to be short-lived (function-scoped).
18 * @tparam T Event type
19 *
20 * @code
21 * auto writer = world.WriteEvents<MyEvent>();
22 * writer.Write(MyEvent{42});
23 * writer.Emplace(42); // Construct in-place
24 * writer.WriteBulk(event_span);
25 * @endcode
26 */
27template <EventTrait T>
29public:
30 /**
31 * @brief Constructs an EventWriter.
32 * @param manager Reference to the event manager
33 */
34 explicit constexpr EventWriter(details::EventManager& manager) noexcept : manager_(manager) {}
35 EventWriter(const EventWriter&) = delete;
38
41
42 /**
43 * @brief Writes a single event (copy).
44 * @details Copies the event into the current event queue.
45 * @param event Event to write
46 */
47 void Write(const T& event) { manager_.Write(event); }
48
49 /**
50 * @brief Writes multiple events to the queue in bulk.
51 * @tparam R Range of events
52 * @param events Range of events to store
53 */
54 template <std::ranges::sized_range R>
55 requires std::same_as<std::ranges::range_value_t<R>, T>
56 void WriteBulk(const R& events) {
57 manager_.WriteBulk(events);
58 }
59
60 /**
61 * @brief Emplaces an event in-place.
62 * @details Constructs the event directly in the event queue,
63 * avoiding unnecessary copies or moves.
64 * @tparam Args Constructor argument types
65 * @param args Arguments to forward to event constructor
66 */
67 template <typename... Args>
68 requires std::constructible_from<T, Args...>
69 void Emplace(Args&&... args) {
70 manager_.Write(T{std::forward<Args>(args)...});
71 }
72
73private:
74 details::EventManager& manager_; ///< Reference to the event manager
75};
76
77} // namespace helios::ecs
Type-safe writer for events.
void WriteBulk(const R &events)
Writes multiple events to the queue in bulk.
void Write(const T &event)
Writes a single event (copy).
constexpr EventWriter(EventWriter &&) noexcept=default
EventWriter(const EventWriter &)=delete
constexpr EventWriter(details::EventManager &manager) noexcept
Constructs an EventWriter.
void Emplace(Args &&... args)
Emplaces an event in-place.
Manages event lifecycle with double buffering and registration tracking.
void Write(const T &event)
Writes a single event to the current queue.
void WriteBulk(const R &events)
Writes multiple events to the queue in bulk.
BasicQuery< World, Allocator, Components... > Query
Type alias for query with mutable world access.
Definition query.hpp:2481