3#include "pixelbullet/core/bits.h"
13namespace pixelbullet::core
35enum class EventCategory : std::uint32_t
53[[nodiscard]]
constexpr EventCategory operator|(
const EventCategory lhs,
const EventCategory rhs)
noexcept
55 using Underlying = std::underlying_type_t<EventCategory>;
56 return static_cast<EventCategory
>(
static_cast<Underlying
>(lhs) |
static_cast<Underlying
>(rhs));
59[[nodiscard]]
constexpr EventCategory operator&(
const EventCategory lhs,
const EventCategory rhs)
noexcept
61 using Underlying = std::underlying_type_t<EventCategory>;
62 return static_cast<EventCategory
>(
static_cast<Underlying
>(lhs) &
static_cast<Underlying
>(rhs));
65constexpr EventCategory& operator|=(EventCategory& lhs,
const EventCategory rhs)
noexcept
71[[nodiscard]]
constexpr EventResult merge_event_results(
const EventResult current,
const EventResult next)
noexcept
73 if (current == EventResult::Consumed || next == EventResult::Consumed)
75 return EventResult::Consumed;
78 if (current == EventResult::Handled || next == EventResult::Handled)
80 return EventResult::Handled;
83 return EventResult::Ignored;
86#define PB_EVENT_TYPE(event_type) \
87 [[nodiscard]] static constexpr pixelbullet::core::EventType static_type() noexcept \
89 return pixelbullet::core::EventType::event_type; \
91 [[nodiscard]] pixelbullet::core::EventType type() const override \
93 return static_type(); \
95 [[nodiscard]] const char* name() const override \
100#define PB_EVENT_CATEGORIES(event_categories) \
101 [[nodiscard]] pixelbullet::core::EventCategory categories() const override \
103 return event_categories; \
109 virtual ~Event() =
default;
111 [[nodiscard]]
virtual EventType type()
const = 0;
112 [[nodiscard]]
virtual const char* name()
const = 0;
113 [[nodiscard]]
virtual EventCategory categories()
const = 0;
114 [[nodiscard]]
virtual std::string to_string()
const
119 [[nodiscard]]
bool is_in_category(EventCategory category)
const;
121 [[nodiscard]] EventResult result()
const noexcept
126 [[nodiscard]]
bool handled()
const noexcept
128 return result_ == EventResult::Handled || result_ == EventResult::Consumed;
131 [[nodiscard]]
bool consumed()
const noexcept
133 return result_ == EventResult::Consumed;
136 void merge_result(
const EventResult result)
noexcept
138 result_ = merge_event_results(result_, result);
141 void reset_result()
noexcept
143 result_ = EventResult::Ignored;
147 EventResult result_ = EventResult::Ignored;
153 explicit EventDispatcher(
Event& event);
155 template <
typename T,
typename F>
156 requires std::same_as<std::invoke_result_t<F, T&>, EventResult>
157 [[nodiscard]] EventResult dispatch(F&& func)
159 if (event_.type() == T::static_type())
161 const EventResult result = std::invoke(std::forward<F>(func),
static_cast<T&
>(event_));
162 event_.merge_result(result);
165 return EventResult::Ignored;
172std::ostream& operator<<(std::ostream& os,
const Event& e);