dl
dl_component.h
浏览该文件的文档.
1
17#pragma once
18
19#include <typeinfo>
20#include <typeindex>
21#include <string>
22#include <vector>
23#include <array>
24#include <functional>
25
26#include "dl_type.h"
27#include "math/dl_align.h"
28#include "math/dl_coor.h"
29
30namespace dl
31{
33namespace Cpt
34{
36 template<typename T, uint64_t UID>
38 {
39 public:
40 void Set(T v) { _v = v; }
41 T Get() { return _v; }
42
43 operator bool() { return _v != 0; }
44 Variable(T v) : _v(v) {}
46 private:
47 T _v;
48 };
49
51 template<typename T, uint64_t UID>
53 {
54 public:
55 Function() = default;
56 void operator=(const T& func) { Call = func; }
58 };
59}
60
63{
64 friend class VectorAny;
65public:
66 bool operator==(const AnyType& b) { return _p == b._p; }
67 bool operator!=(const AnyType& b) { return _id != b._id || _p != b._p; }
68
69 //默认构造id为自己
71 _p{nullptr},
72 _id{ typeid(AnyType) }
73 {}
74
75 template<typename T>
77 _id{ typeid(T) }
78 {
79 _p = p;
80#ifndef NDEBUG
81 _nameDebug = typeid(T).name();
82#endif
83 }
84
89 template<typename T>
91 {
92 if (std::type_index(typeid(T)) == _id)
93 {
94 return (T*)_p;
95 }
96 else
97 return nullptr;
98 }
99
103 std::type_index GetId()
104 {
105 return _id;
106 }
107
111 bool IsNull()
112 {
113 return !_p;
114 }
115
116 std::string GetNameDebug()
117 {
118#ifndef NDEBUG
119 return _nameDebug;
120#else
121 return "Debug版本才有此字段!";
122#endif
123 }
124
125private:
126 void* _p;
127 std::type_index _id;
128#ifndef NDEBUG
129 std::string _nameDebug;
130#endif
131};
132
135{
136public:
142 {
143 _vec.push_back(any);
144 }
145
146 void Clear()
147 {
148 _vec.clear();
149 }
150
154 template<typename T>
155 std::vector<T*> GetMulti()
156 {
157 std::vector<T*> ret;
158 for (auto& iter : _vec)
159 {
160 if (iter._id == std::type_index(typeid(T)))
161 {
162 ret.push_back((T*)iter._p);
163 }
164 }
165
166 return ret;
167 }
168
172 template<typename T>
173 T* Get(size_t index = 0)
174 {
175 for (auto& iter : _vec)
176 {
177 if (iter._id == std::type_index(typeid(T)))
178 {
179 if (index == 0)
180 return (T*)(iter._p);
181 else
182 --index;
183 }
184 }
185 return nullptr;
186 }
187
191 auto& GetVector()
192 {
193 return _vec;
194 }
195
196 std::vector<AnyType>::iterator begin() { return _vec.begin(); }
197
198 std::vector<AnyType>::iterator end() { return _vec.end(); }
199
200 size_t GetSize() { return _vec.size(); }
201
202private:
203 std::vector<AnyType> _vec;
204};
205
208{
209public:
211 template <typename T>
212 Components(T* p) : _any(p)
213 {
214#ifndef NDEBUG
215 _nameDebug = _any.GetNameDebug();
216#endif
217 }
218
219 bool operator==(const Components& b) { return _any == b._any; }
220 bool operator!=(const Components& b) { return _any != b._any; }
221
226 template <typename T>
227 T* Cast() { return _any.Cast<T>(); }
228
232 template <typename T>
233 T* Get(size_t index = 0) { return _vec.Get<T>(index); }
234
237 {
238 return _any;
239 }
240
246 {
247 _vec.PushBack(any);
248 }
249
250 void Clear()
251 {
252 _vec.Clear();
253 }
254
255 VectorAny& GetVectorAny() { return _vec; }
256
257 std::string GetName()
258 {
259 return _name;
260 }
261
263 void SetName(std::string_view name)
264 {
265 _name = name;
266 }
267
269 bool IsPure()
270 {
271 return _any.IsNull();
272 }
273private:
274 VectorAny _vec;
275 AnyType _any;
276 std::string _name;
277#ifndef NDEBUG
278 std::string _nameDebug;
279#endif
280};
281
282inline Components* createComponents(std::string_view name = {})
283{
284 Components* ret = new Components((int*)nullptr);
285 ret->SetName(name);
286 return ret;
287}
288
289namespace Cpt
290{
294 template<typename T>
295 std::vector<T*> GetComp(std::vector<Components*>& vec)
296 {
297 std::vector<T*> ret;
298 for (Components* cpt : vec)
299 {
300 VectorAny& vec_any = cpt->GetVectorAny();
301 std::vector<T*> mul = vec_any.GetMulti<T>();
302 ret.insert(ret.end(), mul.begin(), mul.end());
303 }
304 return ret;
305 }
306
310 template<typename T>
311 T* GetFirst(std::vector<Components*>& vec)
312 {
313 for (Components* cpt : vec)
314 {
315 T* p = cpt->GetSelf().Cast<T>();
316 if (p)
317 return p;
318 }
319 return nullptr;
320 }
321
324 template<typename T>
325 T* GetN(std::vector<Components*>& vec, size_t n)
326 {
327 for (Components* cpt : vec)
328 {
329 T* p = cpt->GetSelf().Cast<T>();
330 if(!p || n--)
331 continue;
332 return p;
333 }
334 return nullptr;
335 }
336}
337
338}
任意类型包装
std::type_index GetId()
返回类型id
T * Cast()
试图转到指定类型
bool operator==(const AnyType &b)
bool operator!=(const AnyType &b)
std::string GetNameDebug()
bool IsNull()
是否为空
friend class VectorAny
T * Cast()
试图转到指定类型
T * Get(size_t index=0)
返回第n个类型对象,失败返回nullptr
void SetName(std::string_view name)
设置自定义名字
AnyType GetSelf()
返回自身
bool operator==(const Components &b)
bool operator!=(const Components &b)
std::string GetName()
Components(T *p)
any表示实际的对象(比如UI::Text),any为空则为Components
void PushBack(AnyType any)
添加一个任意对象
VectorAny & GetVectorAny()
bool IsPure()
单纯的Componets,any为空
void operator=(const T &func)
Function()=default
任意对象容器(组件)
auto & GetVector()
返回所有对象
T * Get(size_t index=0)
返回第n个类型对象,失败返回nullptr
std::vector< AnyType >::iterator begin()
void PushBack(AnyType any)
添加一个任意对象
std::vector< T * > GetMulti()
返回所有指定类型的对象
std::vector< AnyType >::iterator end()
方向和对齐定义
2d坐标系
通用类型
子组件命名空间
T * GetN(std::vector< Components * > &vec, size_t n)
从vector<Components*>返回指定类型的第n个元素
std::vector< T * > GetComp(std::vector< Components * > &vec)
从vector<Components*>返回指定类型的所有组件
T * GetFirst(std::vector< Components * > &vec)
从vector<Components*>返回指定类型的第一个元素
Components * createComponents(std::string_view name={})