Make bt::condition accept a callable instead of being an interface
This commit is contained in:
parent
fbf21cbdec
commit
a425cc2f65
1 changed files with 17 additions and 6 deletions
|
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue