diff --git a/src/ol/structs/integerset.js b/src/ol/structs/integerset.js index a83850b1ff..17967c57bc 100644 --- a/src/ol/structs/integerset.js +++ b/src/ol/structs/integerset.js @@ -213,6 +213,31 @@ ol.structs.IntegerSet.prototype.getSize = function() { }; +/** + * @param {number} start Start. + * @param {number} stop Stop. + * @return {boolean} Intersects range. + */ +ol.structs.IntegerSet.prototype.intersectsRange = function(start, stop) { + goog.asserts.assert(start <= stop); + if (start == stop) { + return false; + } else { + var arr = this.arr_; + var n = arr.length; + var i = 0; + for (i = 0; i < n; i += 2) { + if (arr[i] <= start && start < arr[i + 1] || + arr[i] < stop && stop - 1 < arr[i + 1] || + start < arr[i] && arr[i + 1] <= stop) { + return true; + } + } + return false; + } +}; + + /** * @return {boolean} Is empty. */ diff --git a/test/spec/ol/structs/integerset.test.js b/test/spec/ol/structs/integerset.test.js index e63c3720be..48a8328dc7 100644 --- a/test/spec/ol/structs/integerset.test.js +++ b/test/spec/ol/structs/integerset.test.js @@ -108,6 +108,14 @@ describe('ol.structs.IntegerSet', function() { }); + describe('intersectsRange', function() { + + it('returns false', function() { + expect(is.intersectsRange(0, 0)).to.be(false); + }); + + }); + describe('isEmpty', function() { it('returns true', function() { @@ -277,6 +285,43 @@ describe('ol.structs.IntegerSet', function() { }); + describe('intersectsRange', function() { + + it('returns the expected value for small ranges', function() { + expect(is.intersectsRange(1, 3)).to.be(false); + expect(is.intersectsRange(2, 4)).to.be(false); + expect(is.intersectsRange(3, 5)).to.be(true); + expect(is.intersectsRange(4, 6)).to.be(true); + expect(is.intersectsRange(5, 7)).to.be(true); + expect(is.intersectsRange(6, 8)).to.be(false); + expect(is.intersectsRange(7, 9)).to.be(true); + expect(is.intersectsRange(8, 10)).to.be(true); + expect(is.intersectsRange(9, 11)).to.be(true); + expect(is.intersectsRange(10, 12)).to.be(false); + expect(is.intersectsRange(11, 13)).to.be(true); + expect(is.intersectsRange(12, 14)).to.be(true); + expect(is.intersectsRange(13, 15)).to.be(true); + expect(is.intersectsRange(14, 16)).to.be(false); + expect(is.intersectsRange(15, 17)).to.be(false); + }); + + it('returns the expected value for large ranges', function() { + expect(is.intersectsRange(-3, 1)).to.be(false); + expect(is.intersectsRange(1, 5)).to.be(true); + expect(is.intersectsRange(1, 9)).to.be(true); + expect(is.intersectsRange(1, 13)).to.be(true); + expect(is.intersectsRange(1, 17)).to.be(true); + expect(is.intersectsRange(5, 9)).to.be(true); + expect(is.intersectsRange(5, 13)).to.be(true); + expect(is.intersectsRange(5, 17)).to.be(true); + expect(is.intersectsRange(9, 13)).to.be(true); + expect(is.intersectsRange(9, 17)).to.be(true); + expect(is.intersectsRange(13, 17)).to.be(true); + expect(is.intersectsRange(17, 21)).to.be(false); + }); + + }); + describe('isEmpty', function() { it('returns false', function() {