| 258 | } |
| 259 | |
| 260 | HierarchyLinker::Node::Ptrs BuildHierarchy(std::vector<feature::FeatureBuilder> && fbs, |
| 261 | GetMainTypeFn const & getMainType, |
| 262 | std::shared_ptr<FilterInterface> const & filter) |
| 263 | { |
| 264 | base::EraseIf(fbs, [&](auto const & fb) { return !filter->IsAccepted(fb); }); |
| 265 | HierarchyLinker::Node::Ptrs places; |
| 266 | places.reserve(fbs.size()); |
| 267 | base::Transform(fbs, std::back_inserter(places), |
| 268 | [](auto const & fb) { return tree_node::MakeTreeNode(HierarchyPlace(fb)); }); |
| 269 | auto nodes = HierarchyLinker(std::move(places)).Link(); |
| 270 | // We leave only the trees. |
| 271 | base::EraseIf(nodes, [](auto const & node) { return node->HasParent(); }); |
| 272 | return nodes; |
| 273 | } |
| 274 | |
| 275 | void AddChildrenTo(HierarchyLinker::Node::Ptrs & trees, |
| 276 | std::function<std::vector<HierarchyPlace>(CompositeId const &)> const & fn) |