/* -*- 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;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。