mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-05 22:48:42 +00:00
typeclass tree start
This commit is contained in:
parent
c1dec6a0d1
commit
173d50672a
15 changed files with 1475 additions and 35 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue