CSEngine
Loading...
Searching...
No Matches
ReflectionMgr.h
1#pragma once
2
3#include <string>
4#include <unordered_map>
5#include <functional>
6#include <utility>
7#include "Base/CoreBase.h"
8
9namespace CSE {
10
11 class ReflectionObject;
12
13 class ReflectionMgr : public CoreBase {
14 public:
16 private:
17 struct DefineWrapperNode {
18 std::string m_name;
19 std::function<ReflectionObject*()> m_func;
20 DefineWrapperNode* m_next = nullptr;
21
22 DefineWrapperNode(std::string name, std::function<ReflectionObject*()> func) : m_name(std::move(name)),
23 m_func(std::move(func)) {}
24 };
25
26 typedef DefineWrapperNode* WrapperContainer;
27
28 public:
29 DefineWrapper() = default;
30
31 DefineWrapper(const DefineWrapper& other) : m_defined(other.m_defined), m_node(other.m_node) {}
32
33 static unsigned char* SetDefine(std::string&& type, std::function<ReflectionObject*()>&& func) {
34 if (ReflectionMgr::m_defineWrapper.m_defined == nullptr) {
35 ReflectionMgr::m_defineWrapper.m_defined = new DefineWrapperNode(type, func);
36 ReflectionMgr::m_defineWrapper.m_node = ReflectionMgr::m_defineWrapper.m_defined;
37 return nullptr;
38 }
39 auto& src = ReflectionMgr::m_defineWrapper.m_node;
40 auto* new_obj = new DefineWrapperNode(type, func);
41 src->m_next = new_obj;
42 ReflectionMgr::m_defineWrapper.m_node = new_obj;
43 ReflectionMgr::m_defineWrapper_prev = m_defineWrapper;
44 return nullptr;
45 }
46
47 static void ReleaseDefine() {
48 for (auto* node = ReflectionMgr::m_defineWrapper.m_defined;;) {
49 if (node == nullptr) break;
50 auto* node_next = node->m_next;
51 delete node;
52 node = node_next;
53 }
54 }
55
56 private:
57 WrapperContainer m_defined = nullptr;
58 WrapperContainer m_node = nullptr;
59
60 public:
61 friend ReflectionMgr;
62 };
63
64 public:
65 explicit ReflectionMgr();
66
67 ~ReflectionMgr() override;
68
69 void Init() override;
70 ReflectionObject* CreateObject(const std::string& type);
71
72 private:
73 static DefineWrapper m_defineWrapper;
74 static DefineWrapper m_defineWrapper_prev;
75
76 std::unordered_map<std::string, std::function<ReflectionObject*()>> m_reflected;
77 };
78
79#ifdef __CSE_REFLECTION_ENABLE__
80 CSE::ReflectionMgr::DefineWrapper CSE::ReflectionMgr::m_defineWrapper = CSE::ReflectionMgr::DefineWrapper(CSE::ReflectionMgr::m_defineWrapper_prev);
81 CSE::ReflectionMgr::DefineWrapper CSE::ReflectionMgr::m_defineWrapper_prev = CSE::ReflectionMgr::DefineWrapper();
82#endif
83}