Dependency sorting
October 18, 2018 ยท View on GitHub
Generic topological sorting for sorting a list of dependencies in C++17
Use
There are two interfaces to choose from: dep_sort_stl and dep_sort.
The first will use std::vector, std::unordered_set and std::unordered_map
to implement a highly efficent O(V+E) dependency resolver container.
There's also however a dep_sort class which lets you supplement your
own vector, set and map implementions. You can use drop in
replacements like Google's densehash or sparsehash and stuff like
Boost's multimap if working with highly dense or sparse data.
As a result this code has no real dependencies other than a working C++17 compiler.
Example
int main() {
dep_sort_stl<std::string> dep;
dep.add_node("a");
dep.add_node("b");
dep.add_node("c");
dep.add_node("d");
std::vector<std::string> as = { "b", "c" };
std::vector<std::string> bs = { "c" };
std::vector<std::string> cs = { "d" };
dep.add_dependencies("a", as);
dep.add_dependencies("b", bs);
dep.add_dependencies("c", cs);
const auto& result = dep.sort();
if (!result.has_cycles()) {
// print the sorted list
for (const auto& value : result.sorted) {
std::cout << value << std::endl;
}
} else {
// print nodes that could not be sorted due to cycles
for (const auto& value : result.unsorted) {
std::cout << value << std::endl;
}
}
}
Documentation
The interfaces are documented in dep_sort.h