改链式调用
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>;
|
||||
|
||||
@@ -9,8 +9,7 @@ namespace aethera::render_2d {
|
||||
/* 执行二维 Renderable 图、合成颜色层并发布最终像素帧。 */
|
||||
struct Render_Scene_2D : Def<Render_Scene_2D, Scene,
|
||||
Dependency_Graph_Type<Paint_Tag, Renderable_2D_Base>,
|
||||
Dependency_Graph_Type<Paint_Cache_Tag, Renderable_2D_Base>
|
||||
> {
|
||||
Dependency_Graph_Type<Paint_Cache_Tag, Renderable_2D_Base>> {
|
||||
struct Prop : Prev_Prop {
|
||||
Size viewport{}; /* 最终帧的像素尺寸;空尺寸不执行渲染。 */
|
||||
Color background{Color::black()}; /* 每帧合成前写入的背景颜色。 */
|
||||
@@ -25,10 +24,11 @@ struct Render_Scene_2D : Def<Render_Scene_2D, Scene,
|
||||
template <typename Object>
|
||||
struct Builder : Prev_Builder<Object> {
|
||||
using Base = Prev_Builder<Object>;
|
||||
using Final_Builder = typename Object::Builder;
|
||||
Builder();
|
||||
template <Attached Renderable_Object>
|
||||
requires std::derived_from<Renderable_Object, Renderable_2D_Base>
|
||||
Builder& add_renderable(Renderable_Object* renderable);
|
||||
Final_Builder& add_renderable(Renderable_Object* renderable);
|
||||
[[nodiscard]] std::expected<std::unique_ptr<Object>, Dependency_Graph_Error> build();
|
||||
private:
|
||||
std::vector<std::function<std::expected<void, Dependency_Graph_Error>(Object*)>> attachments{}; /* 仅在 build 期间绑定已构造 Renderable。 */
|
||||
|
||||
@@ -10,7 +10,7 @@ Render_Scene_2D::Builder<Object>::Builder() : Base() {}
|
||||
template <typename Object>
|
||||
template <Attached Renderable_Object>
|
||||
requires std::derived_from<Renderable_Object, Renderable_2D_Base>
|
||||
Render_Scene_2D::Builder<Object>& Render_Scene_2D::Builder<Object>::add_renderable(Renderable_Object* renderable) {
|
||||
typename Render_Scene_2D::Builder<Object>::Final_Builder& Render_Scene_2D::Builder<Object>::add_renderable(Renderable_Object* renderable) {
|
||||
attachments.emplace_back([renderable](Object* scene) {
|
||||
auto& data = Base::private_access(renderable).template get<Renderable_2D_Base::Base_Tag>();
|
||||
if (!data.scene_attach)
|
||||
@@ -18,7 +18,7 @@ Render_Scene_2D::Builder<Object>& Render_Scene_2D::Builder<Object>::add_renderab
|
||||
auto attach = std::move(data.scene_attach);
|
||||
return attach(scene);
|
||||
});
|
||||
return *this;
|
||||
return static_cast<Final_Builder&>(*this);
|
||||
}
|
||||
template <typename Object>
|
||||
std::expected<std::unique_ptr<Object>, Dependency_Graph_Error> Render_Scene_2D::Builder<Object>::build() {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
#include "Plot.hpp"
|
||||
|
||||
namespace aethera::web {
|
||||
// 2D
|
||||
[[nodiscard]] std::shared_ptr<Plot> make_spectrum_plot(asio::any_io_executor executor);
|
||||
[[nodiscard]] std::shared_ptr<Plot> make_axes_plot(asio::any_io_executor executor);
|
||||
[[nodiscard]] std::shared_ptr<Plot> make_frequency_trace_plot(asio::any_io_executor executor);
|
||||
@@ -10,5 +10,6 @@ namespace aethera::web {
|
||||
[[nodiscard]] std::shared_ptr<Plot> make_waterfall_plot(asio::any_io_executor executor);
|
||||
[[nodiscard]] std::shared_ptr<Plot> make_constellation_plot(asio::any_io_executor executor);
|
||||
[[nodiscard]] std::shared_ptr<Plot> make_selection_overlay_plot(asio::any_io_executor executor);
|
||||
// 3D
|
||||
[[nodiscard]] std::shared_ptr<Plot> make_datoviz_point_plot(asio::any_io_executor executor);
|
||||
}
|
||||
|
||||
+499
-524
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user