Skip to content

Commit 6181d87

Browse files
author
Davide Faconti
committed
Fix: registerBuilder did not register the manifest. It was "broken" as public API method
1 parent e954fb6 commit 6181d87

File tree

3 files changed

+23
-34
lines changed

3 files changed

+23
-34
lines changed

include/behaviortree_cpp/bt_factory.h

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class BehaviorTreeFactory
5252
/** More generic way to register your own builder.
5353
* Most of the time you should use registerSimple???? or registerNodeType<> instead.
5454
*/
55-
void registerBuilder(const std::string& ID, NodeBuilder builder);
55+
void registerBuilder(const TreeNodeManifest& manifest, NodeBuilder builder);
5656

5757
/// Register a SimpleActionNode
5858
void registerSimpleAction(const std::string& ID,
@@ -128,7 +128,6 @@ class BehaviorTreeFactory
128128
"NodeParameters&)\n");
129129

130130
registerNodeTypeImpl<T>(ID);
131-
storeNodeManifest<T>(ID);
132131
}
133132

134133
/// All the builders. Made available mostly for debug purposes.
@@ -166,7 +165,8 @@ class BehaviorTreeFactory
166165
{
167166
return std::unique_ptr<TreeNode>(new T(name));
168167
};
169-
registerBuilder(ID, builder);
168+
TreeNodeManifest manifest = { NodeType::ACTION, ID, NodeParameters() };
169+
registerBuilder(manifest, builder);
170170
}
171171

172172
template <typename T>
@@ -177,7 +177,8 @@ class BehaviorTreeFactory
177177
{
178178
return std::unique_ptr<TreeNode>(new T(name, params));
179179
};
180-
registerBuilder(ID, builder);
180+
TreeNodeManifest manifest = { getType<T>(), ID, T::requiredNodeParameters() };
181+
registerBuilder(manifest, builder);
181182
}
182183

183184
template <typename T>
@@ -193,24 +194,8 @@ class BehaviorTreeFactory
193194
}
194195
return std::unique_ptr<TreeNode>(new T(name, params));
195196
};
196-
registerBuilder(ID, builder);
197-
}
198-
199-
200-
template<typename T>
201-
typename std::enable_if< has_static_method_requiredNodeParameters<T>::value>::type
202-
storeNodeManifest(const std::string& ID)
203-
{
204-
manifests_.push_back( { getType<T>(), ID, T::requiredNodeParameters()} );
205-
sortTreeNodeManifests();
206-
}
207-
208-
template<typename T>
209-
typename std::enable_if< !has_static_method_requiredNodeParameters<T>::value>::type
210-
storeNodeManifest(const std::string& ID)
211-
{
212-
manifests_.push_back( { getType<T>(), ID, NodeParameters()} );
213-
sortTreeNodeManifests();
197+
TreeNodeManifest manifest = { getType<T>(), ID, T::requiredNodeParameters() };
198+
registerBuilder(manifest, builder);
214199
}
215200

216201
void sortTreeNodeManifests();

include/behaviortree_cpp/xml_parsing.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ struct Tree
6464
*
6565
* return: a pair containing the root node (first) and a vector with all the instantiated nodes (second).
6666
*/
67-
Tree buildTreeFromText(const BehaviorTreeFactory& factory, const std::string& text,
67+
Tree buildTreeFromText(const BehaviorTreeFactory& factory,
68+
const std::string& text,
6869
const Blackboard::Ptr& blackboard = Blackboard::Ptr());
6970

7071
/** Helper function to do the most common steps all at once:
@@ -74,7 +75,8 @@ Tree buildTreeFromText(const BehaviorTreeFactory& factory, const std::string& te
7475
*
7576
* return: a pair containing the root node (first) and a vector with all the instantiated nodes (second).
7677
*/
77-
Tree buildTreeFromFile(const BehaviorTreeFactory& factory, const std::string& filename,
78+
Tree buildTreeFromFile(const BehaviorTreeFactory& factory,
79+
const std::string& filename,
7880
const Blackboard::Ptr& blackboard = Blackboard::Ptr());
7981

8082
std::string writeXML(const BehaviorTreeFactory& factory, const TreeNode* root_node,

src/bt_factory.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,17 @@ bool BehaviorTreeFactory::unregisterBuilder(const std::string& ID)
5353
return true;
5454
}
5555

56-
void BehaviorTreeFactory::registerBuilder(const std::string& ID, NodeBuilder builder)
56+
void BehaviorTreeFactory::registerBuilder(const TreeNodeManifest& manifest, NodeBuilder builder)
5757
{
58-
auto it = builders_.find(ID);
58+
auto it = builders_.find( manifest.registration_ID);
5959
if (it != builders_.end())
6060
{
61-
throw BehaviorTreeException("ID '" + ID + "' already registered");
61+
throw BehaviorTreeException("ID '" + manifest.registration_ID + "' already registered");
6262
}
6363

64-
builders_.insert(std::make_pair(ID, builder));
64+
builders_.insert(std::make_pair(manifest.registration_ID, builder));
65+
manifests_.push_back(manifest);
66+
sortTreeNodeManifests();
6567
}
6668

6769
void BehaviorTreeFactory::registerSimpleCondition(
@@ -71,8 +73,8 @@ void BehaviorTreeFactory::registerSimpleCondition(
7173
return std::unique_ptr<TreeNode>(new SimpleConditionNode(name, tick_functor, params));
7274
};
7375

74-
registerBuilder(ID, builder);
75-
storeNodeManifest<SimpleConditionNode>(ID);
76+
TreeNodeManifest manifest = { NodeType::CONDITION, ID, NodeParameters() };
77+
registerBuilder(manifest, builder);
7678
}
7779

7880
void BehaviorTreeFactory::registerSimpleAction(const std::string& ID,
@@ -82,8 +84,8 @@ void BehaviorTreeFactory::registerSimpleAction(const std::string& ID,
8284
return std::unique_ptr<TreeNode>(new SimpleActionNode(name, tick_functor, params));
8385
};
8486

85-
registerBuilder(ID, builder);
86-
storeNodeManifest<SimpleActionNode>(ID);
87+
TreeNodeManifest manifest = { NodeType::ACTION, ID, NodeParameters() };
88+
registerBuilder(manifest, builder);
8789
}
8890

8991
void BehaviorTreeFactory::registerSimpleDecorator(
@@ -93,8 +95,8 @@ void BehaviorTreeFactory::registerSimpleDecorator(
9395
return std::unique_ptr<TreeNode>(new SimpleDecoratorNode(name, tick_functor, params));
9496
};
9597

96-
registerBuilder(ID, builder);
97-
storeNodeManifest<SimpleDecoratorNode>(ID);
98+
TreeNodeManifest manifest = { NodeType::DECORATOR, ID, NodeParameters() };
99+
registerBuilder(manifest, builder);
98100
}
99101

100102
void BehaviorTreeFactory::registerFromPlugin(const std::string file_path)

0 commit comments

Comments
 (0)