Add bt::lazy

This commit is contained in:
Nikita Lisitsa 2024-05-30 17:25:46 +03:00
parent e1201e7913
commit 283bc9efe5

View file

@ -0,0 +1,54 @@
#pragma once
#include <psemek/bt/node.hpp>
namespace psemek::bt
{
template <typename Tree, typename NodeFactoryFn>
struct lazy_node;
template <typename Time, typename Event, typename ... Args, typename NodeFactoryFn>
struct lazy_node<tree<Time, Event, Args...>, NodeFactoryFn>
: node<tree<Time, Event, Args...>>
{
using tree_type = tree<Time, Event, Args...>;
using node_type = node<tree_type>;
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<finished>(result))
child_ = nullptr;
return result;
}
bool event(Event const & event, Args ... args) override
{
return child_->event(event, args...);
}
private:
NodeFactoryFn node_factory_;
node_ptr<tree_type> child_;
};
template <typename Tree, typename NodeFactoryFn>
node_ptr<Tree> lazy(NodeFactoryFn && node_factory)
{
return std::make_unique<lazy_node<Tree, NodeFactoryFn>>(std::move(node_factory));
}
}