| #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; |
| } |