< Summary

Information
Class: Gravitas.Queries.Physics2DHitSorter
Assembly: Gravitas
File(s): /home/runner/work/Gravitas/Gravitas/src/Gravitas/Queries/2D/Physics2DHitSorter.cs
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 78
Line coverage: 100%
Branch coverage
100%
Covered branches: 18
Total branches: 18
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%
ComesBefore(...)100%11100%
SiftDown(...)100%1010100%
Compare(...)100%22100%
Swap(...)100%11100%

File(s)

/home/runner/work/Gravitas/Gravitas/src/Gravitas/Queries/2D/Physics2DHitSorter.cs

#LineLine coverage
 1//=======================================================================
 2// Physics2DHitSorter.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 Physics2DHitSorter
 14{
 15    public static void SortByDistance(SwiftList<Physics2DHit> hits)
 16    {
 757517        SortByDistance(hits, 0, hits.Count);
 757518    }
 19
 20    public static void SortByDistance(SwiftList<Physics2DHit> hits, int start, int count)
 21    {
 757522        if (count < 2)
 618023            return;
 24
 2770825        for (int root = (count / 2) - 1; root >= 0; root--)
 1245926            SiftDown(hits, start, root, count);
 27
 5152828        for (int end = count - 1; end > 0; end--)
 29        {
 2436930            Swap(hits, start, start + end);
 2436931            SiftDown(hits, start, 0, end);
 32        }
 139533    }
 34
 17454135    public static bool ComesBefore(Physics2DHit left, Physics2DHit right) => Compare(left, right) < 0;
 36
 37    private static void SiftDown(SwiftList<Physics2DHit> hits, int start, int root, int count)
 38    {
 7714939        while (true)
 40        {
 11397741            int child = (root * 2) + 1;
 11397742            if (child >= count)
 3204443                return;
 44
 8193345            int swapIndex = root;
 8193346            if (ComesBefore(hits[start + swapIndex], hits[start + child]))
 7442547                swapIndex = child;
 48
 8193349            int right = child + 1;
 8193350            if (right < count && ComesBefore(hits[start + swapIndex], hits[start + right]))
 3583451                swapIndex = right;
 52
 8193353            if (swapIndex == root)
 478454                return;
 55
 7714956            Swap(hits, start + root, start + swapIndex);
 7714957            root = swapIndex;
 58        }
 59    }
 60
 61    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 62    private static int Compare(Physics2DHit left, Physics2DHit right)
 63    {
 17454164        int distance = left.Distance.CompareTo(right.Distance);
 17454165        if (distance != 0)
 16677966            return distance;
 67
 776268        return left.Collider.Id.CompareTo(right.Collider.Id);
 69    }
 70
 71    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 72    private static void Swap(SwiftList<Physics2DHit> hits, int left, int right)
 73    {
 10151874        Physics2DHit temp = hits[left];
 10151875        hits[left] = hits[right];
 10151876        hits[right] = temp;
 10151877    }
 78}