diff --git a/src/ol/structs/rbush.js b/src/ol/structs/rbush.js index 7e8ff0ff50..096c4e92e5 100644 --- a/src/ol/structs/rbush.js +++ b/src/ol/structs/rbush.js @@ -620,8 +620,9 @@ ol.structs.RBush.prototype.remove_ = function(extent, value) { var path = [node]; /** @type {Array.} */ var indexes = [0]; - var child, children, i, ii; + var childrenDone, child, children, i, ii; while (path.length > 0) { + childrenDone = false; goog.asserts.assert(node.height > 0); if (node.height == 1) { children = node.children; @@ -633,8 +634,7 @@ ol.structs.RBush.prototype.remove_ = function(extent, value) { return; } } - node = path.pop(); - index = indexes.pop(); + childrenDone = true; } else if (index < node.children.length) { child = node.children[index]; if (ol.extent.containsExtent(child.extent, extent)) { @@ -646,8 +646,16 @@ ol.structs.RBush.prototype.remove_ = function(extent, value) { ++index; } } else { - node = path.pop(); - index = indexes.pop(); + childrenDone = true; + } + if (childrenDone) { + var lastPathIndex = path.length - 1; + node = path[lastPathIndex]; + index = ++indexes[lastPathIndex]; + if (index > node.children.length) { + path.pop(); + indexes.pop(); + } } } }; diff --git a/test/spec/ol/structs/rbush.test.js b/test/spec/ol/structs/rbush.test.js index 250aa374b5..044811e6eb 100644 --- a/test/spec/ol/structs/rbush.test.js +++ b/test/spec/ol/structs/rbush.test.js @@ -32,13 +32,18 @@ describe('ol.structs.RBush', function() { var objs; beforeEach(function() { - objs = [{}, {}, {}, {}, {}, {}]; + objs = [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]; rBush.insert([0, 0, 1, 1], objs[0]); rBush.insert([1, 1, 4, 4], objs[1]); rBush.insert([2, 2, 3, 3], objs[2]); rBush.insert([-5, -5, -4, -4], objs[3]); rBush.insert([-4, -4, -1, -1], objs[4]); rBush.insert([-3, -3, -2, -2], objs[5]); + rBush.insert([-3, -3, -2, -2], objs[6]); + rBush.insert([-3, -3, -2, -2], objs[7]); + rBush.insert([-3, -3, -2, -2], objs[8]); + rBush.insert([-3, -3, -2, -2], objs[9]); + rBush.insert([-3, -3, -2, -2], objs[10]); }); describe('#getAllInExtent', function() { @@ -294,6 +299,20 @@ describe('ol.structs.RBush', function() { }); + describe('#remove', function() { + + it('can remove all 2000 objects', function() { + var objs = rBush.getAll(); + var i, value; + for (i = objs.length - 1; i >= 0; --i) { + value = objs[i]; + rBush.remove(value); + } + expect(rBush.isEmpty()).to.be(true); + }); + + }); + }); });