diff --git a/libs/bt/include/psemek/bt/lazy.hpp b/libs/bt/include/psemek/bt/lazy.hpp new file mode 100644 index 00000000..e1a3cf7a --- /dev/null +++ b/libs/bt/include/psemek/bt/lazy.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include + +namespace psemek::bt +{ + + template + struct lazy_node; + + template + struct lazy_node, NodeFactoryFn> + : node> + { + using tree_type = tree; + using node_type = node; + using typename node_type::finished; + using typename node_type::status; + + lazy_node(NodeFactoryFn && node_factory) + : node_factory_(node_factory) + {} + + void start(Args ... args) override + { + child_ = node_factory_(args...); + child_->start(args...); + } + + status update(Time dt, Args ... args) override + { + auto result = child_->update(dt, args...); + if (std::holds_alternative(result)) + child_ = nullptr; + return result; + } + + bool event(Event const & event, Args ... args) override + { + return child_->event(event, args...); + } + + private: + NodeFactoryFn node_factory_; + node_ptr child_; + }; + + template + node_ptr lazy(NodeFactoryFn && node_factory) + { + return std::make_unique>(std::move(node_factory)); + } + +}