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 return setEventEmitter(std::move(fn), getEventId<T>, std::move(mod));
52 requires(std::derived_from<std::remove_cvref_t<T>,
Event>)
53 void publish(T&& event) {
54 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can publish");
55 publish(event, getEventId<T>);
59 requires(std::derived_from<std::remove_cvref_t<T>,
Event>)
60 void publish(std::string_view modName, T&& event) {
61 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can publish");
62 publish(modName, event, getEventId<T>);
69 LLNDAPI
bool hasEvent(
EventIdView const& eventId)
const;
71 LLNDAPI
size_t getListenerCount(
EventIdView const&);
73 template <std::derived_from<Event> T>
74 [[nodiscard]]
size_t getListenerCount() {
75 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
76 return getListenerCount(getEventId<T>);
79 LLAPI
bool addListener(ListenerPtr
const&,
EventIdView const&);
81 template <
class T,
template <
class...>
class L,
class... LT>
82 requires((std::derived_from<T, LT> || ...) && std::derived_from<L<LT...>,
ListenerBase>)
83 bool addListener(std::shared_ptr<L<LT...>>
const& listener) {
84 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
85 return addListener(listener, getEventId<T>);
87 template <
class T = void,
template <
class...>
class L,
class... LT>
88 requires(std::same_as<T, void> && std::derived_from<L<LT...>,
ListenerBase>)
89 bool addListener(std::shared_ptr<L<LT...>>
const& listener) {
90 return (addListener<LT>(listener) && ...);
92 template <std::derived_from<Event> T, std::derived_from<ListenerBase> L = Listener<T>,
class... Args>
93 inline auto emplaceListener(Args&&... args) {
94 auto res = L::create(std::forward<Args>(args)...);
95 if (!addListener<T>(res)) {
101 LLAPI
bool removeListener(ListenerPtr
const&,
EventIdView const&);
103 bool removeListener(ListenerPtr
const& listener) {
return removeListener(listener, EmptyEventId); }
104 template <std::derived_from<Event> T>
105 bool removeListener(ListenerPtr
const& listener) {
106 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
107 return removeListener(listener, getEventId<T>);
110 [[nodiscard]]
bool hasListener(ListenerPtr
const& listener)
const {
111 return hasListener(listener->getId(), EmptyEventId);
113 template <std::derived_from<Event> T>
114 [[nodiscard]]
bool hasListener(ListenerPtr
const& listener)
const {
115 return hasListener(listener->getId(), getEventId<T>);
118 LLNDAPI ListenerPtr getListener(ListenerId
id)
const;
120 bool removeListener(ListenerId
id) {
121 if (
auto listener = getListener(
id); listener) {
122 return removeListener(listener, EmptyEventId);
126 template <std::derived_from<Event> T>
127 bool removeListener(ListenerId
id) {
128 static_assert(std::is_final_v<std::remove_cvref_t<T>>,
"Only final classes can be listen");
129 if (
auto listener = getListener(
id); listener) {
130 return removeListener(listener, getEventId<T>);
135 LLNDAPI
bool hasListener(ListenerId,
EventIdView const&)
const;
137 [[nodiscard]]
bool hasListener(ListenerId
id)
const {
return hasListener(
id, EmptyEventId); }
139 template <std::derived_from<Event> T>
140 [[nodiscard]]
bool hasListener(ListenerId
id)
const {
141 return hasListener(
id, getEventId<T>);