Skip to content

Commit 6429868

Browse files
Add functionality to clear registered behavior trees. (BehaviorTree#439)
Co-authored-by: Jere Liukkonen <[email protected]>
1 parent b3171a5 commit 6429868

File tree

6 files changed

+66
-1
lines changed

6 files changed

+66
-1
lines changed

include/behaviortree_cpp_v3/bt_factory.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ class BehaviorTreeFactory
316316
/// registerBehaviorTreeFromFile or registerBehaviorTreeFromText.
317317
std::vector<std::string> registeredBehaviorTrees() const;
318318

319+
/**
320+
* @brief Clear previously-registered behavior trees.
321+
*/
322+
void clearRegisteredBehaviorTrees();
323+
319324
/**
320325
* @brief instantiateTreeNode creates an instance of a previously registered TreeNode.
321326
*

include/behaviortree_cpp_v3/bt_parser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class Parser
4040

4141
virtual Tree instantiateTree(const Blackboard::Ptr& root_blackboard,
4242
std::string tree_name = {}) = 0;
43+
44+
virtual void clearInternalState() {};
4345
};
4446

4547
} // namespace BT

include/behaviortree_cpp_v3/xml_parsing.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class XMLParser : public Parser
3131
Tree instantiateTree(const Blackboard::Ptr& root_blackboard,
3232
std::string main_tree_to_execute = {}) override;
3333

34+
void clearInternalState() override;
35+
3436
private:
3537
struct Pimpl;
3638
Pimpl* _p;

src/bt_factory.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,14 +227,19 @@ void BehaviorTreeFactory::registerBehaviorTreeFromFile(const std::string& filena
227227

228228
void BehaviorTreeFactory::registerBehaviorTreeFromText(const std::string& xml_text)
229229
{
230-
parser_->loadFromText(xml_text);
230+
parser_->loadFromText(xml_text, true /* add_includes */);
231231
}
232232

233233
std::vector<std::string> BehaviorTreeFactory::registeredBehaviorTrees() const
234234
{
235235
return parser_->registeredBehaviorTrees();
236236
}
237237

238+
void BehaviorTreeFactory::clearRegisteredBehaviorTrees()
239+
{
240+
parser_->clearInternalState();
241+
}
242+
238243
std::unique_ptr<TreeNode> BehaviorTreeFactory::instantiateTreeNode(
239244
const std::string& name, const std::string& ID, const NodeConfiguration& config) const
240245
{

src/xml_parsing.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,11 @@ Tree XMLParser::instantiateTree(const Blackboard::Ptr& root_blackboard,
484484
return output_tree;
485485
}
486486

487+
void XMLParser::clearInternalState()
488+
{
489+
_p->clear();
490+
}
491+
487492
TreeNode::Ptr XMLParser::Pimpl::createNodeFromXML(const XMLElement* element,
488493
const Blackboard::Ptr& blackboard,
489494
const TreeNode::Ptr& node_parent)

tests/gtest_factory.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,3 +407,49 @@ TEST(BehaviorTreeFactory, DecoratorWithTwoChildrenThrows)
407407

408408
ASSERT_THROW(factory.createTreeFromText(xml_text), BehaviorTreeException);
409409
}
410+
411+
TEST(BehaviorTreeFactory, ParserClearRegisteredBehaviorTrees)
412+
{
413+
const std::string tree_xml = R"(
414+
<root>
415+
<BehaviorTree ID="Main">
416+
<AlwaysSuccess />
417+
</BehaviorTree>
418+
</root>
419+
)";
420+
421+
BehaviorTreeFactory factory;
422+
XMLParser parser(factory);
423+
424+
ASSERT_NO_THROW(parser.loadFromText(tree_xml));
425+
426+
const auto trees = parser.registeredBehaviorTrees();
427+
ASSERT_FALSE(trees.empty());
428+
429+
parser.clearInternalState();
430+
431+
const auto trees_after_clear = parser.registeredBehaviorTrees();
432+
EXPECT_TRUE(trees_after_clear.empty());
433+
}
434+
435+
TEST(BehaviorTreeFactory, FactoryClearRegisteredBehaviorTrees)
436+
{
437+
BehaviorTreeFactory factory;
438+
const std::string tree_xml = R"(
439+
<root>
440+
<BehaviorTree ID="Main">
441+
<AlwaysSuccess />
442+
</BehaviorTree>
443+
</root>
444+
)";
445+
446+
ASSERT_NO_THROW(factory.registerBehaviorTreeFromText(tree_xml));
447+
448+
const auto trees = factory.registeredBehaviorTrees();
449+
ASSERT_FALSE(trees.empty());
450+
451+
factory.clearRegisteredBehaviorTrees();
452+
453+
const auto trees_after_clear = factory.registeredBehaviorTrees();
454+
EXPECT_TRUE(trees_after_clear.empty());
455+
}

0 commit comments

Comments
 (0)