From 7817d6dff113860a6d2425e725b600e58881dd89 Mon Sep 17 00:00:00 2001 From: slhh Date: Fri, 16 Dec 2016 15:43:29 +0100 Subject: [PATCH] Prevent duplicate consecutive nodes in addNode, updateNode, and replaceNode, and add some comments. --- modules/osm/way.js | 82 +++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/modules/osm/way.js b/modules/osm/way.js index 7f328894c..e6c7a4c67 100644 --- a/modules/osm/way.js +++ b/modules/osm/way.js @@ -187,34 +187,70 @@ _.extend(osmWay.prototype, { }); }, - + // Adds a node (id) in front of the node which is currently at position index. + // If index is negative, it will be counted from the end of the way. + // If index is 0 or < -length, the node (id) will be added at the start of the way. + // If index is undefined or >= length, the node (id) will be added at the end of the way. + // Generating consecutive duplicates is silently prevented + addNode: function(id, index) { - var nodes = this.nodes.slice(); - nodes.splice(index === undefined ? nodes.length : index, 0, id); - return this.update({nodes: nodes}); - }, - - - updateNode: function(id, index) { - var nodes = this.nodes.slice(); - nodes.splice(index, 1, id); - return this.update({nodes: nodes}); - }, - - - replaceNode: function(needle, replacement) { - if (this.nodes.indexOf(needle) < 0) - return this; - - var nodes = this.nodes.slice(); - for (var i = 0; i < nodes.length; i++) { - if (nodes[i] === needle) { - nodes[i] = replacement; - } + var nodes = this.nodes.slice(), + spliceIndex = index === undefined ? nodes.length : index; + if (spliceIndex > nodes.length) spliceIndex = nodes.length; + if (spliceIndex < 0) spliceIndex = nodes.length + index; + if (spliceIndex < 0) spliceIndex = 0; + if (nodes[spliceIndex] !== id&& nodes[spliceIndex-1] !== id) { + nodes.splice(spliceIndex, 0, id); } return this.update({nodes: nodes}); }, + // Replaces the node which is currently at position index with the given node (id). + // If index is negative, it will be counted from the end of the way. + + // Consecutive duplicates are eliminated including existing ones. + + updateNode: function(id, index) { + var nodes = []; + + if (index < 0) index = this.nodes.length + index; + + for (var i = 0; i < this.nodes.length; i++) { + var node = this.nodes[i]; + if (i === index) { + if (nodes[nodes.length - 1] !== id) + nodes.push(id); + } else { + if (nodes[nodes.length - 1] !== node) + nodes.push(node); + } + } + + return this.update({nodes: nodes}); + }, + + // Replaces each occurrence of node id needle with replacement. + // Consecutive duplicates are eliminated including existing ones. + + replaceNode: function(needle, replacement) { + var nodes = []; + + for (var i = 0; i < this.nodes.length; i++) { + var node = this.nodes[i]; + if (node === needle) { + if (nodes[nodes.length - 1] !== replacement) + nodes.push(replacement); + } else { + if (nodes[nodes.length - 1] !== node) + nodes.push(node); + } + } + + return this.update({nodes: nodes}); + }, + + // Removes each occurrence of node id needle with replacement. + // Consecutive duplicates are eliminated. Circularity is preserved. removeNode: function(id) { var nodes = [];