47 const absl::flat_hash_map<std::string, DataT> & data,
48 std::function<ChildListT<ChildT>(
const DataT &)> get_childreen,
49 std::function<std::string(
const ChildT &)> get_child_name)
51 std::vector<std::string> sorted;
52 absl::flat_hash_set<std::string> visited;
53 absl::flat_hash_set<std::string> on_stack;
55 std::function<void(
const std::string&)> visit = [&](
const std::string& name) {
56 if (visited.contains(name))
return;
57 if (on_stack.contains(name)) {
58 spdlog::error(std::format(
"Cycle detected involving : {}", name));
59 throw std::runtime_error(
"Cyclic dependency");
62 on_stack.insert(name);
64 auto it = data.find(name);
65 if (it == data.end()) {
66 spdlog::warn(std::format(
"Missing dependency: {}", name));
71 std::string child_name;
72 for (
const auto& child : get_childreen(it->second))
74 child_name = get_child_name(child);
75 if(child_name.empty())
continue;
81 sorted.push_back(name);
85 for (
const auto& [name, _] : data) {
std::vector< std::string > topologicalSort(const absl::flat_hash_map< std::string, DataT > &data, std::function< ChildListT< ChildT >(const DataT &)> get_childreen, std::function< std::string(const ChildT &)> get_child_name)
Definition utils.hpp:46