Make bt::condition accept a callable instead of being an interface

This commit is contained in:
Nikita Lisitsa 2022-06-21 20:09:37 +03:00
parent fbf21cbdec
commit a425cc2f65

View file

@ -5,11 +5,11 @@
namespace psemek::bt namespace psemek::bt
{ {
template <typename Tree> template <typename Tree, typename ConditionFn>
struct condition; struct condition_node;
template <typename Time, typename Event, typename ... Args> template <typename Time, typename Event, typename ... Args, typename ConditionFn>
struct condition<tree<Time, Event, Args...>> struct condition_node<tree<Time, Event, Args...>, ConditionFn>
: node<tree<Time, Event, Args...>> : node<tree<Time, Event, Args...>>
{ {
using tree_type = tree<Time, Event, Args...>; using tree_type = tree<Time, Event, Args...>;
@ -17,12 +17,23 @@ namespace psemek::bt
using typename node_type::finished; using typename node_type::finished;
using typename node_type::status; using typename node_type::status;
condition_node(ConditionFn && condition_fn)
: condition_fn_(std::move(condition_fn))
{}
status update(Time, Args ... args) override status update(Time, Args ... args) override
{ {
return finished{check(args...)}; return finished{condition_fn_(args...)};
} }
virtual bool check(Args ... args) = 0; private:
ConditionFn condition_fn_;
}; };
template <typename Tree, typename ConditionFn>
node_ptr<Tree> condition(ConditionFn && condition_fn)
{
return std::make_unique<condition_node<Tree, ConditionFn>>(std::move(condition_fn));
}
} }