3#include "pixelbullet/core/bits.h"
13namespace pixelbullet::core
36enum class EventCategory : std::uint32_t
54[[nodiscard]]
constexpr EventCategory operator|(
const EventCategory lhs,
const EventCategory rhs)
noexcept
56 using Underlying = std::underlying_type_t<EventCategory>;
57 return static_cast<EventCategory
>(
static_cast<Underlying
>(lhs) |
static_cast<Underlying
>(rhs));
60[[nodiscard]]
constexpr EventCategory operator&(
const EventCategory lhs,
const EventCategory rhs)
noexcept
62 using Underlying = std::underlying_type_t<EventCategory>;
63 return static_cast<EventCategory
>(
static_cast<Underlying
>(lhs) &
static_cast<Underlying
>(rhs));
66constexpr EventCategory& operator|=(EventCategory& lhs,
const EventCategory rhs)
noexcept
72[[nodiscard]]
constexpr EventResult merge_event_results(
const EventResult current,
const EventResult next)
noexcept
74 if (current == EventResult::Consumed || next == EventResult::Consumed)
76 return EventResult::Consumed;
79 if (current == EventResult::Handled || next == EventResult::Handled)
81 return EventResult::Handled;
84 return EventResult::Ignored;
87#define PB_EVENT_TYPE(event_type) \
88 [[nodiscard]] static constexpr pixelbullet::core::EventType static_type() noexcept \
90 return pixelbullet::core::EventType::event_type; \
92 [[nodiscard]] pixelbullet::core::EventType type() const override \
94 return static_type(); \
96 [[nodiscard]] const char* name() const override \
101#define PB_EVENT_CATEGORIES(event_categories) \
102 [[nodiscard]] pixelbullet::core::EventCategory categories() const override \
104 return event_categories; \
110 virtual ~Event() =
default;
112 [[nodiscard]]
virtual EventType type()
const = 0;
113 [[nodiscard]]
virtual const char* name()
const = 0;
114 [[nodiscard]]
virtual EventCategory categories()
const = 0;
115 [[nodiscard]]
virtual std::string to_string()
const
120 [[nodiscard]]
bool is_in_category(EventCategory category)
const;
122 [[nodiscard]] EventResult result()
const noexcept
127 [[nodiscard]]
bool handled()
const noexcept
129 return result_ == EventResult::Handled || result_ == EventResult::Consumed;
132 [[nodiscard]]
bool consumed()
const noexcept
134 return result_ == EventResult::Consumed;
137 void merge_result(
const EventResult result)
noexcept
139 result_ = merge_event_results(result_, result);
142 void reset_result()
noexcept
144 result_ = EventResult::Ignored;
148 EventResult result_ = EventResult::Ignored;
154 explicit EventDispatcher(
Event& event);
156 template <
typename T,
typename F>
157 requires std::same_as<std::invoke_result_t<F, T&>, EventResult>
158 [[nodiscard]] EventResult dispatch(F&& func)
160 if (event_.type() == T::static_type())
162 const EventResult result = std::invoke(std::forward<F>(func),
static_cast<T&
>(event_));
163 event_.merge_result(result);
166 return EventResult::Ignored;
173std::ostream& operator<<(std::ostream& os,
const Event& e);