< Summary

Information
Class: GridForge.Grids.Topology.GridBoundaryContactCursor
Assembly: GridForge
File(s): /home/runner/work/GridForge/GridForge/src/GridForge/Grids/Topology/GridBoundaryContactCursor.cs
Line coverage
100%
Covered lines: 84
Uncovered lines: 0
Coverable lines: 84
Total lines: 203
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Status()100%11100%
get_RunStamp()100%22100%
Begin(...)100%11100%
BeginFiltered(...)100%11100%
MarkStale()100%11100%
ClearPairProgress()100%11100%
ClearParticipantBinding()100%11100%
ClearFilterBinding()100%11100%

File(s)

/home/runner/work/GridForge/GridForge/src/GridForge/Grids/Topology/GridBoundaryContactCursor.cs

#LineLine coverage
 1//=======================================================================
 2// GridBoundaryContactCursor.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 GridForge.Configuration;
 9using GridForge.Spatial;
 10
 11namespace GridForge.Grids.Topology;
 12
 13/// <summary>
 14/// Describes the state of a resumable exact boundary-contact query.
 15/// </summary>
 16public enum GridBoundaryContactCursorStatus : byte
 17{
 18    /// <summary>The bound world or grid generation changed and all prior output must be discarded.</summary>
 19    Stale = 0,
 20
 21    /// <summary>More bounded candidate work is required.</summary>
 22    More = 1,
 23
 24    /// <summary>All bound spatial pairs and topology addresses were examined.</summary>
 25    Complete = 2
 26}
 27
 28/// <summary>
 29/// Stores caller-owned scalar progress for a bounded exact boundary-contact query.
 30/// </summary>
 31/// <remarks>
 32/// Create and reuse one instance, begin it through <see cref="GridWorld.BeginBoundaryContacts"/>,
 33/// and advance it through a <c>GridWorld.AdvanceBoundaryContacts(...)</c> overload. The cursor retains no
 34/// live grid or voxel reference. If it becomes <see cref="GridBoundaryContactCursorStatus.Stale"/>,
 35/// discard every contact returned since the last begin and restart the cursor.
 36/// </remarks>
 37public sealed class GridBoundaryContactCursor
 38{
 39    internal enum TraversalStage : byte
 40    {
 41        Pair,
 42        Source,
 43        Target
 44    }
 45
 46    internal long WorldSpawnToken;
 47    internal uint WorldVersion;
 48    internal ulong WorldChangeSequence;
 49    internal int PairSourceSummaryWordIndex;
 50    internal ulong PairSourceSummaryWord;
 51    internal int PairSourceWordIndex;
 52    internal ulong PairSourceWord;
 53    internal ushort PairSourceGridIndex;
 54    internal int PairTargetOrdinal;
 55    internal ushort SourceGridIndex;
 56    internal ushort TargetGridIndex;
 57    internal long SourceGridSpawnToken;
 58    internal long TargetGridSpawnToken;
 59    internal ulong SourceGridLastChangeSequence;
 60    internal ulong TargetGridLastChangeSequence;
 61    internal GridConfigurationKey SourceConfigurationKey;
 62    internal GridConfigurationKey TargetConfigurationKey;
 63    internal GridCellPrism SourcePrism;
 64    internal VoxelIndex SourceMinimum;
 65    internal VoxelIndex SourceMaximum;
 66    internal VoxelIndex SourceAddress;
 67    internal VoxelIndex TargetMinimum;
 68    internal VoxelIndex TargetMaximum;
 69    internal VoxelIndex TargetAddress;
 70    internal VoxelContactManifold PendingContact;
 71    internal ushort FilterGridIndex;
 72    internal long FilterGridSpawnToken;
 73    internal ulong FilterGridLastChangeSequence;
 74    internal int FilteredPairPhase;
 75    internal int FilteredPairRowCount;
 76    internal int FilteredPairRowOrdinal;
 77    internal ushort PendingFilteredGridIndex;
 78    internal bool HasPairSource;
 79    internal bool HasSourceRange;
 80    internal bool HasPendingContact;
 81    internal bool IsFiltered;
 82    internal bool HasFilteredPairRow;
 83    internal bool HasPendingFilteredPair;
 84    internal TraversalStage Stage;
 85    internal GridBoundaryContactCursorStatus CurrentStatus;
 86
 87    /// <summary>The current query state.</summary>
 288    public GridBoundaryContactCursorStatus Status => CurrentStatus;
 89
 90    /// <summary>The cumulative number of canonical pair, source-address, and target probes.</summary>
 91    public ulong CandidateOrdinal { get; internal set; }
 92
 93    /// <summary>The exact committed world revision bound by this cursor.</summary>
 94    public GridBoundaryContactRunStamp RunStamp =>
 2295        CurrentStatus == GridBoundaryContactCursorStatus.Stale
 2296            ? default
 2297            : new GridBoundaryContactRunStamp(
 2298                WorldSpawnToken,
 2299                WorldVersion,
 22100                WorldChangeSequence);
 101
 102    internal void Begin(long worldSpawnToken, uint worldVersion, ulong worldChangeSequence)
 103    {
 39104        WorldSpawnToken = worldSpawnToken;
 39105        WorldVersion = worldVersion;
 39106        WorldChangeSequence = worldChangeSequence;
 39107        PairSourceSummaryWordIndex = 0;
 39108        PairSourceSummaryWord = 0;
 39109        PairSourceWordIndex = 0;
 39110        PairSourceWord = 0;
 39111        PairTargetOrdinal = 0;
 39112        CandidateOrdinal = 0;
 39113        HasPairSource = false;
 39114        HasSourceRange = false;
 39115        HasPendingContact = false;
 39116        Stage = TraversalStage.Pair;
 39117        CurrentStatus = GridBoundaryContactCursorStatus.More;
 39118        ClearFilterBinding();
 39119        ClearParticipantBinding();
 39120    }
 121
 122    internal void BeginFiltered(
 123        long worldSpawnToken,
 124        uint worldVersion,
 125        ulong worldChangeSequence,
 126        ushort gridIndex,
 127        long gridSpawnToken,
 128        ulong gridLastChangeSequence)
 129    {
 13130        Begin(worldSpawnToken, worldVersion, worldChangeSequence);
 13131        FilterGridIndex = gridIndex;
 13132        FilterGridSpawnToken = gridSpawnToken;
 13133        FilterGridLastChangeSequence = gridLastChangeSequence;
 13134        IsFiltered = true;
 13135    }
 136
 137    internal GridBoundaryContactCursorStatus MarkStale()
 138    {
 11139        WorldSpawnToken = 0;
 11140        WorldVersion = 0;
 11141        WorldChangeSequence = 0;
 11142        PairSourceSummaryWordIndex = 0;
 11143        PairSourceSummaryWord = 0;
 11144        PairSourceWordIndex = 0;
 11145        PairSourceWord = 0;
 11146        PairTargetOrdinal = 0;
 11147        CandidateOrdinal = 0;
 11148        HasPairSource = false;
 11149        HasSourceRange = false;
 11150        HasPendingContact = false;
 11151        Stage = TraversalStage.Pair;
 11152        CurrentStatus = GridBoundaryContactCursorStatus.Stale;
 11153        ClearFilterBinding();
 11154        ClearParticipantBinding();
 11155        return CurrentStatus;
 156    }
 157
 158    internal void ClearPairProgress()
 159    {
 22160        HasSourceRange = false;
 22161        HasPendingContact = false;
 22162        Stage = TraversalStage.Pair;
 22163        SourcePrism = default;
 22164        TargetMinimum = default;
 22165        TargetMaximum = default;
 22166        TargetAddress = default;
 22167        PendingContact = default;
 22168    }
 169
 170    private void ClearParticipantBinding()
 171    {
 50172        SourceGridIndex = 0;
 50173        TargetGridIndex = 0;
 50174        SourceGridSpawnToken = 0;
 50175        TargetGridSpawnToken = 0;
 50176        SourceGridLastChangeSequence = 0;
 50177        TargetGridLastChangeSequence = 0;
 50178        SourceConfigurationKey = default;
 50179        TargetConfigurationKey = default;
 50180        SourcePrism = default;
 50181        SourceMinimum = default;
 50182        SourceMaximum = default;
 50183        SourceAddress = default;
 50184        TargetMinimum = default;
 50185        TargetMaximum = default;
 50186        TargetAddress = default;
 50187        PendingContact = default;
 50188    }
 189
 190    private void ClearFilterBinding()
 191    {
 50192        FilterGridIndex = 0;
 50193        FilterGridSpawnToken = 0;
 50194        FilterGridLastChangeSequence = 0;
 50195        FilteredPairPhase = 0;
 50196        FilteredPairRowCount = 0;
 50197        FilteredPairRowOrdinal = 0;
 50198        PendingFilteredGridIndex = 0;
 50199        IsFiltered = false;
 50200        HasFilteredPairRow = false;
 50201        HasPendingFilteredPair = false;
 50202    }
 203}