Awesome
Dependency sorting
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