diff --git a/libs/react/include/psemek/react/debug.hpp b/libs/react/include/psemek/react/debug.hpp new file mode 100644 index 00000000..4b7f1ebf --- /dev/null +++ b/libs/react/include/psemek/react/debug.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include + +namespace psemek::react +{ + + template + value debug_marker(std::string marker, value value) + { + value.node(detail::internal_tag{})->debug_marker = std::move(marker); + return value; + } + +} diff --git a/libs/react/include/psemek/react/value.hpp b/libs/react/include/psemek/react/value.hpp index 884cbf6b..e2dd8f0f 100644 --- a/libs/react/include/psemek/react/value.hpp +++ b/libs/react/include/psemek/react/value.hpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace psemek::react { @@ -20,6 +21,8 @@ namespace psemek::react struct forever_tag {}; + void on_node_destroyed(std::string const & debug_marker); + template struct node { @@ -31,12 +34,19 @@ namespace psemek::react std::optional cached_value; std::vector> subscriptions; + std::string debug_marker; + T const & value() { if (!cached_value) cached_value.emplace(getter()); return *cached_value; } + + ~node() + { + on_node_destroyed(debug_marker); + } }; template <> @@ -47,8 +57,15 @@ namespace psemek::react util::signal<> internal_signal; util::signal<> external_signal; + std::string debug_marker; + void value() {} + + ~node() + { + on_node_destroyed(debug_marker); + } }; template @@ -125,6 +142,11 @@ namespace psemek::react return node_->internal_signal.subscribe(std::move(subscriber)); } + std::shared_ptr> node(detail::internal_tag) + { + return node_; + } + protected: std::shared_ptr> node_; diff --git a/libs/react/source/value.cpp b/libs/react/source/value.cpp new file mode 100644 index 00000000..e09c8333 --- /dev/null +++ b/libs/react/source/value.cpp @@ -0,0 +1,18 @@ +#include +#include + +namespace psemek::react +{ + + namespace detail + { + + void on_node_destroyed(std::string const & debug_marker) + { + // Can put a breakpoint here to track destruction of specific nodes + unused(debug_marker); + } + + } + +}