------------------------------------------------------------------------------
| 1167 | |
| 1168 | //------------------------------------------------------------------------------ |
| 1169 | void vtkDataAssembly::Visit(int id, vtkDataAssemblyVisitor* visitor, int traversal_order) const |
| 1170 | { |
| 1171 | const auto& internals = (*this->Internals); |
| 1172 | if (visitor == nullptr || internals.NodeMap.find(id) == internals.NodeMap.end()) |
| 1173 | { |
| 1174 | vtkErrorMacro("Invalid parameters."); |
| 1175 | return; |
| 1176 | } |
| 1177 | |
| 1178 | visitor->TraversalOrder = traversal_order; |
| 1179 | visitor->Assembly = this; |
| 1180 | auto& vinternals = *(visitor->Internals); |
| 1181 | |
| 1182 | if (traversal_order == vtkDataAssembly::TraversalOrder::DepthFirst) |
| 1183 | { |
| 1184 | std::function<void(const pugi::xml_node&)> iterate; |
| 1185 | iterate = [&](const pugi::xml_node& node) |
| 1186 | { |
| 1187 | const auto cid = node.attribute("id").as_int(-1); |
| 1188 | vinternals.CurrentNode = node; |
| 1189 | visitor->Visit(cid); |
| 1190 | |
| 1191 | // Do subtree, if enabled. |
| 1192 | if (visitor->GetTraverseSubtree(cid)) |
| 1193 | { |
| 1194 | visitor->BeginSubTree(cid); |
| 1195 | for (const auto& child : node.children()) |
| 1196 | { |
| 1197 | if (::IsAssemblyNode(child)) |
| 1198 | { |
| 1199 | vinternals.CurrentNode = child; |
| 1200 | iterate(child); |
| 1201 | } |
| 1202 | } |
| 1203 | vinternals.CurrentNode = node; |
| 1204 | visitor->EndSubTree(cid); |
| 1205 | } |
| 1206 | }; |
| 1207 | iterate(internals.NodeMap.at(id)); |
| 1208 | } |
| 1209 | else |
| 1210 | { |
| 1211 | // breadth-first traversal. |
| 1212 | std::deque<pugi::xml_node> fifo_visited; |
| 1213 | vinternals.CurrentNode = internals.NodeMap.at(id); |
| 1214 | visitor->Visit(id); |
| 1215 | |
| 1216 | fifo_visited.push_back(internals.NodeMap.at(id)); |
| 1217 | while (!fifo_visited.empty()) |
| 1218 | { |
| 1219 | auto node = fifo_visited.front(); |
| 1220 | fifo_visited.pop_front(); |
| 1221 | |
| 1222 | const auto cid = node.attribute("id").as_int(-1); |
| 1223 | vinternals.CurrentNode = node; |
| 1224 | if (visitor->GetTraverseSubtree(cid)) |
| 1225 | { |
| 1226 | visitor->BeginSubTree(cid); |
no test coverage detected