Skip to content

Commit fa606be

Browse files
authored
Rewrite Triangulation<T> storage: raw arrays + ReadOnlyMemory, stackalloc, ref mutations (#9)
* Rewrite Triangulation memory layout: arrays + ReadOnlyMemory, stackalloc, ref mutations
1 parent 9184854 commit fa606be

8 files changed

Lines changed: 140 additions & 106 deletions

File tree

src/CDT.Core/CdtUtils.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,12 @@ public static void RemapEdges(List<Edge> edges, IReadOnlyList<int> mapping)
143143
// -------------------------------------------------------------------------
144144

145145
/// <summary>Extracts all unique edges from a triangle list.</summary>
146-
/// <param name="triangles">The triangle list to extract edges from.</param>
146+
/// <param name="triangles">The triangles to extract edges from.</param>
147147
/// <returns>A set containing all unique edges in the triangulation.</returns>
148-
public static HashSet<Edge> ExtractEdgesFromTriangles(IReadOnlyList<Triangle> triangles)
148+
public static HashSet<Edge> ExtractEdgesFromTriangles(ReadOnlySpan<Triangle> triangles)
149149
{
150-
var edges = new HashSet<Edge>(triangles.Count * 3);
151-
foreach (var t in triangles)
150+
var edges = new HashSet<Edge>(triangles.Length * 3);
151+
foreach (ref readonly var t in triangles)
152152
{
153153
edges.Add(new Edge(t.V0, t.V1));
154154
edges.Add(new Edge(t.V1, t.V2));
@@ -167,12 +167,12 @@ public static HashSet<Edge> ExtractEdgesFromTriangles(IReadOnlyList<Triangle> tr
167167
/// A read-only list of read-only lists: for each vertex index, the list of adjacent triangle indices.
168168
/// </returns>
169169
public static IReadOnlyList<IReadOnlyList<int>> CalculateTrianglesByVertex(
170-
IReadOnlyList<Triangle> triangles,
170+
ReadOnlySpan<Triangle> triangles,
171171
int verticesCount)
172172
{
173173
var result = new List<int>[verticesCount];
174174
for (int i = 0; i < verticesCount; i++) result[i] = new List<int>();
175-
for (int i = 0; i < triangles.Count; i++)
175+
for (int i = 0; i < triangles.Length; i++)
176176
{
177177
var t = triangles[i];
178178
result[t.V0].Add(i);

src/CDT.Core/TopologyVerifier.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ public static class TopologyVerifier
1919
public static bool VerifyTopology<T>(Triangulation<T> cdt)
2020
where T : unmanaged, IFloatingPoint<T>, IMinMaxValue<T>, IRootFunctions<T>
2121
{
22-
var triangles = cdt.Triangles;
23-
var vertices = cdt.Vertices;
22+
var triangles = cdt.Triangles.Span;
23+
var vertices = cdt.Vertices.Span;
2424

25-
for (int iT = 0; iT < triangles.Count; iT++)
25+
for (int iT = 0; iT < triangles.Length; iT++)
2626
{
2727
var t = triangles[iT];
2828
// Verify non-invalid vertices
2929
if (t.V0 == Indices.NoVertex || t.V1 == Indices.NoVertex || t.V2 == Indices.NoVertex)
3030
return false;
31-
if (t.V0 >= vertices.Count || t.V1 >= vertices.Count || t.V2 >= vertices.Count)
31+
if (t.V0 >= vertices.Length || t.V1 >= vertices.Length || t.V2 >= vertices.Length)
3232
return false;
3333
// No degenerate (same-vertex) triangles
3434
if (t.V0 == t.V1 || t.V1 == t.V2 || t.V0 == t.V2)
@@ -39,7 +39,7 @@ public static bool VerifyTopology<T>(Triangulation<T> cdt)
3939
{
4040
int iN = t.GetNeighbor(i);
4141
if (iN == Indices.NoNeighbor) continue;
42-
if (iN >= triangles.Count) return false;
42+
if (iN >= triangles.Length) return false;
4343
var tN = triangles[iN];
4444
// Neighbor must reference us back
4545
if (tN.N0 != iT && tN.N1 != iT && tN.N2 != iT)

0 commit comments

Comments
 (0)