Show More
Commit Description:
utf8mb4
Commit Description:
utf8mb4
References:
File last commit:
Show/Diff file:
Action:
node_modules/source-map/lib/array-set.js
| 121 lines
| 3.1 KiB
| application/javascript
| JavascriptLexer
|
r789 | /* -*- Mode: js; js-indent-level: 2; -*- */ | |||
/* | ||||
* Copyright 2011 Mozilla Foundation and contributors | ||||
* Licensed under the New BSD license. See LICENSE or: | ||||
* http://opensource.org/licenses/BSD-3-Clause | ||||
*/ | ||||
var util = require('./util'); | ||||
var has = Object.prototype.hasOwnProperty; | ||||
var hasNativeMap = typeof Map !== "undefined"; | ||||
/** | ||||
* A data structure which is a combination of an array and a set. Adding a new | ||||
* member is O(1), testing for membership is O(1), and finding the index of an | ||||
* element is O(1). Removing elements from the set is not supported. Only | ||||
* strings are supported for membership. | ||||
*/ | ||||
function ArraySet() { | ||||
this._array = []; | ||||
this._set = hasNativeMap ? new Map() : Object.create(null); | ||||
} | ||||
/** | ||||
* Static method for creating ArraySet instances from an existing array. | ||||
*/ | ||||
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { | ||||
var set = new ArraySet(); | ||||
for (var i = 0, len = aArray.length; i < len; i++) { | ||||
set.add(aArray[i], aAllowDuplicates); | ||||
} | ||||
return set; | ||||
}; | ||||
/** | ||||
* Return how many unique items are in this ArraySet. If duplicates have been | ||||
* added, than those do not count towards the size. | ||||
* | ||||
* @returns Number | ||||
*/ | ||||
ArraySet.prototype.size = function ArraySet_size() { | ||||
return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; | ||||
}; | ||||
/** | ||||
* Add the given string to this set. | ||||
* | ||||
* @param String aStr | ||||
*/ | ||||
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { | ||||
var sStr = hasNativeMap ? aStr : util.toSetString(aStr); | ||||
var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); | ||||
var idx = this._array.length; | ||||
if (!isDuplicate || aAllowDuplicates) { | ||||
this._array.push(aStr); | ||||
} | ||||
if (!isDuplicate) { | ||||
if (hasNativeMap) { | ||||
this._set.set(aStr, idx); | ||||
} else { | ||||
this._set[sStr] = idx; | ||||
} | ||||
} | ||||
}; | ||||
/** | ||||
* Is the given string a member of this set? | ||||
* | ||||
* @param String aStr | ||||
*/ | ||||
ArraySet.prototype.has = function ArraySet_has(aStr) { | ||||
if (hasNativeMap) { | ||||
return this._set.has(aStr); | ||||
} else { | ||||
var sStr = util.toSetString(aStr); | ||||
return has.call(this._set, sStr); | ||||
} | ||||
}; | ||||
/** | ||||
* What is the index of the given string in the array? | ||||
* | ||||
* @param String aStr | ||||
*/ | ||||
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { | ||||
if (hasNativeMap) { | ||||
var idx = this._set.get(aStr); | ||||
if (idx >= 0) { | ||||
return idx; | ||||
} | ||||
} else { | ||||
var sStr = util.toSetString(aStr); | ||||
if (has.call(this._set, sStr)) { | ||||
return this._set[sStr]; | ||||
} | ||||
} | ||||
throw new Error('"' + aStr + '" is not in the set.'); | ||||
}; | ||||
/** | ||||
* What is the element at the given index? | ||||
* | ||||
* @param Number aIdx | ||||
*/ | ||||
ArraySet.prototype.at = function ArraySet_at(aIdx) { | ||||
if (aIdx >= 0 && aIdx < this._array.length) { | ||||
return this._array[aIdx]; | ||||
} | ||||
throw new Error('No element indexed by ' + aIdx); | ||||
}; | ||||
/** | ||||
* Returns the array representation of this set (which has the proper indices | ||||
* indicated by indexOf). Note that this is a copy of the internal array used | ||||
* for storing the members so that no one can mess with internal state. | ||||
*/ | ||||
ArraySet.prototype.toArray = function ArraySet_toArray() { | ||||
return this._array.slice(); | ||||
}; | ||||
exports.ArraySet = ArraySet; | ||||