| #include "rive/dependency_sorter.hpp" | |
| #include "rive/component.hpp" | |
| using namespace rive; | |
| void DependencySorter::sort(Component* root, std::vector<Component*>& order) | |
| { | |
| order.clear(); | |
| visit(root, order); | |
| } | |
| bool DependencySorter::visit(Component* component, std::vector<Component*>& order) | |
| { | |
| if (m_Perm.find(component) != m_Perm.end()) | |
| { | |
| return true; | |
| } | |
| if (m_Temp.find(component) != m_Temp.end()) | |
| { | |
| fprintf(stderr, "Dependency cycle!\n"); | |
| return false; | |
| } | |
| m_Temp.emplace(component); | |
| auto dependents = component->dependents(); | |
| for (auto dependent : dependents) | |
| { | |
| if (!visit(dependent, order)) | |
| { | |
| return false; | |
| } | |
| } | |
| m_Perm.emplace(component); | |
| order.insert(order.begin(), component); | |
| return true; | |
| } |