ArcdpsExtension
 
Loading...
Searching...
No Matches
Singleton.h
Go to the documentation of this file.
1// copied from MIT-Licensed project `GW2Common`
2// https://github.com/Friendly0Fire/GW2Common
3
4#pragma once
5
6#include <concepts>
7#include <functional>
8#include <memory>
9#include <stack>
10#include <stdexcept>
11
12namespace ArcdpsExtension {
18 public:
19 virtual ~BaseSingleton() = default;
20
21 protected:
22 static BaseSingleton* Store(std::unique_ptr<BaseSingleton>&& ptr);
23 static void Clear(BaseSingleton* ptr);
24 };
25
27 public:
28 SingletonManager() = default;
29 // Call this when shutting down `mod_release`
30 void Shutdown() {
31 while (!singletons_.empty())
32 singletons_.pop();
33 }
34
35 [[nodiscard]] bool Empty() const {
36 return singletons_.empty();
37 }
38
39 private:
40 std::stack<std::unique_ptr<BaseSingleton>> singletons_;
41
42 friend class BaseSingleton;
43 };
45
46 template<typename T>
47 class Singleton : public BaseSingleton {
48 public:
49 template<typename T2 = T>
50 requires std::derived_from<T2, T>
51 static T2& instance() {
52 if (!init_) {
53 if constexpr (std::is_default_constructible_v<T2>) {
54 init_ = true;
55 instance_ = (T*) Store(std::make_unique<T2>());
56 } else
57 throw std::logic_error("Singleton is not default-constructible but was not explicitly initialized before access.");
58 }
59
60 return *(T2*) instance_;
61 }
62
63 template<typename T2 = T, typename... Args>
64 requires std::derived_from<T2, T>
65 static T2& init(Args&&... args) {
66 init_ = true;
67 instance_ = (T*) Store(std::make_unique<T2>(std::forward<Args>(args)...));
68 return *(T2*) instance_;
69 }
70
71 template<typename T2>
72 requires std::derived_from<T2, T>
73 static void f(std::function<void(T2&)> action) {
74 if (instance_)
75 action(*(T2*) instance_);
76 }
77
78 static void f(std::function<void(T&)> action) {
79 if (instance_)
80 action(*instance_);
81 }
82
83 static void reset() {
84 if (init_)
85 Clear(instance_);
86 }
87
88 ~Singleton() override {
89 instance_ = nullptr;
90 init_ = false;
91 }
92
93 private:
94 inline static bool init_ = false;
95 inline static T* instance_ = nullptr;
96 };
97} // namespace ArcdpsExtension
Definition Singleton.h:17
virtual ~BaseSingleton()=default
static void Clear(BaseSingleton *ptr)
Definition Singleton.cpp:10
static BaseSingleton * Store(std::unique_ptr< BaseSingleton > &&ptr)
Definition Singleton.cpp:5
Definition Singleton.h:26
void Shutdown()
Definition Singleton.h:30
bool Empty() const
Definition Singleton.h:35
Definition Singleton.h:47
static void f(std::function< void(T2 &)> action)
Definition Singleton.h:73
static void reset()
Definition Singleton.h:83
static T2 & init(Args &&... args)
Definition Singleton.h:65
static void f(std::function< void(T &)> action)
Definition Singleton.h:78
static T2 & instance()
Definition Singleton.h:51
~Singleton() override
Definition Singleton.h:88
Definition ArcdpsExtension.h:10
SingletonManager g_singletonManagerInstance
Definition Singleton.cpp:3