diff --git a/src/ol/structs/buffer.js b/src/ol/structs/buffer.js index b0b188a9f0..0281835e8b 100644 --- a/src/ol/structs/buffer.js +++ b/src/ol/structs/buffer.js @@ -1,5 +1,6 @@ goog.provide('ol.structs.Buffer'); +goog.require('goog.array'); goog.require('ol.structs.IntegerSet'); @@ -14,9 +15,8 @@ ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS = goog.DEBUG; * @constructor * @param {Array.=} opt_arr Array. * @param {number=} opt_used Used. - * @param {boolean=} opt_dirty Dirty. */ -ol.structs.Buffer = function(opt_arr, opt_used, opt_dirty) { +ol.structs.Buffer = function(opt_arr, opt_used) { /** * @private @@ -26,9 +26,9 @@ ol.structs.Buffer = function(opt_arr, opt_used, opt_dirty) { /** * @private - * @type {ol.structs.IntegerSet} + * @type {Array.} */ - this.dirtySet_ = new ol.structs.IntegerSet(); + this.dirtySets_ = []; /** * @private @@ -40,9 +40,6 @@ ol.structs.Buffer = function(opt_arr, opt_used, opt_dirty) { if (used < this.arr_.length) { this.freeSet_.addRange(used, this.arr_.length); } - if (opt_dirty && used !== 0) { - this.dirtySet_.addRange(0, used); - } if (ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS) { var arr = this.arr_; var n = arr.length; @@ -69,11 +66,22 @@ ol.structs.Buffer.prototype.add = function(values) { for (i = 0; i < size; ++i) { this.arr_[offset + i] = values[i]; } - this.dirtySet_.addRange(offset, offset + size); + for (i = 0; i < this.dirtySets_.length; ++i) { + this.dirtySets_[i].addRange(offset, offset + size); + } return offset; }; +/** + * @param {ol.structs.IntegerSet} dirtySet Dirty set. + */ +ol.structs.Buffer.prototype.addDirtySet = function(dirtySet) { + goog.asserts.assert(!goog.array.contains(this.dirtySets_, dirtySet)); + this.dirtySets_.push(dirtySet); +}; + + /** * @param {function(this: T, number, number)} f Callback. * @param {T=} opt_obj The object to be used as the value of 'this' within f. @@ -102,14 +110,6 @@ ol.structs.Buffer.prototype.getCount = function() { }; -/** - * @return {ol.structs.IntegerSet} Dirty set. - */ -ol.structs.Buffer.prototype.getDirtySet = function() { - return this.dirtySet_; -}; - - /** * @return {ol.structs.IntegerSet} Free set. */ @@ -123,11 +123,13 @@ ol.structs.Buffer.prototype.getFreeSet = function() { * @param {number} offset Offset. */ ol.structs.Buffer.prototype.remove = function(size, offset) { + var i; this.freeSet_.addRange(offset, offset + size); - this.dirtySet_.removeRange(offset, offset + size); + for (i = 0; i < this.dirtySets_.length; ++i) { + this.dirtySets_[i].removeRange(offset, offset + size); + } if (ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS) { var arr = this.arr_; - var i; for (i = 0; i < size; ++i) { arr[offset + i] = NaN; } @@ -135,6 +137,15 @@ ol.structs.Buffer.prototype.remove = function(size, offset) { }; +/** + * @param {ol.structs.IntegerSet} dirtySet Dirty set. + */ +ol.structs.Buffer.prototype.removeDirtySet = function(dirtySet) { + var removed = goog.array.remove(this.dirtySets_, dirtySet); + goog.asserts.assert(removed); +}; + + /** * @param {Array.} values Values. * @param {number} offset Offset. @@ -147,13 +158,7 @@ ol.structs.Buffer.prototype.set = function(values, offset) { for (i = 0; i < n; ++i) { arr[offset + i] = values[i]; } - this.dirtySet_.addRange(offset, offset + n); -}; - - -/** - * Marks the buffer as being clean. - */ -ol.structs.Buffer.prototype.setClean = function() { - this.dirtySet_.clear(); + for (i = 0; i < this.dirtySets_.length; ++i) { + this.dirtySets_[i].addRange(offset, offset + n); + } }; diff --git a/test/spec/ol/structs/buffer.test.js b/test/spec/ol/structs/buffer.test.js index ad0ce6cee6..1b6b019038 100644 --- a/test/spec/ol/structs/buffer.test.js +++ b/test/spec/ol/structs/buffer.test.js @@ -67,14 +67,6 @@ describe('ol.structs.Buffer', function() { }); - describe('getDirtySet', function() { - - it('returns an empty set', function() { - expect(b.getDirtySet().isEmpty()).to.be(true); - }); - - }); - }); describe('with an empty instance with spare capacity', function() { @@ -149,14 +141,6 @@ describe('ol.structs.Buffer', function() { }); - describe('getDirtySet', function() { - - it('returns an empty set', function() { - expect(b.getDirtySet().isEmpty()).to.be(true); - }); - - }); - describe('remove', function() { it('allows items to be removes', function() { @@ -175,8 +159,10 @@ describe('ol.structs.Buffer', function() { }); it('marks the set items as dirty', function() { + var dirtySet = new ol.structs.IntegerSet(); + b.addDirtySet(dirtySet); + expect(dirtySet.isEmpty()).to.be(true); b.set([5, 6], 2); - var dirtySet = b.getDirtySet(); expect(dirtySet.isEmpty()).to.be(false); expect(dirtySet.getArray()).to.equalArray([2, 4]); }); @@ -222,14 +208,6 @@ describe('ol.structs.Buffer', function() { }); - describe('getDirtySet', function() { - - it('returns an empty set', function() { - expect(b.getDirtySet().isEmpty()).to.be(true); - }); - - }); - describe('getFreeSet', function() { it('returns the expected set', function() { @@ -281,3 +259,4 @@ describe('ol.structs.Buffer', function() { goog.require('ol.structs.Buffer'); +goog.require('ol.structs.IntegerSet');