LeviLamina
Loading...
Searching...
No Matches
RegisterHelper.h
1#pragma once
2
3#include <concepts>
4#include <memory>
5
6#include "ll/api/mod/Mod.h"
7#include "ll/api/mod/NativeMod.h" // IWYU pragma: keep
8
9namespace ll::mod {
10
11template <typename T>
12concept Loadable = requires(T t) {
13 { t.load() } -> std::same_as<bool>;
14};
15
16template <typename T>
17concept Unloadable = requires(T t) {
18 { t.unload() } -> std::same_as<bool>;
19};
20
21template <typename T>
22concept Enableable = requires(T t) {
23 { t.enable() } -> std::same_as<bool>;
24};
25
26template <typename T>
27concept Disableable = requires(T t) {
28 { t.disable() } -> std::same_as<bool>;
29};
30
31#define LL_REGISTER_MOD(CLAZZ, BINDER) \
32 extern "C" { \
33 LL_SHARED_EXPORT bool ll_mod_load(ll::mod::NativeMod& self) { \
34 static_assert(::ll::mod::Loadable<CLAZZ>, #CLAZZ " must be Loadable"); \
35 ::ll::mod::bindToMod((BINDER), self); \
36 return (BINDER).load(); \
37 } \
38 }
39
40template <ll::mod::Loadable T>
41inline void bindToMod(T& myMod, ll::mod::Mod& self) {
42 if constexpr (ll::mod::Enableable<T>) {
43 self.onEnable([&myMod](auto&) { return myMod.enable(); });
44 }
45 if constexpr (ll::mod::Disableable<T>) {
46 self.onDisable([&myMod](auto&) { return myMod.disable(); });
47 }
48 if constexpr (ll::mod::Unloadable<T>) {
49 self.onUnload([&myMod](auto& self) {
50 bool result = myMod.unload();
51 if (result) {
52 self.onEnable({});
53 self.onDisable({});
54 self.onUnload({});
55 }
56 return result;
57 });
58 }
59}
60
61} // namespace ll::mod
Definition Mod.h:17
Definition RegisterHelper.h:27
Definition RegisterHelper.h:22
Definition RegisterHelper.h:12
Definition RegisterHelper.h:17