< Summary

Class:Itinero.Geo.RoutingNetworkEnumerator
Assembly:Itinero.Geo
File(s):/home/runner/work/routing2/routing2/src/Itinero.Geo/RoutingNetworkEnumerator.cs
Covered lines:57
Uncovered lines:12
Coverable lines:69
Total lines:118
Line coverage:82.6% (57 of 69)
Covered branches:13
Total branches:16
Branch coverage:81.2% (13 of 16)
Tag:224_14471318300

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%1100%
MoveNext()81.25%1688%
Reset()100%10%
get_Current()100%1100%
System.Collections.IEnumerator.get_Current()100%10%
Dispose()100%1100%

File(s)

/home/runner/work/routing2/routing2/src/Itinero.Geo/RoutingNetworkEnumerator.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using System.Linq;
 5using Itinero.Network;
 6using Itinero.Network.Enumerators.Edges;
 7using NetTopologySuite.Features;
 8using NetTopologySuite.Geometries;
 9
 10namespace Itinero.Geo;
 11
 12internal class RoutingNetworkEnumerator : IEnumerator<IFeature>
 13{
 14    private readonly RoutingNetwork _network;
 15
 16    private readonly Func<IEnumerable<(string key, string value)>, IEnumerable<(string key, string value)>>
 17        _preprocessEdge;
 18
 19    private readonly IEnumerator<VertexId> _vertexIds;
 20
 421    private readonly HashSet<EdgeId> _seenVertices = new();
 22
 23
 24    private readonly RoutingNetworkEdgeEnumerator _edges;
 25
 26    private bool _edgesAreInitiated;
 27
 428    public RoutingNetworkEnumerator(RoutingNetwork network,
 429        Func<IEnumerable<(string key, string value)>, IEnumerable<(string key, string value)>> preprocessEdge)
 430    {
 431        _network = network;
 432        _preprocessEdge = preprocessEdge;
 433        _vertexIds = network.GetVertices().GetEnumerator();
 434        _edges = network.GetEdgeEnumerator();
 435    }
 36
 37    public bool MoveNext()
 2238    {
 2239        if (!_edgesAreInitiated)
 1140        {
 1141            var hasNext = _vertexIds.MoveNext();
 1142            if (!hasNext)
 443            {
 444                return false;
 45            }
 46
 747            _edges.MoveTo(_vertexIds.Current);
 748            _edgesAreInitiated = true;
 749            var attrs = new AttributesTable {
 750                    {"_vertex_id", "" + _vertexIds.Current}
 751                };
 752            _network.TryGetVertex(_vertexIds.Current, out var lon, out var lat, out var el);
 753            this.Current = new Feature(
 754                new Point(lon, lat, el ?? 0f), attrs);
 55
 756            return true;
 57        }
 58
 1159        var hasNextEdge = false;
 60        do
 1561        {
 1562            hasNextEdge = _edges.MoveNext();
 3063        } while (_seenVertices.Contains(_edges.EdgeId) && hasNextEdge);
 64
 1165        if (!hasNextEdge)
 766        {
 767            _edgesAreInitiated = false;
 768            return this.MoveNext();
 69        }
 470        _seenVertices.Add(_edges.EdgeId);
 71
 72
 473        var attrTable = new AttributesTable();
 474        var rawAttr = _edges.Attributes;
 475        if (_preprocessEdge != null)
 076        {
 077            rawAttr = _preprocessEdge.Invoke(rawAttr);
 078        }
 79
 1280        foreach (var kv in rawAttr)
 081        {
 082            attrTable.Add(kv.key, kv.value);
 083        }
 84
 485        var shape = _edges.Shape.ToList();
 486        var coors = new Coordinate[shape.Count + 2];
 487        var (frLon, frLat, _) = _edges.TailLocation;
 488        coors[0] = new Coordinate(frLon, frLat);
 489        var (toLon, toLat, _) = _edges.HeadLocation;
 490        coors[^1] = new Coordinate(toLon, toLat);
 1491        for (var i = 0; i < shape.Count(); i++)
 392        {
 393            var shp = shape[i];
 394            coors[i + 1] = new Coordinate(shp.longitude, shp.latitude);
 395        }
 96
 497        this.Current = new Feature(
 498            new LineString(coors), attrTable);
 99
 4100        return true;
 22101    }
 102
 103    public void Reset()
 0104    {
 0105        _edges.Reset();
 0106        _vertexIds.Reset();
 0107        _seenVertices.Clear();
 0108    }
 109
 22110    public IFeature Current { get; private set; }
 111
 0112    object IEnumerator.Current => this.Current;
 113
 114    public void Dispose()
 4115    {
 4116        _vertexIds.Dispose();
 4117    }
 118}