| 15 | namespace BT |
| 16 | { |
| 17 | void applyRecursiveVisitor(const TreeNode* node, |
| 18 | const std::function<void(const TreeNode*)>& visitor) |
| 19 | { |
| 20 | if(node == nullptr) |
| 21 | { |
| 22 | throw LogicError("One of the children of a DecoratorNode or ControlNode is nullptr"); |
| 23 | } |
| 24 | |
| 25 | visitor(node); |
| 26 | |
| 27 | if(auto control = dynamic_cast<const BT::ControlNode*>(node)) |
| 28 | { |
| 29 | for(const auto& child : control->children()) |
| 30 | { |
| 31 | applyRecursiveVisitor(static_cast<const TreeNode*>(child), visitor); |
| 32 | } |
| 33 | } |
| 34 | else if(auto decorator = dynamic_cast<const BT::DecoratorNode*>(node)) |
| 35 | { |
| 36 | applyRecursiveVisitor(decorator->child(), visitor); |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | void applyRecursiveVisitor(TreeNode* node, const std::function<void(TreeNode*)>& visitor) |
| 41 | { |