< Summary

Class:Itinero.Network.Restrictions.RestrictionExtensions
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/Network/Restrictions/RestrictionExtensions.cs
Covered lines:22
Uncovered lines:2
Coverable lines:24
Total lines:55
Line coverage:91.6% (22 of 24)
Covered branches:11
Total branches:12
Branch coverage:91.6% (11 of 12)
Tag:224_14471318300

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
Invert()91.66%1291.66%

File(s)

/home/runner/work/routing2/routing2/src/Itinero/Network/Restrictions/RestrictionExtensions.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using Itinero.Network.Enumerators.Edges;
 4
 5namespace Itinero.Network.Restrictions;
 6
 7/// <summary>
 8/// Contains extension methods to work with restricted sequences.
 9/// </summary>
 10public static class RestrictionExtensions
 11{
 12    /// <summary>
 13    /// Inverts the given restriction returning all possible sequences in the network starting with the same edges excep
 14    /// </summary>
 15    /// <param name="restrictedSequence">The restricted sequence.</param>
 16    /// <param name="mutableNetworkEdgeEnumerator">The enumerator to query edges.</param>
 17    /// <returns>All sequences starting with the same edges but ending with a different one.</returns>
 18    public static IEnumerable<IEnumerable<(EdgeId edge, bool forward)>> Invert<T>(
 19        this IEnumerable<(EdgeId edge, bool forward)> restrictedSequence,
 20        EdgeEnumerator<T> mutableNetworkEdgeEnumerator)
 21        where T : IEdgeEnumerable
 522    {
 523        var firstPart = new List<(EdgeId edge, bool forward)>(restrictedSequence);
 524        if (firstPart.Count < 2)
 025        {
 026            yield break; // no inverse possible.
 27        }
 28
 29        // get last.
 530        var last = firstPart[firstPart.Count - 1];
 31
 32        // enumerate all edges except the u-turn and the original sequence.
 533        var secondToLast = firstPart[firstPart.Count - 2];
 534        mutableNetworkEdgeEnumerator.MoveTo(secondToLast.edge, secondToLast.forward);
 535        mutableNetworkEdgeEnumerator.MoveTo(mutableNetworkEdgeEnumerator.Head);
 2036        while (mutableNetworkEdgeEnumerator.MoveNext())
 1537        {
 1538            var id = mutableNetworkEdgeEnumerator.EdgeId;
 1539            if (id == secondToLast.edge &&
 1540                mutableNetworkEdgeEnumerator.Forward != secondToLast.forward)
 541            {
 542                continue;
 43            }
 44
 1045            if (id == last.edge &&
 1046                mutableNetworkEdgeEnumerator.Forward == last.forward)
 547            {
 548                continue;
 49            }
 50
 551            yield return firstPart.Take(firstPart.Count - 1)
 552                .Append((Id: mutableNetworkEdgeEnumerator.EdgeId, mutableNetworkEdgeEnumerator.Forward));
 553        }
 554    }
 55}

Methods/Properties

Invert()