27 std::unique_ptr<EventBusImpl> impl;
30 void removeModListeners(std::string_view modName);
32 void clearMod(std::string_view modName);
35 using FactoryFn = std::function<std::unique_ptr<EmitterBase>()>;
37 LLNDAPI
static EventBus& getInstance();
44 setEventEmitter(FactoryFn fn,
EventIdView const& eventId, std::weak_ptr<mod::Mod> mod = mod::NativeMod::current());
46 template <std::derived_from<Event> T>
47 bool setEventEmitter(FactoryFn fn, std::weak_ptr<mod::Mod> mod = mod::NativeMod::current()) {
48 detail::registerRuntimeEventId<T>();
49 return setEventEmitter(std::move(fn), getEventId<T>, std::move(mod));
53 requires(std::derived_from<std::remove_cvref_t<T>,
Event>)
54 void publish(T&& event) {
55 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can publish");
56 publish(event, getEventId<T>);
60 requires(std::derived_from<std::remove_cvref_t<T>,
Event>)
61 void publish(std::string_view modName, T&& event) {
62 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can publish");
63 publish(modName, event, getEventId<T>);
70 LLNDAPI
bool hasEvent(
EventIdView const& eventId)
const;
72 LLNDAPI
size_t getListenerCount(
EventIdView const&);
74 template <std::derived_from<Event> T>
75 [[nodiscard]]
size_t getListenerCount() {
76 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
77 return getListenerCount(getEventId<T>);
80 LLAPI
bool addListener(ListenerPtr
const&,
EventIdView const&);
82 template <
class T,
template <
class...>
class L,
class... LT>
83 requires((std::derived_from<T, LT> || ...) && std::derived_from<L<LT...>,
ListenerBase>)
84 bool addListener(std::shared_ptr<L<LT...>>
const& listener) {
85 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
86 return addListener(listener, getEventId<T>);
88 template <
class T = void,
template <
class...>
class L,
class... LT>
89 requires(std::same_as<T, void> && std::derived_from<L<LT...>,
ListenerBase>)
90 bool addListener(std::shared_ptr<L<LT...>>
const& listener) {
91 return (addListener<LT>(listener) && ...);
93 template <std::derived_from<Event> T, std::derived_from<ListenerBase> L = Listener<T>,
class... Args>
94 inline auto emplaceListener(Args&&... args) {
95 auto res = L::create(std::forward<Args>(args)...);
96 if (!addListener<T>(res)) {
102 LLAPI
bool removeListener(ListenerPtr
const&,
EventIdView const&);
104 bool removeListener(ListenerPtr
const& listener) {
return removeListener(listener, EmptyEventId); }
105 template <std::derived_from<Event> T>
106 bool removeListener(ListenerPtr
const& listener) {
107 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
108 return removeListener(listener, getEventId<T>);
111 [[nodiscard]]
bool hasListener(ListenerPtr
const& listener)
const {
112 return hasListener(listener->getId(), EmptyEventId);
114 template <std::derived_from<Event> T>
115 [[nodiscard]]
bool hasListener(ListenerPtr
const& listener)
const {
116 return hasListener(listener->getId(), getEventId<T>);
119 LLNDAPI ListenerPtr getListener(ListenerId
id)
const;
121 bool removeListener(ListenerId
id) {
122 if (
auto listener = getListener(
id); listener) {
123 return removeListener(listener, EmptyEventId);
127 template <std::derived_from<Event> T>
128 bool removeListener(ListenerId
id) {
129 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
130 if (
auto listener = getListener(
id); listener) {
131 return removeListener(listener, getEventId<T>);
136 LLNDAPI
bool hasListener(ListenerId,
EventIdView const&)
const;
138 [[nodiscard]]
bool hasListener(ListenerId
id)
const {
return hasListener(
id, EmptyEventId); }
140 template <std::derived_from<Event> T>
141 [[nodiscard]]
bool hasListener(ListenerId
id)
const {
142 return hasListener(
id, getEventId<T>);