public void TestAddOne() { var db = new RestrictionsDb(1024); db.Add(1, 2, 3); var enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(1)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsFalse(enumerator.MoveNext()); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(2)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsFalse(enumerator.MoveNext()); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(3)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsFalse(enumerator.MoveNext()); }
/// <summary> /// Gets the get restriction function for the given profile. /// </summary> /// <param name="db">The router db.</param> /// <param name="profile">The vehicle profile.</param> /// <param name="first">When true, only restrictions starting with given vertex, when false only restrictions ending with given vertex already reversed, when null all restrictions are returned.</param> public static Func <uint, IEnumerable <uint[]> > GetGetRestrictions(this RouterDb db, Profiles.Profile profile, bool?first) { var vehicleTypes = new List <string>(profile.VehicleTypes); vehicleTypes.Insert(0, string.Empty); var restrictionDbs = new RestrictionsDb[vehicleTypes.Count]; for (var i = 0; i < vehicleTypes.Count; i++) { RestrictionsDb restrictionsDb; if (db.TryGetRestrictions(vehicleTypes[i], out restrictionsDb)) { restrictionDbs[i] = restrictionsDb; } } return((vertex) => { var restrictionList = new List <uint[]>(); for (var i = 0; i < restrictionDbs.Length; i++) { var restrictionsDb = restrictionDbs[i]; if (restrictionsDb == null) { continue; } var enumerator = restrictionsDb.GetEnumerator(); if (enumerator.MoveTo(vertex)) { while (enumerator.MoveNext()) { if (first.HasValue && first.Value) { if (enumerator[0] == vertex) { restrictionList.Add(enumerator.ToArray()); } } else if (first.HasValue && !first.Value) { if (enumerator[(int)enumerator.Count - 1] == vertex) { var array = enumerator.ToArray(); array.Reverse(); restrictionList.Add(array); } } else { restrictionList.Add(enumerator.ToArray()); } } } } return restrictionList; }); }
/// <summary> /// Setups default add-on processors. /// </summary> private void InitializeDefaultProcessors(bool processRestrictions) { // add all vehicle relation processors. foreach (var vehicle in _vehicleCache.Vehicles) { if (vehicle is Itinero.Profiles.DynamicVehicle) { var dynamicVehicle = vehicle as Itinero.Profiles.DynamicVehicle; this.Processors.Add(new DynamicVehicleRelationTagProcessor(dynamicVehicle)); this.Processors.Add(new DynamicVehicleNodeTagProcessor(_db, dynamicVehicle, (node) => { var index = _nodeIndex.TryGetIndex(node.Id.Value); if (index == long.MaxValue) { // node is not a vertex. return(Constants.NO_VERTEX); } return(this.AddCoreNode(node.Id.Value, node.Latitude.Value, node.Longitude.Value)); })); } } // add restriction processor if needed. if (processRestrictions) { this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) => { uint vertex; if (!_nodeIndex.TryGetCoreNode(node, out vertex)) { return(uint.MaxValue); } return(vertex); }, (node) => { var index = _nodeIndex.TryGetIndex(node.Id.Value); if (index == long.MaxValue) { // node is not a vertex. return(Constants.NO_VERTEX); } return(this.AddCoreNode(node.Id.Value, node.Latitude.Value, node.Longitude.Value)); }, (vehicleType, sequence) => { if (vehicleType == null) { vehicleType = string.Empty; } RestrictionsDb restrictions; if (!_db.TryGetRestrictions(vehicleType, out restrictions)) { restrictions = new RestrictionsDb(); _db.AddRestrictions(vehicleType, restrictions); } restrictions.Add(sequence.ToArray()); })); } }
public void TestAddRestrictionDb() { var routerDb = new RouterDb(); var restrictions = new RestrictionsDb(); routerDb.AddRestrictions("vehicle", restrictions); Assert.IsTrue(routerDb.TryGetRestrictions("vehicle", out restrictions)); }
public void TestAddMultipleSameStart() { var db = new RestrictionsDb(1024); db.Add(1, 2, 3); db.Add(1, 2, 3, 4); db.Add(1, 2, 3, 4, 5); var enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(1)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.AreEqual(4, enumerator[3]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(5, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.AreEqual(4, enumerator[3]); Assert.AreEqual(5, enumerator[4]); Assert.IsFalse(enumerator.MoveNext()); db.Switch(6, 1); Assert.IsTrue(enumerator.MoveTo(6)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(6, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(6, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.AreEqual(4, enumerator[3]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(5, enumerator.Count); Assert.AreEqual(6, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.AreEqual(4, enumerator[3]); Assert.AreEqual(5, enumerator[4]); Assert.IsFalse(enumerator.MoveNext()); }
private bool _firstPass = true; // flag for first/second pass. /// <summary> /// Setups default add-on processors. /// </summary> private void InitializeDefaultProcessors(bool processRestrictions) { // add all vehicle relation processors. foreach (var vehicle in _vehicleCache.Vehicles) { if (vehicle is Itinero.Profiles.DynamicVehicle) { this.Processors.Add(new DynamicVehicleRelationTagProcessor(vehicle as Itinero.Profiles.DynamicVehicle)); } } // add restriction processor if needed. if (processRestrictions) { this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) => { uint vertex; if (!_nodeIndex.TryGetCoreNode(node, out vertex)) { return(uint.MaxValue); } return(vertex); }, (vehicleType, sequence) => { if (vehicleType == null) { vehicleType = string.Empty; } RestrictionsDb restrictions; if (!_db.TryGetRestrictions(vehicleType, out restrictions)) { restrictions = new RestrictionsDb(); _db.AddRestrictions(vehicleType, restrictions); } restrictions.Add(sequence.ToArray()); })); } }
/// <summary> /// Setups default add-on processors. /// </summary> private void InitializeDefaultProcessors(bool processRestrictions) { // check for bicycle profile and add cycle network processor by default. if (_vehicles.FirstOrDefault(x => x.UniqueName == "Bicycle") != null && this.Processors.FirstOrDefault(x => x.GetType().Equals(typeof(CycleNetworkProcessor))) == null) { // bicycle profile present and processor not there yet, add it here. this.Processors.Add(new CycleNetworkProcessor()); } // add restriction processor if needed. if (processRestrictions) { this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) => { uint vertex; if (!_coreNodeIdMap.TryGetFirst(node, out vertex)) { return(uint.MaxValue); } return(vertex); }, (vehicleType, sequence) => { if (vehicleType == null) { vehicleType = string.Empty; } RestrictionsDb restrictions; if (!_db.TryGetRestrictions(vehicleType, out restrictions)) { restrictions = new RestrictionsDb(); _db.AddRestrictions(vehicleType, restrictions); } restrictions.Add(sequence.ToArray()); })); } }
/// <summary> /// Loads a test network from geojson. /// </summary> public static void LoadTestNetwork(this RouterDb db, string geoJson, float tolerance = 20) { var geoJsonReader = new NetTopologySuite.IO.GeoJsonReader(); var features = geoJsonReader.Read <FeatureCollection>(geoJson); foreach (var feature in features.Features) { if (feature.Geometry is Point) { var point = feature.Geometry as Point; uint id; if (feature.Attributes.Exists("id") && uint.TryParse(feature.Attributes["id"].ToInvariantString(), out id)) { // has and id, add as vertex. db.Network.AddVertex(id, (float)point.Coordinate.Y, (float)point.Coordinate.X); } } } foreach (var feature in features.Features) { if (feature.Geometry is LineString) { if (feature.Attributes.Contains("restriction", "yes")) { continue; } var line = feature.Geometry as LineString; var profile = new Itinero.Attributes.AttributeCollection(); var names = feature.Attributes.GetNames(); foreach (var name in names) { if (!name.StartsWith("meta:") && !name.StartsWith("stroke")) { profile.AddOrReplace(name, feature.Attributes[name].ToInvariantString()); } } var meta = new Itinero.Attributes.AttributeCollection(); foreach (var name in names) { if (name.StartsWith("meta:")) { meta.AddOrReplace(name.Remove(0, "meta:".Length), feature.Attributes[name].ToInvariantString()); } } var profileId = db.EdgeProfiles.Add(profile); var metaId = db.EdgeMeta.Add(meta); var vertex1 = db.SearchVertexFor( (float)line.Coordinates[0].Y, (float)line.Coordinates[0].X, tolerance); var distance = 0.0; var shape = new List <Coordinate>(); for (var i = 1; i < line.Coordinates.Length; i++) { var vertex2 = db.SearchVertexFor( (float)line.Coordinates[i].Y, (float)line.Coordinates[i].X, tolerance); distance += Coordinate.DistanceEstimateInMeter( (float)line.Coordinates[i - 1].Y, (float)line.Coordinates[i - 1].X, (float)line.Coordinates[i].Y, (float)line.Coordinates[i].X); if (vertex2 == Itinero.Constants.NO_VERTEX) { // add this point as shapepoint. shape.Add(line.Coordinates[i].FromCoordinate()); continue; } db.Network.AddEdge(vertex1, vertex2, new Itinero.Data.Network.Edges.EdgeData() { Distance = (float)distance, MetaId = metaId, Profile = (ushort)profileId }, shape); shape.Clear(); vertex1 = vertex2; distance = 0; } } } foreach (var feature in features.Features) { if (feature.Geometry is LineString && feature.Attributes.Contains("restriction", "yes")) { var line = feature.Geometry as LineString; var sequence = new List <uint>(); sequence.Add(db.SearchVertexFor( (float)line.Coordinates[0].Y, (float)line.Coordinates[0].X, tolerance)); for (var i = 1; i < line.Coordinates.Length; i++) { sequence.Add(db.SearchVertexFor( (float)line.Coordinates[i].Y, (float)line.Coordinates[i].X, tolerance)); } var vehicleType = string.Empty; if (!feature.Attributes.TryGetValueAsString("vehicle_type", out vehicleType)) { vehicleType = string.Empty; } RestrictionsDb restrictions; if (!db.TryGetRestrictions(vehicleType, out restrictions)) { restrictions = new RestrictionsDb(); db.AddRestrictions(vehicleType, restrictions); } restrictions.Add(sequence.ToArray()); } } }
public void TestNetwork12() { var routerDb = new RouterDb(); routerDb.LoadTestNetwork( Assembly.GetExecutingAssembly().GetManifestResourceStream( "Itinero.Test.test_data.networks.network12.geojson")); Assert.AreEqual(8, routerDb.Network.VertexCount); Assert.AreEqual(8, routerDb.Network.EdgeCount); var vertex0 = routerDb.Network.GetVertex(0); var vertex1 = routerDb.Network.GetVertex(1); var vertex2 = routerDb.Network.GetVertex(2); var vertex3 = routerDb.Network.GetVertex(3); var vertex4 = routerDb.Network.GetVertex(4); var vertex5 = routerDb.Network.GetVertex(5); var vertex6 = routerDb.Network.GetVertex(6); var vertex7 = routerDb.Network.GetVertex(7); var vertex8 = routerDb.Network.GetVertex(8); var vertex9 = routerDb.Network.GetVertex(9); var edge = routerDb.Network.GetEdgeEnumerator(0).First(x => x.To == 1); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex0, vertex1), edge.Data.Distance, 5); var profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); edge = routerDb.Network.GetEdgeEnumerator(1).First(x => x.To == 4); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex1, vertex4), edge.Data.Distance, 5); profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); edge = routerDb.Network.GetEdgeEnumerator(1).First(x => x.To == 2); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex1, vertex2), edge.Data.Distance, 5); profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); edge = routerDb.Network.GetEdgeEnumerator(2).First(x => x.To == 3); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex2, vertex3), edge.Data.Distance, 5); profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); edge = routerDb.Network.GetEdgeEnumerator(2).First(x => x.To == 5); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex2, vertex5), edge.Data.Distance, 5); profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); edge = routerDb.Network.GetEdgeEnumerator(4).First(x => x.To == 5); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex4, vertex5), edge.Data.Distance, 5); profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); edge = routerDb.Network.GetEdgeEnumerator(4).First(x => x.To == 6); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex4, vertex6), edge.Data.Distance, 5); profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); edge = routerDb.Network.GetEdgeEnumerator(5).First(x => x.To == 7); Assert.AreEqual(Coordinate.DistanceEstimateInMeter(vertex5, vertex7), edge.Data.Distance, 5); profile = routerDb.EdgeProfiles.Get(edge.Data.Profile); Assert.AreEqual(1, profile.Count); Assert.IsTrue(profile.Contains("highway", "residential")); RestrictionsDb restrictions = null; Assert.IsTrue(routerDb.TryGetRestrictions("motorcar", out restrictions)); var enumerator = restrictions.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(1)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(1, enumerator[0]); }
/// <summary> /// Deserializes a database from the given stream. /// </summary> public static RouterDb Deserialize(Stream stream, RouterDbProfile profile) { // deserialize all basic data. // version1: OsmSharp.Routing state of layout. // version2: Added ShortcutsDbs. // version3: Add advanced profile serialization. // version4: Added missing restriction dbs. var version = stream.ReadByte(); if (version != 1 && version != 2 && version != 3 && version != 4) { throw new Exception(string.Format("Cannot deserialize routing db: Invalid version #: {0}.", version)); } var guidBytes = new byte[16]; stream.Read(guidBytes, 0, 16); var guid = new Guid(guidBytes); var supportedVehicleInstances = new List <Vehicle>(); if (version <= 2) { // just contains vehicle names. var supportedVehicles = stream.ReadWithSizeStringArray(); foreach (var vehicleName in supportedVehicles) { Profile vehicleProfile; if (Profile.TryGet(vehicleName, out vehicleProfile)) { supportedVehicleInstances.Add(vehicleProfile.Parent); } else { Itinero.Logging.Logger.Log("RouterDb", Logging.TraceEventType.Warning, "Vehicle with name {0} was not found, register all vehicle profiles before deserializing the router db.", vehicleName); } } } else { // contains the full vehicles. var lengthBytes = new byte[4]; stream.Read(lengthBytes, 0, 4); var size = BitConverter.ToInt32(lengthBytes, 0); for (var i = 0; i < size; i++) { var vehicle = Vehicle.Deserialize(stream); supportedVehicleInstances.Add(vehicle); vehicle.Register(); } } var metaDb = stream.ReadWithSizeAttributesCollection(); var shorcutsCount = (int)0; if (version >= 2) { // when version < 1 there are no shortcuts and thus no shortcut count. shorcutsCount = stream.ReadByte(); } var contractedCount = stream.ReadByte(); var restrictionDbCount = 0; if (version >= 4) { restrictionDbCount = stream.ReadByte(); } var profiles = AttributesIndex.Deserialize(new LimitedStream(stream), true); var meta = AttributesIndex.Deserialize(new LimitedStream(stream), true); var network = RoutingNetwork.Deserialize(stream, profile == null ? null : profile.RoutingNetworkProfile); // create router db. var routerDb = new RouterDb(guid, network, profiles, meta, metaDb, supportedVehicleInstances.ToArray()); // read all shortcut dbs. for (var i = 0; i < shorcutsCount; i++) { var shortcutsName = stream.ReadWithSizeString(); var shorcutsDb = ShortcutsDb.Deserialize(stream); routerDb._shortcutsDbs[shortcutsName] = shorcutsDb; } // read all contracted versions. for (var i = 0; i < contractedCount; i++) { var profileName = stream.ReadWithSizeString(); var contracted = ContractedDb.Deserialize(stream, profile == null ? null : profile.ContractedDbProfile); routerDb._contracted[profileName] = contracted; } // read all restriction dbs. for (var i = 0; i < restrictionDbCount; i++) { var restrictionDbName = stream.ReadWithSizeString(); var restrictionDb = RestrictionsDb.Deserialize(stream, profile == null ? null : profile.RestrictionDbProfile); routerDb._restrictionDbs[restrictionDbName] = restrictionDb; } return(routerDb); }
/// <summary> /// Adds the restrictions for the given vehicle type. /// </summary> public void AddRestrictions(string vehicleType, RestrictionsDb restrictions) { _restrictionDbs[vehicleType] = restrictions; }
/// <summary> /// Returns true if this routing db has a restriction db for the given vehicle type. /// </summary> public bool TryGetRestrictions(string vehicleType, out RestrictionsDb restrictions) { return(_restrictionDbs.TryGetValue(vehicleType, out restrictions)); }
public void TestSerializeDeserializeNoCacheProfile() { var db = new RestrictionsDb(1024); db.Add(1, 2, 3); db.Add(10, 11, 12); db.Add(10, 111, 222); db.Add(12, 2, 3); var stream = new MemoryStream(); var size = db.Serialize(stream); Assert.AreEqual(stream.Position, size); stream.Seek(0, SeekOrigin.Begin); db = RestrictionsDb.Deserialize(stream, RestrictionsDbProfile.NoCache); var enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(12)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(11, enumerator[1]); Assert.AreEqual(12, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(12, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(3)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(12, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); db = new RestrictionsDb(1024); db.Add(1, 2, 3); db.Add(1, 2, 3, 4); stream.Dispose(); stream = new MemoryStream(); size = db.Serialize(stream); Assert.AreEqual(stream.Position, size); stream.Seek(0, SeekOrigin.Begin); db = RestrictionsDb.Deserialize(stream, RestrictionsDbProfile.NoCache); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(1)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.AreEqual(4, enumerator[3]); Assert.IsFalse(enumerator.MoveNext()); }
public void TestSwitch() { var db = new RestrictionsDb(1024); db.Add(2, 1, 3); db.Switch(2, 1); var enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(1)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsFalse(enumerator.MoveNext()); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(3)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(1, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsFalse(enumerator.MoveNext()); db = new RestrictionsDb(1024); db.Add(1, 2, 3); db.Add(1, 2, 3, 4); db.Switch(1, 10); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(10)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(2, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.AreEqual(4, enumerator[3]); db.Switch(2, 20); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(10)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.AreEqual(4, enumerator[3]); db.Switch(3, 30); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(10)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.AreEqual(4, enumerator[3]); db.Switch(4, 40); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(10)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.AreEqual(40, enumerator[3]); Assert.IsFalse(enumerator.MoveNext()); db = new RestrictionsDb(1024); db.Add(1, 2, 3); db.Add(3, 2, 1); db.Add(3, 2, 1, 4); db.Add(1, 2, 3, 4); db.Switch(1, 10); db.Switch(2, 20); db.Switch(3, 30); db.Switch(4, 40); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(10)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(30, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(10, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(30, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(10, enumerator[2]); Assert.AreEqual(40, enumerator[3]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.AreEqual(40, enumerator[3]); Assert.IsFalse(enumerator.MoveNext()); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(30)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(30, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(10, enumerator[2]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(30, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(10, enumerator[2]); Assert.AreEqual(40, enumerator[3]); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(4, enumerator.Count); Assert.AreEqual(10, enumerator[0]); Assert.AreEqual(20, enumerator[1]); Assert.AreEqual(30, enumerator[2]); Assert.AreEqual(40, enumerator[3]); Assert.IsFalse(enumerator.MoveNext()); db = new RestrictionsDb(1024); db.Add(2, 1, 3); db.Switch(4, 1); db.Switch(4, 8); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(2)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(2, enumerator[0]); Assert.AreEqual(8, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsFalse(enumerator.MoveNext()); enumerator = db.GetEnumerator(); Assert.IsTrue(enumerator.MoveTo(3)); Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual(3, enumerator.Count); Assert.AreEqual(2, enumerator[0]); Assert.AreEqual(8, enumerator[1]); Assert.AreEqual(3, enumerator[2]); Assert.IsFalse(enumerator.MoveNext()); }
/// <summary> /// Setups default add-on processors. /// </summary> private void InitializeDefaultProcessors(bool processRestrictions) { // add all vehicle relation processors. bool isDynamic = false; foreach (var vehicle in _vehicleCache.Vehicles) { if (!(vehicle is DynamicVehicle dynamicVehicle)) { continue; } isDynamic = true; this.Processors.Add(new DynamicVehicleRelationTagProcessor(dynamicVehicle)); this.Processors.Add(new DynamicVehicleNodeTagProcessor(_db, dynamicVehicle, MarkCore)); if (processRestrictions) { this.Processors.Add( new DynamicVehicleNodeRestrictionProcessor(_db, dynamicVehicle, MarkCore, FoundRestriction)); } } // add restriction processor if needed. if (processRestrictions) { // add node-based restriction processor if non of the profiles is dynamic. if (!isDynamic) { this.Processors.Add(new NodeRestrictionProcessor(MarkCore, FoundRestriction)); } this.Processors.Add(new RestrictionProcessor(_vehicleTypes, (node) => { if (!_nodeIndex.TryGetCoreNode(node, out var vertex)) { return(uint.MaxValue); } return(vertex); }, MarkCore, FoundRestriction)); } // a function to handle callbacks from processors handling restrictions. void FoundRestriction(string vehicleType, List <uint> sequence) { if (vehicleType == null) { vehicleType = string.Empty; } if (!_db.TryGetRestrictions(vehicleType, out var restrictions)) { restrictions = new RestrictionsDb(); _db.AddRestrictions(vehicleType, restrictions); } restrictions.Add(sequence.ToArray()); } // a function to handle callbacks from processor that want to mark nodes as core. uint MarkCore(Node node) { var index = _nodeIndex.TryGetIndex(node.Id.Value); if (index == long.MaxValue) { // node is not a vertex. return(Itinero.Constants.NO_VERTEX); } return(this.AddCoreNode(node.Id.Value, (float)node.Latitude.Value, (float)node.Longitude.Value)); } }
/// <summary> /// Creates a new restriction db meta-object. /// </summary> internal RestrictionsDbMeta(string vehicle, RestrictionsDb db) { this.Vehicle = vehicle; this.RestrictionsDb = db; }