1#include "Library/Rail/Graph.h"
2
3namespace al {
4
5Graph::Graph(s32 vertices_size, s32 edges_size) {
6 mVertices.allocBuffer(ptrNumMax: vertices_size, heap: nullptr);
7 mEdges.allocBuffer(ptrNumMax: edges_size, heap: nullptr);
8}
9
10void Graph::appendVertex(s32 size) {
11 appendVertex(vertex: new Vertex(size, mVertices.size()));
12}
13
14void Graph::appendVertex(Vertex* vertex) {
15 mVertices.pushBack(ptr: vertex);
16}
17
18void Graph::removeVertex(const Vertex* vertex) { // FIXME mismatching
19 for (s32 i = 0; i < mVertices.size(); i++) {
20 if (mVertices[i] == vertex) {
21 for (s32 i = 0; i < vertex->getEdges().size(); i++)
22 removeEdge(edge: vertex->getEdges()[i]);
23 mVertices.erase(position: i);
24 return;
25 }
26 }
27}
28
29void Graph::removeEdge(const Edge* edge) {
30 for (s32 i = 0; i < mEdges.size(); i++) {
31 if (mEdges[i] == edge) {
32 mEdges.erase(position: i);
33 return;
34 }
35 }
36}
37
38Graph::Edge* Graph::tryFindEdge(s32 index_vertex1, s32 index_vertex2) const {
39 for (s32 i = 0; i < mEdges.size(); i++) {
40 auto* edge = mEdges[i];
41 if (edge->getVertex1()->getIndex() == index_vertex1 &&
42 edge->getVertex2()->getIndex() == index_vertex2)
43 return edge;
44 }
45 return nullptr;
46}
47
48void Graph::appendEdge(Edge* edge) {
49 edge->getVertex1()->addEdge(edge);
50 edge->getVertex2()->addEdge(edge);
51 mEdges.pushBack(ptr: edge);
52}
53
54bool Graph::tryAppendEdge(Edge* edge) {
55 if (tryFindEdge(index_vertex1: edge->getVertex1()->getIndex(), index_vertex2: edge->getVertex2()->getIndex()))
56 return false;
57
58 edge->getVertex1()->tryAddEdge(edge);
59 edge->getVertex2()->tryAddEdge(edge);
60 mEdges.pushBack(ptr: edge);
61 return true;
62}
63
64void Graph::appendEdge(s32 index_vertex1, s32 index_vertex2, f32 weight) {
65 Vertex* vertex1 = mVertices[index_vertex1];
66 Vertex* vertex2 = mVertices[index_vertex2];
67 Edge* edge = new Edge(vertex1, vertex2, weight);
68
69 vertex1->addEdge(edge);
70 vertex2->addEdge(edge);
71 mEdges.pushBack(ptr: edge);
72}
73
74bool Graph::tryAppendEdge(s32 index_vertex1, s32 index_vertex2, f32 weight) {
75 if (tryFindEdge(index_vertex1, index_vertex2))
76 return false;
77
78 Vertex* vertex1 = mVertices[index_vertex1];
79 Vertex* vertex2 = mVertices[index_vertex2];
80 Edge* edge = new Edge(vertex1, vertex2, weight);
81
82 vertex1->addEdge(edge);
83 vertex2->addEdge(edge);
84 mEdges.pushBack(ptr: edge);
85 return true;
86}
87
88} // namespace al
89