Add bt::lazy
This commit is contained in:
parent
e1201e7913
commit
283bc9efe5
1 changed files with 54 additions and 0 deletions
54
libs/bt/include/psemek/bt/lazy.hpp
Normal file
54
libs/bt/include/psemek/bt/lazy.hpp
Normal 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue