改链式调用

This commit is contained in:
2026-08-22 01:25:50 +08:00
parent a8f102bdb1
commit 424784f47d
6 changed files with 535 additions and 554 deletions
@@ -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);
+5 -1
View File
@@ -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>;