< Summary

Information
Class: Trailblazer.Pathing.NavigationGuideLease
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/AStar/NavigationGuideLease.cs
Line coverage
100%
Covered lines: 25
Uncovered lines: 0
Coverable lines: 25
Total lines: 149
Line coverage: 100%
Branch coverage
100%
Covered branches: 16
Total branches: 16
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Status()100%22100%
get_CurrentStepIndex()100%22100%
get_StepCount()100%22100%
get_TotalCost()100%22100%
TryGetCurrentStep(...)100%22100%
TryAdvanceStep()100%22100%
CompletePendingTransition(...)100%22100%
Dispose()100%22100%

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/AStar/NavigationGuideLease.cs

#LineLine coverage
 1//=======================================================================
 2// NavigationGuideLease.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using System;
 9using FixedMathSharp;
 10
 11namespace Trailblazer.Pathing;
 12
 13/// <summary>Owns one graph-backed A* payload reference and its guide-local step cursor.</summary>
 14public readonly struct NavigationGuideLease : IDisposable
 15{
 16    private readonly NavigationAStarGuideLease? _inner;
 17    private readonly long _generation;
 18
 19    internal NavigationGuideLease(NavigationAStarGuideLease inner)
 20    {
 62721        _inner = inner;
 62722        _generation = inner.Generation;
 62723    }
 24
 25    /// <summary>Gets the lease's current dependency-validated status.</summary>
 5726    public NavigationGuideStatus Status => NavigationGuideStatusMapper.ToPublic(
 5727        _inner?.GetStatus(_generation) ?? NavigationAStarQueryStatus.Stale);
 28
 29    /// <summary>Gets the zero-based guide-local step cursor.</summary>
 9030    public int CurrentStepIndex => _inner?.GetCurrentWaypointOrdinal(_generation) ?? -1;
 31
 32    /// <summary>Gets the immutable number of movement and action steps in the leased route.</summary>
 26033    public int StepCount => _inner?.GetWaypointCount(_generation) ?? 0;
 34
 35    /// <summary>Gets the immutable exact fixed-point cost of the complete route.</summary>
 3836    public Fixed64 TotalCost => _inner?.GetTotalCost(_generation) ?? Fixed64.Zero;
 37
 38    /// <summary>Gets the current dependency-validated movement or action step.</summary>
 39    public NavigationGuideStatus TryGetCurrentStep(out NavigationGuideStep step)
 40    {
 53641        NavigationAStarGuideLease? inner = _inner;
 53642        if (inner == null)
 43        {
 144            step = default;
 145            return NavigationGuideStatus.Stale;
 46        }
 47
 53548        return NavigationGuideStatusMapper.ToPublic(
 53549            inner.TryGetCurrentStep(
 53550                _generation,
 53551                out step));
 52    }
 53
 54    /// <summary>Advances one ordinary movement step; a pending action cannot be crossed.</summary>
 55    public NavigationGuideStatus TryAdvanceStep()
 56    {
 27457        return _inner == null
 27458            ? NavigationGuideStatus.Stale
 27459            : NavigationGuideStatusMapper.ToPublic(
 27460                _inner.TryAdvanceWaypoint(_generation));
 61    }
 62
 63    /// <summary>Completes the exact current pending semantic action.</summary>
 64    public NavigationGuideStatus CompletePendingTransition(
 65        in NavigationTransitionInstruction instruction) =>
 3366        _inner == null
 3367            ? NavigationGuideStatus.Stale
 3368            : NavigationGuideStatusMapper.ToPublic(
 3369                _inner.CompletePendingTransition(_generation, instruction));
 70
 71    /// <inheritdoc />
 61072    public void Dispose() => _inner?.Dispose(_generation);
 73}
 74
 75internal static class NavigationGuideStatusMapper
 76{
 77    internal static NavigationGuideStatus ToPublic(NavigationAStarQueryStatus status) => status switch
 78    {
 79        NavigationAStarQueryStatus.Success => NavigationGuideStatus.Success,
 80        NavigationAStarQueryStatus.Unsupported => NavigationGuideStatus.Unsupported,
 81        NavigationAStarQueryStatus.NoMap => NavigationGuideStatus.NoMap,
 82        NavigationAStarQueryStatus.InvalidProfile => NavigationGuideStatus.InvalidProfile,
 83        NavigationAStarQueryStatus.InvalidStart => NavigationGuideStatus.InvalidStart,
 84        NavigationAStarQueryStatus.InvalidEnd => NavigationGuideStatus.InvalidEnd,
 85        NavigationAStarQueryStatus.NoPath => NavigationGuideStatus.NoPath,
 86        NavigationAStarQueryStatus.BudgetExceeded => NavigationGuideStatus.BudgetExceeded,
 87        NavigationAStarQueryStatus.CostOverflow => NavigationGuideStatus.CostOverflow,
 88        NavigationAStarQueryStatus.CapacityExceeded => NavigationGuideStatus.CapacityExceeded,
 89        NavigationAStarQueryStatus.Stale => NavigationGuideStatus.Stale,
 90        _ => NavigationGuideStatus.Stale
 91    };
 92
 93    internal static NavigationGuideStatus ToPublic(NavigationFlowQueryStatus status) => status switch
 94    {
 95        NavigationFlowQueryStatus.Success => NavigationGuideStatus.Success,
 96        NavigationFlowQueryStatus.Unsupported => NavigationGuideStatus.Unsupported,
 97        NavigationFlowQueryStatus.NoMap => NavigationGuideStatus.NoMap,
 98        NavigationFlowQueryStatus.InvalidProfile => NavigationGuideStatus.InvalidProfile,
 99        NavigationFlowQueryStatus.InvalidStart => NavigationGuideStatus.InvalidStart,
 100        NavigationFlowQueryStatus.InvalidEnd => NavigationGuideStatus.InvalidEnd,
 101        NavigationFlowQueryStatus.NoPath => NavigationGuideStatus.NoPath,
 102        NavigationFlowQueryStatus.BudgetExceeded => NavigationGuideStatus.BudgetExceeded,
 103        NavigationFlowQueryStatus.CostOverflow => NavigationGuideStatus.CostOverflow,
 104        NavigationFlowQueryStatus.CapacityExceeded => NavigationGuideStatus.CapacityExceeded,
 105        NavigationFlowQueryStatus.Stale => NavigationGuideStatus.Stale,
 106        _ => NavigationGuideStatus.Stale
 107    };
 108
 109    internal static NavigationGuideStatus ToPublic(NavigationRayStatus status)
 110    {
 111        System.Diagnostics.Debug.Assert(status is
 112            NavigationRayStatus.Blocked or
 113            NavigationRayStatus.BudgetExceeded or
 114            NavigationRayStatus.CostOverflow or
 115            NavigationRayStatus.CapacityExceeded or
 116            NavigationRayStatus.Stale,
 117            "Ray recovery maps only terminal statuses not handled by its caller.");
 118        return status switch
 119        {
 120            NavigationRayStatus.Blocked => NavigationGuideStatus.LocalRecoveryRequired,
 121            NavigationRayStatus.BudgetExceeded => NavigationGuideStatus.BudgetExceeded,
 122            NavigationRayStatus.CostOverflow => NavigationGuideStatus.CostOverflow,
 123            NavigationRayStatus.CapacityExceeded => NavigationGuideStatus.CapacityExceeded,
 124            _ => NavigationGuideStatus.Stale
 125        };
 126    }
 127
 128    internal static NavigationFlowFieldStatus ToFlowField(
 129        NavigationTraversalEdgeAdvanceStatus status)
 130    {
 131        System.Diagnostics.Debug.Assert(status is
 132            NavigationTraversalEdgeAdvanceStatus.Complete or
 133            NavigationTraversalEdgeAdvanceStatus.BudgetExceeded or
 134            NavigationTraversalEdgeAdvanceStatus.CostOverflow or
 135            NavigationTraversalEdgeAdvanceStatus.CapacityExceeded or
 136            NavigationTraversalEdgeAdvanceStatus.Stale,
 137            "Flow traversal maps only terminal statuses not handled by its caller.");
 138        return status switch
 139        {
 140            NavigationTraversalEdgeAdvanceStatus.BudgetExceeded =>
 141                NavigationFlowFieldStatus.BudgetExceeded,
 142            NavigationTraversalEdgeAdvanceStatus.CostOverflow =>
 143                NavigationFlowFieldStatus.CostOverflow,
 144            NavigationTraversalEdgeAdvanceStatus.CapacityExceeded =>
 145                NavigationFlowFieldStatus.CapacityExceeded,
 146            _ => NavigationFlowFieldStatus.Stale
 147        };
 148    }
 149}