| 378 | } |
| 379 | |
| 380 | static void Engine_orderModule(Module* module, IdentityDictionary<Module*>& touchedModules, std::vector<Module*>& orderedModules, IdentityDictionary<int64_t>& terminalModulesIDs) { |
| 381 | if (!dictContains(touchedModules, module) && !dictContains(terminalModulesIDs, module->id)) { // Ignore feedback loops and terminal modules |
| 382 | dictAdd(touchedModules, module); |
| 383 | for (Output& output : module->outputs) { |
| 384 | for (Cable* cable : output.cables) { |
| 385 | Module* receiver = cable->inputModule; // The input to the cable is the receiving module |
| 386 | Engine_orderModule(receiver, touchedModules, orderedModules, terminalModulesIDs); |
| 387 | } |
| 388 | } |
| 389 | orderedModules.push_back(module); |
| 390 | } |
| 391 | } |
| 392 | |
| 393 | static void Engine_assignOrderedModules(std::vector<Module*>& modules, std::vector<Module*>& orderedModules) { |
| 394 | std::reverse(orderedModules.begin(), orderedModules.end()); // These are stored bottom up |
no test coverage detected