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
|
||||
{
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue