mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-30 04:24:17 +00:00
89 lines
2.3 KiB
C++
89 lines
2.3 KiB
C++
#include "Library/Rail/Graph.h"
|
|
|
|
namespace al {
|
|
|
|
Graph::Graph(s32 vertices_size, s32 edges_size) {
|
|
mVertices.allocBuffer(vertices_size, nullptr);
|
|
mEdges.allocBuffer(edges_size, nullptr);
|
|
}
|
|
|
|
void Graph::appendVertex(s32 size) {
|
|
appendVertex(new Vertex(size, mVertices.size()));
|
|
}
|
|
|
|
void Graph::appendVertex(Vertex* vertex) {
|
|
mVertices.pushBack(vertex);
|
|
}
|
|
|
|
void Graph::removeVertex(const Vertex* vertex) { // FIXME mismatching
|
|
for (s32 i = 0; i < mVertices.size(); i++) {
|
|
if (mVertices[i] == vertex) {
|
|
for (s32 i = 0; i < vertex->getEdges().size(); i++)
|
|
removeEdge(vertex->getEdges()[i]);
|
|
mVertices.erase(i);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Graph::removeEdge(const Edge* edge) {
|
|
for (s32 i = 0; i < mEdges.size(); i++) {
|
|
if (mEdges[i] == edge) {
|
|
mEdges.erase(i);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
Graph::Edge* Graph::tryFindEdge(s32 index_vertex1, s32 index_vertex2) const {
|
|
for (s32 i = 0; i < mEdges.size(); i++) {
|
|
auto* edge = mEdges[i];
|
|
if (edge->getVertex1()->getIndex() == index_vertex1 &&
|
|
edge->getVertex2()->getIndex() == index_vertex2)
|
|
return edge;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
void Graph::appendEdge(Edge* edge) {
|
|
edge->getVertex1()->addEdge(edge);
|
|
edge->getVertex2()->addEdge(edge);
|
|
mEdges.pushBack(edge);
|
|
}
|
|
|
|
bool Graph::tryAppendEdge(Edge* edge) {
|
|
if (tryFindEdge(edge->getVertex1()->getIndex(), edge->getVertex2()->getIndex()))
|
|
return false;
|
|
|
|
edge->getVertex1()->tryAddEdge(edge);
|
|
edge->getVertex2()->tryAddEdge(edge);
|
|
mEdges.pushBack(edge);
|
|
return true;
|
|
}
|
|
|
|
void Graph::appendEdge(s32 index_vertex1, s32 index_vertex2, f32 weight) {
|
|
Vertex* vertex1 = mVertices[index_vertex1];
|
|
Vertex* vertex2 = mVertices[index_vertex2];
|
|
Edge* edge = new Edge(vertex1, vertex2, weight);
|
|
|
|
vertex1->addEdge(edge);
|
|
vertex2->addEdge(edge);
|
|
mEdges.pushBack(edge);
|
|
}
|
|
|
|
bool Graph::tryAppendEdge(s32 index_vertex1, s32 index_vertex2, f32 weight) {
|
|
if (tryFindEdge(index_vertex1, index_vertex2))
|
|
return false;
|
|
|
|
Vertex* vertex1 = mVertices[index_vertex1];
|
|
Vertex* vertex2 = mVertices[index_vertex2];
|
|
Edge* edge = new Edge(vertex1, vertex2, weight);
|
|
|
|
vertex1->addEdge(edge);
|
|
vertex2->addEdge(edge);
|
|
mEdges.pushBack(edge);
|
|
return true;
|
|
}
|
|
|
|
} // namespace al
|