< Summary

Information
Class: Gravitas.Queries.Physics3DHitSorter
Assembly: Gravitas
File(s): /home/runner/work/Gravitas/Gravitas/src/Gravitas/Queries/3D/Physics3DHitSorter.cs
Line coverage
100%
Covered lines: 32
Uncovered lines: 0
Coverable lines: 32
Total lines: 76
Line coverage: 100%
Branch coverage
100%
Covered branches: 22
Total branches: 22
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
SortByDistance(...)100%11100%
SortByDistance(...)100%66100%
SiftDown(...)100%1010100%
ComesBefore(...)100%66100%
Swap(...)100%11100%

File(s)

/home/runner/work/Gravitas/Gravitas/src/Gravitas/Queries/3D/Physics3DHitSorter.cs

#LineLine coverage
 1//=======================================================================
 2// Physics3DHitSorter.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2026–present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using SwiftCollections;
 9using System.Runtime.CompilerServices;
 10
 11namespace Gravitas.Queries;
 12
 13internal static class Physics3DHitSorter
 14{
 15    internal static void SortByDistance(SwiftList<Physics3DHit> hits)
 16    {
 2269017        SortByDistance(hits, 0, hits.Count);
 2269018    }
 19
 20    internal static void SortByDistance(SwiftList<Physics3DHit> hits, int start, int count)
 21    {
 2269022        if (count < 2)
 2183623            return;
 24
 343225        for (int root = (count / 2) - 1; root >= 0; root--)
 86226            SiftDown(hits, start, root, count);
 27
 396828        for (int end = count - 1; end > 0; end--)
 29        {
 113030            Swap(hits, start, start + end);
 113031            SiftDown(hits, start, 0, end);
 32        }
 85433    }
 34
 35    private static void SiftDown(SwiftList<Physics3DHit> hits, int start, int root, int count)
 36    {
 95037        while (true)
 38        {
 294239            int child = (root * 2) + 1;
 294240            if (child >= count)
 179641                return;
 42
 114643            int swapIndex = root;
 114644            if (ComesBefore(hits[start + swapIndex], hits[start + child]))
 92545                swapIndex = child;
 46
 114647            int right = child + 1;
 114648            if (right < count && ComesBefore(hits[start + swapIndex], hits[start + right]))
 24249                swapIndex = right;
 50
 114651            if (swapIndex == root)
 19652                return;
 53
 95054            Swap(hits, start + root, start + swapIndex);
 95055            root = swapIndex;
 56        }
 57    }
 58
 59    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 60    internal static bool ComesBefore(Physics3DHit left, Physics3DHit right)
 61    {
 165062        int distanceCompare = left.Distance.CompareTo(right.Distance);
 165063        if (distanceCompare != 0)
 157964            return distanceCompare < 0;
 65
 7166        return (left.Collider?.Id ?? -1) < (right.Collider?.Id ?? -1);
 67    }
 68
 69    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 70    private static void Swap(SwiftList<Physics3DHit> hits, int left, int right)
 71    {
 208072        Physics3DHit temp = hits[left];
 208073        hits[left] = hits[right];
 208074        hits[right] = temp;
 208075    }
 76}