改链式调用
This commit is contained in:
@@ -238,6 +238,7 @@ struct Root::Builder {
|
||||
using Prop = typename Object::Prop;
|
||||
using Buffer_Build = detail::Buffer_Build_Storage<typename Object::Buffers>;
|
||||
using Dependency_Graph_Build = detail::Dependency_Graph_Build_Storage<typename Object::Dependency_Graph_Types>;
|
||||
using Final_Builder = typename Object::Builder;
|
||||
std::unique_ptr<Object> object; /* 尚未挂接最终 Private 的对象外壳。 */
|
||||
Prop prop{}; /* build() 前暂存的发布属性写入面。 */
|
||||
Buffer_Build buffer_storage; /* build() 前暂存的普通 Buffer 初值。 */
|
||||
@@ -245,33 +246,33 @@ struct Root::Builder {
|
||||
template <typename... Args>
|
||||
explicit Builder(Args&&... args) : object(new Object(std::forward<Args>(args)...)),
|
||||
dependency_graph_storage(object->memory_resource()) {}
|
||||
Builder& set_pmr(Pmr pmr) {
|
||||
Final_Builder& set_pmr(Pmr pmr) {
|
||||
object->set_pmr_resource(pmr);
|
||||
return *this;
|
||||
return static_cast<Final_Builder&>(*this);
|
||||
}
|
||||
Builder& set_pmr(Pmr::Resource& resource) {
|
||||
Final_Builder& set_pmr(Pmr::Resource& resource) {
|
||||
return set_pmr(Pmr{resource});
|
||||
}
|
||||
Builder& set_pmr(Pmr::Resource* resource) {
|
||||
Final_Builder& set_pmr(Pmr::Resource* resource) {
|
||||
return set_pmr(Pmr{resource});
|
||||
}
|
||||
template <typename Owner, typename Member, detail::Prop_Member_Settable<Prop, Owner, Member> Value>
|
||||
Builder& set(Member Owner::* member, Value&& value) {
|
||||
Final_Builder& set(Member Owner::* member, Value&& value) {
|
||||
prop.*member = std::forward<Value>(value);
|
||||
return *this;
|
||||
return static_cast<Final_Builder&>(*this);
|
||||
}
|
||||
template <detail::Buffer_Tag_In<typename Object::Buffers> Tag, detail::Buffer_Value_Settable<Tag, typename Object::Buffers> Value>
|
||||
Builder& set(Value&& value) {
|
||||
Final_Builder& set(Value&& value) {
|
||||
buffer_storage.template set<Tag>(std::forward<Value>(value));
|
||||
return *this;
|
||||
return static_cast<Final_Builder&>(*this);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types>... Dependency_Graph_Tags, detail::Dependency_Graph_Edit_Callback_For<typename Object::Dependency_Graph_Types, Dependency_Graph_Tags...> Callback>
|
||||
Builder& edit_dependency_graph(Callback&& callback) {
|
||||
Final_Builder& edit_dependency_graph(Callback&& callback) {
|
||||
dependency_graph_storage.template edit<Dependency_Graph_Tags...>(std::forward<Callback>(callback));
|
||||
return *this;
|
||||
return static_cast<Final_Builder&>(*this);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Node_Object>
|
||||
Builder& add_dependency_node(Node_Object* node) {
|
||||
Final_Builder& add_dependency_node(Node_Object* node) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.add(node);
|
||||
@@ -279,7 +280,7 @@ struct Root::Builder {
|
||||
);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, Root_Derived Node_Object>
|
||||
Builder& remove_dependency_node(Node_Object* node) {
|
||||
Final_Builder& remove_dependency_node(Node_Object* node) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.remove(node);
|
||||
@@ -287,15 +288,15 @@ struct Root::Builder {
|
||||
);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, auto Member, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::Prop_Dependency_Source<Member> Source>
|
||||
Builder& add_prop_dependency(Target* target, Source* source) {
|
||||
Final_Builder& add_prop_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>([&](auto& editor) { editor.template add_prop_dependency<Member>(target, source); });
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, typename Prop_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::Prop_Layer_Dependency_Source<Prop_Tag> Source>
|
||||
Builder& add_prop_dependency(Target* target, Source* source) {
|
||||
Final_Builder& add_prop_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>([&](auto& editor) { editor.template add_prop_dependency<Prop_Tag>(target, source); });
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, auto Member, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::State_Dependency_Source<Member> Source>
|
||||
Builder& add_dependency(Target* target, Source* source) {
|
||||
Final_Builder& add_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.template add_dependency<Member>(target, source);
|
||||
@@ -304,7 +305,7 @@ struct Root::Builder {
|
||||
}
|
||||
/* 在构造期依赖图中添加指定 State Tag 的状态层级依赖。 */
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, typename State_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::State_Layer_Dependency_Source<State_Tag> Source>
|
||||
Builder& add_state_dependency(Target* target, Source* source) {
|
||||
Final_Builder& add_state_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.template add_state_dependency<State_Tag>(target, source);
|
||||
@@ -312,7 +313,7 @@ struct Root::Builder {
|
||||
);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, typename Buffer_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::Buffer_Dependency_Source<Buffer_Tag> Source>
|
||||
Builder& add_dependency(Target* target, Source* source) {
|
||||
Final_Builder& add_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.template add_dependency<Buffer_Tag>(target, source);
|
||||
@@ -320,7 +321,7 @@ struct Root::Builder {
|
||||
);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, typename Source_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::Dependency_Object Source>
|
||||
Builder& add_dirty_dependency(Target* target, Source* source) {
|
||||
Final_Builder& add_dirty_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.template add_dirty_dependency<Source_Tag>(target, source);
|
||||
@@ -328,7 +329,7 @@ struct Root::Builder {
|
||||
);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, auto Member, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::State_Dependency_Source<Member> Source>
|
||||
Builder& remove_dependency(Target* target, Source* source) {
|
||||
Final_Builder& remove_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.template remove_dependency<Member>(target, source);
|
||||
@@ -336,16 +337,16 @@ struct Root::Builder {
|
||||
);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, auto Member, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::Prop_Dependency_Source<Member> Source>
|
||||
Builder& remove_prop_dependency(Target* target, Source* source) {
|
||||
Final_Builder& remove_prop_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>([&](auto& editor) { editor.template remove_prop_dependency<Member>(target, source); });
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, typename Prop_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::Prop_Layer_Dependency_Source<Prop_Tag> Source>
|
||||
Builder& remove_prop_dependency(Target* target, Source* source) {
|
||||
Final_Builder& remove_prop_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>([&](auto& editor) { editor.template remove_prop_dependency<Prop_Tag>(target, source); });
|
||||
}
|
||||
/* 从构造期依赖图中移除指定 State Tag 的状态层级依赖。 */
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, typename State_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::State_Layer_Dependency_Source<State_Tag> Source>
|
||||
Builder& remove_state_dependency(Target* target, Source* source) {
|
||||
Final_Builder& remove_state_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.template remove_state_dependency<State_Tag>(target, source);
|
||||
@@ -353,7 +354,7 @@ struct Root::Builder {
|
||||
);
|
||||
}
|
||||
template <detail::Dependency_Graph_Tag_In<typename Object::Dependency_Graph_Types> Dependency_Graph_Tag, typename Buffer_Tag, detail::Bound_Dependency_Graph_Target<detail::Dependency_Graph_Bound_Object<Dependency_Graph_Tag, typename Object::Dependency_Graph_Types>> Target, detail::Buffer_Dependency_Source<Buffer_Tag> Source>
|
||||
Builder& remove_dependency(Target* target, Source* source) {
|
||||
Final_Builder& remove_dependency(Target* target, Source* source) {
|
||||
return edit_dependency_graph<Dependency_Graph_Tag>(
|
||||
[&](auto& editor) {
|
||||
editor.template remove_dependency<Buffer_Tag>(target, source);
|
||||
|
||||
@@ -119,7 +119,11 @@ struct Impl : Obj {
|
||||
using Buffers = typename Obj::Buffers;
|
||||
using Dependency_Graph_Types = typename Obj::Dependency_Graph_Types;
|
||||
using States = typename Obj::States;
|
||||
using Builder = typename Obj::template Builder<Impl>;
|
||||
/* CRTP 最终 Builder:所有基类流式接口都返回本类型,确保 build() 分派到最派生业务 Builder。 */
|
||||
struct Builder : Obj::template Builder<Impl> {
|
||||
using Base = typename Obj::template Builder<Impl>;
|
||||
using Base::Base;
|
||||
};
|
||||
using Attached_Object = Obj;
|
||||
struct Private : Obj::Private, Publish_Double_Buffer<Prop> {
|
||||
using Allocator = std::pmr::polymorphic_allocator<std::byte>;
|
||||
|
||||
Reference in New Issue
Block a user