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
{
template <typename Tree>
struct condition;
template <typename Tree, typename ConditionFn>
struct condition_node;
template <typename Time, typename Event, typename ... Args>
struct condition<tree<Time, Event, Args...>>
template <typename Time, typename Event, typename ... Args, typename ConditionFn>
struct condition_node<tree<Time, Event, Args...>, ConditionFn>
: node<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::status;
condition_node(ConditionFn && condition_fn)
: condition_fn_(std::move(condition_fn))
{}
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));
}
}