🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
ObjectLinker.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/Object.hpp"
25#include "AstUtil/WeakPtr.hpp"
26#include <type_traits>
27
28AST_NAMESPACE_BEGIN
29
38{
39public:
40 ObjectLinker(Object* object)
41 : object_(object)
42 {
43 }
44
45 virtual ~ObjectLinker() = default;
46
49 virtual errc_t resolve() = 0;
50
53 Object* object() const {return object_.get();}
54private:
55 WeakPtr<Object> object_;
56};
57
58
62template <typename Func>
64{
65 Func func_;
66
67 // 非 void 版本
68 template <typename F>
69 static errc_t invoke(F& f,
70 typename std::enable_if<!std::is_void<
71 decltype(std::declval<F>()())>::value>::type* = nullptr)
72 {
73 return f();
74 }
75
76 // void 版本
77 template <typename F>
78 static errc_t invoke(F& f,
79 typename std::enable_if<std::is_void<
80 decltype(std::declval<F>()())>::value>::type* = nullptr)
81 {
82 f();
83 return 0;
84 }
85
86public:
87 ObjectLinkerGeneric(Object* object, Func func)
88 : ObjectLinker(object), func_(func)
89 {
90 }
91
92 virtual errc_t resolve() override
93 {
94 return invoke(func_);
95 }
96};
97
98
99
103AST_UTIL_CAPI void aAddObjectLinker(ObjectLinker* linker);
104
105
109AST_UTIL_CAPI errc_t aObject_ResolveLinks(Object* object);
110
111
115AST_UTIL_CAPI errc_t aResolveAllLinks();
116
117
123template <typename Func>
124inline void aObject_AddDelayedLink(Object* object, Func func)
125{
127}
128
129
130// object methods
131
132template<typename Func>
133inline void Object::addDelayedLink(Func &&link)
134{
135 aObject_AddDelayedLink(this, std::forward<Func>(link));
136}
137
138template<typename Func>
139inline void Object::addDelayedLinkIfFailed(Func &&link)
140{
141 errc_t rc = link();
142 if(rc != eNoError)
143 aObject_AddDelayedLink(this, std::forward<Func>(link));
144}
145
146
147A_ALWAYS_INLINE void Object::resolveLinks()
148{
150}
151
152
155AST_NAMESPACE_END
156
通用对象链接器
定义 ObjectLinker.hpp:64
virtual errc_t resolve() override
解析对象的延迟链接
定义 ObjectLinker.hpp:92
对象链接器
定义 ObjectLinker.hpp:38
virtual errc_t resolve()=0
解析对象的延迟链接
Object * object() const
获取相关对象
定义 ObjectLinker.hpp:53
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:86
弱引用指针
定义 WeakPtr.hpp:35
errc_t aObject_ResolveLinks(Object *object)
解析对象的延迟链接
定义 ObjectLinker.cpp:133
void aObject_AddDelayedLink(Object *object, Func func)
添加对象延迟链接
定义 ObjectLinker.hpp:124
void aAddObjectLinker(ObjectLinker *linker)
添加对象延迟链接
定义 ObjectLinker.cpp:127