diff --git a/kernel/src/kernel/double_buffer/core.hpp b/kernel/src/kernel/double_buffer/core.hpp index 85b63dc..d6bc36e 100644 --- a/kernel/src/kernel/double_buffer/core.hpp +++ b/kernel/src/kernel/double_buffer/core.hpp @@ -586,10 +586,18 @@ concept Object_Root = requires { requires Object_Core; typename T::template Builder; }; -namespace detail { +// Attached 约束真正进入运行时依赖图的对象必须来自 Attach_Object。Rely_Type 只声明允许绑定的基类型,实际节点在加入图时必须满足该概念。 template -concept Rely_Object = requires { - requires Root_Derived; +concept Attached = requires { + requires Object_Core; + typename T::Attached_Object; + requires Object_Root; + requires std::derived_from; +}; +namespace detail { +// Rely_Object 表示已经附着运行时数据、可以安全进入依赖图的实际对象类型。图内保存 Root* 后静态类型会被擦除,因此该约束必须在入图边界完成。 +template +concept Rely_Object = Attached && requires { typename T::State; typename T::Buffers; requires Prop_State; diff --git a/kernel/src/kernel/double_buffer/object.hpp b/kernel/src/kernel/double_buffer/object.hpp index b607eb0..445e336 100644 --- a/kernel/src/kernel/double_buffer/object.hpp +++ b/kernel/src/kernel/double_buffer/object.hpp @@ -57,13 +57,6 @@ concept Impl_Mechanisms = requires { requires State_List>; }; } -template -concept Attached = requires { - requires Object_Core; - typename T::Attached_Object; - requires Object_Root; - requires std::derived_from; -}; // Impl 在编译期把 Buffer/Rely/State 三类机制叠加到继承链;每一层只声明自己的机制,最终类型汇总完整能力。 template requires detail::Impl_Mechanisms diff --git a/kernel/src/kernel/double_buffer/rely.hpp b/kernel/src/kernel/double_buffer/rely.hpp index d9ddff1..9fa9375 100644 --- a/kernel/src/kernel/double_buffer/rely.hpp +++ b/kernel/src/kernel/double_buffer/rely.hpp @@ -117,7 +117,7 @@ public: this->rely->for_each(std::forward(callback)); } }; - // Editor 只操作待提交图;结构是否合法由编辑完成后的拓扑验证统一判断,不在每个底层操作重复检查。 + // Editor 只操作待提交图;结构是否合法由编辑完成后的拓扑验证统一判断。新增节点和依赖源必须满足 Attached,保证进入图的 Root* 一定已由 Attach_Object 绑定运行时 exchange。 template requires Root_Derived class Editor : public View { private: diff --git a/kernel/src/kernel/render.cpp b/kernel/src/kernel/render.cpp index 6b8c7b3..f40cecb 100644 --- a/kernel/src/kernel/render.cpp +++ b/kernel/src/kernel/render.cpp @@ -2,6 +2,7 @@ #include #include #include +#include "double_buffer/core.hpp" namespace aethera { namespace { class Stage_Registry : ::double_buffer::Pinned { diff --git a/kernel/src/kernel/render.hpp b/kernel/src/kernel/render.hpp index 3501255..1335205 100644 --- a/kernel/src/kernel/render.hpp +++ b/kernel/src/kernel/render.hpp @@ -1,5 +1,6 @@ #pragma once #include "double_buffer/object.hpp" +#include "double_buffer/core.hpp" #include #include #include diff --git a/kernel/src/test/rely_test.cpp b/kernel/src/test/rely_test.cpp index 2fdbc5d..96b49b8 100644 --- a/kernel/src/test/rely_test.cpp +++ b/kernel/src/test/rely_test.cpp @@ -21,6 +21,12 @@ struct Graph_Object : double_buffer::Impl; +static_assert(!double_buffer::Attached); +static_assert(double_buffer::Attached); +static_assert(!double_buffer::detail::Rely_Object); +static_assert(double_buffer::detail::Rely_Object); +static_assert(!double_buffer::detail::State_Rely_Source); +static_assert(double_buffer::detail::State_Rely_Source); } TEST(rely_storage, edited_graph_moves_inward_and_stays_synchronized) { Node first;