typeclass tree start

This commit is contained in:
ProgramSnail 2023-05-07 15:17:37 +03:00
parent c1dec6a0d1
commit 173d50672a
15 changed files with 1475 additions and 35 deletions

View file

@ -15,6 +15,7 @@
namespace info {
// TODO: fix dfs, etc.
// TODO: optimize recalc
class TypeGraph {
@ -69,6 +70,7 @@ public:
size_t cluster_id = verticles_[id].cluster.value();
typeclasses_[id].methods[method.first].definition = method.second.definition;
std::vector<utils::IdType> typeclasses;
typeclasses.reserve(cluster_requirements_[cluster_id].typeclasses.size());
@ -174,20 +176,20 @@ private:
std::vector<std::vector<size_t>> FindClusters() {
std::vector<std::vector<size_t>> clusters;
auto sorted_verticles = TopSort();
auto sorted_verticles = BackTopSort();
std::vector<size_t> marks(sorted_verticles.size(), 0);
for (size_t i = 0; i < sorted_verticles.size(); ++i) {
if (marks[i] == 0) {
clusters.emplace_back();
VisitDfs(i, clusters[i], marks, back_edges_, clusters.size());
BackVisitDfs(i, clusters[i], marks, back_edges_, clusters.size());
}
}
return clusters;
}
void VisitDfs(size_t id,
void BackVisitDfs(size_t id,
std::vector<size_t>& verticles,
std::vector<size_t>& marks,
const std::vector<std::vector<size_t>>& edges,
@ -197,19 +199,20 @@ private:
}
marks[id] = mark;
verticles.push_back(id);
for (size_t i = 0; i < edges[id].size(); ++i) {
VisitDfs(id, verticles, marks, edges, mark);
BackVisitDfs(id, verticles, marks, edges, mark);
}
verticles.push_back(id);
}
std::vector<size_t> TopSort() {
std::vector<size_t> BackTopSort() {
std::vector<size_t> sorted_verticles;
std::vector<size_t> marks(verticles_.size(), 0);
for (size_t i = 0; i < marks.size(); ++i) {
VisitDfs(i, sorted_verticles, marks, edges_, 1);
BackVisitDfs(i, sorted_verticles, marks, edges_, 1);
}
return sorted_verticles;