1#pragma once
2
3#include <container/seadPtrArray.h>
4
5namespace al {
6
7class Graph {
8public:
9 class Edge;
10
11 class Vertex {
12 public:
13 inline Vertex(s32 size, s32 index) : mIndex(index) { mEdges.allocBuffer(ptrNumMax: size, heap: nullptr); }
14
15 const sead::PtrArray<Edge>& getEdges() const { return mEdges; }
16
17 s32 getIndex() const { return mIndex; }
18
19 void addEdge(Edge* edge) { mEdges.pushBack(ptr: edge); }
20
21 void tryAddEdge(Edge* edge) {
22 for (s32 i = 0; i < mEdges.size(); i++)
23 if (mEdges[i] == edge)
24 return;
25 addEdge(edge);
26 }
27
28 private:
29 sead::PtrArray<Edge> mEdges;
30 s32 mIndex;
31 };
32
33 static_assert(sizeof(Vertex) == 0x18);
34
35 class Edge {
36 public:
37 Edge(Vertex* vertex1, Vertex* vertex2, f32 weight)
38 : mVertex1(vertex1), mVertex2(vertex2), mWeight(weight) {}
39
40 virtual f32 getWeight() const { return mWeight; }
41
42 Vertex* getVertex1() const { return mVertex1; }
43
44 Vertex* getVertex2() const { return mVertex2; }
45
46 private:
47 Vertex* mVertex1;
48 Vertex* mVertex2;
49 f32 mWeight;
50 };
51
52 static_assert(sizeof(Edge) == 0x20);
53
54 Graph(s32 verticesSize, s32 edgesSize);
55 void appendVertex(s32 size);
56 void appendVertex(Vertex* vertex);
57 void removeVertex(const Vertex* vertex);
58 void removeEdge(const Edge* edge);
59 Edge* tryFindEdge(s32 indexVertex1, s32 indexVertex2) const;
60 void appendEdge(Edge* edge);
61 bool tryAppendEdge(Edge* edge);
62 void appendEdge(s32 indexVertex1, s32 indexVertex2, f32 weight);
63 bool tryAppendEdge(s32 indexVertex1, s32 indexVertex2, f32 weight);
64
65private:
66 sead::PtrArray<Vertex> mVertices;
67 sead::PtrArray<Edge> mEdges;
68};
69
70static_assert(sizeof(Graph) == 0x20);
71
72} // namespace al
73