enumset32
Version:
High-performance, typesafe, small ordered set implemented in TypeScript
217 lines • 7.29 kB
JavaScript
"use strict";
/*!
* Copyright (c) 2019 Justin Johansson
*/
Object.defineProperty(exports, "__esModule", { value: true });
var _UniversalEnumset32 = (function () {
function _UniversalEnumset32(enumObject) {
var e = Object.create(null);
var m = Object.create(null);
var u = 0 | 0;
var names = Object.getOwnPropertyNames(enumObject);
for (var i = 0; i < names.length; ++i) {
var n = names[i];
var v = enumObject[n];
if (typeof v === 'number') {
e[(e[n] = v)] = n;
var mv = 1 << v;
m[n] = mv;
u |= mv;
}
}
this.Enum = Object.freeze(e);
this.Member = Object.freeze(m);
this._univ = u;
}
_UniversalEnumset32.create = function (enumObject) {
return Object.freeze(new _UniversalEnumset32(enumObject));
};
Object.defineProperty(_UniversalEnumset32.prototype, "Empty", {
get: function () {
return (0 | 0);
},
enumerable: true,
configurable: true
});
_UniversalEnumset32.prototype.set = function () {
var res = 0;
var i;
for (i = 0; i < arguments.length; ++i) {
res |= 1 << arguments[i];
}
return res & this._univ;
};
_UniversalEnumset32.prototype.add = function (set, member) {
var s = set & this._univ;
var m = +member;
return (s | (1 << m)) & this._univ;
};
_UniversalEnumset32.prototype.addAll = function (set1, set2) {
var sets = [];
for (var _i = 2; _i < arguments.length; _i++) {
sets[_i - 2] = arguments[_i];
}
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
var res = s1 | s2;
for (var i = 0; i < sets.length; ++i) {
res |= sets[i];
}
return res & this._univ;
};
_UniversalEnumset32.prototype.complement = function (set) {
var s = set & this._univ;
return ~s & this._univ;
};
_UniversalEnumset32.prototype.retain = function (set, member) {
var s = set & this._univ;
var m = +member;
return s & (1 << m) & this._univ;
};
_UniversalEnumset32.prototype.retainAll = function (set1, set2) {
var sets = [];
for (var _i = 2; _i < arguments.length; _i++) {
sets[_i - 2] = arguments[_i];
}
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
var res = s1 & s2;
for (var i = 0; i < sets.length; ++i) {
res &= sets[i];
}
return res & this._univ;
};
_UniversalEnumset32.prototype.remove = function (set, member) {
var s = set & this._univ;
var m = +member;
return s & ~(1 << m) & this._univ;
};
_UniversalEnumset32.prototype.removeAll = function (set1, set2) {
var sets = [];
for (var _i = 2; _i < arguments.length; _i++) {
sets[_i - 2] = arguments[_i];
}
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
var res = s1 & ~s2;
for (var i = 0; i < sets.length; ++i) {
res &= ~sets[i];
}
return res & this._univ;
};
_UniversalEnumset32.prototype.toggle = function (set, member) {
var s = set & this._univ;
var m = +member;
return (s ^ (1 << m)) & this._univ;
};
_UniversalEnumset32.prototype.toggleAll = function (set1, set2) {
var sets = [];
for (var _i = 2; _i < arguments.length; _i++) {
sets[_i - 2] = arguments[_i];
}
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
var res = s1 ^ s2;
for (var i = 0; i < sets.length; ++i) {
res ^= sets[i];
}
return res & this._univ;
};
_UniversalEnumset32.prototype.empty = function (set) {
var s = set & this._univ;
return s === 0;
};
_UniversalEnumset32.prototype.excludes = function (set, member) {
var s = set & this._univ;
var m = +member;
return this.excludesEvery(s, (1 << m));
};
_UniversalEnumset32.prototype.excludesEvery = function (set1, set2) {
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
return (s1 & s2) === 0;
};
_UniversalEnumset32.prototype.excludesSome = function (set1, set2) {
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
return (s1 & s2) !== s2;
};
_UniversalEnumset32.prototype.includes = function (set, member) {
var s = set & this._univ;
var m = +member;
return this.includesEvery(s, (1 << m));
};
_UniversalEnumset32.prototype.includesEvery = function (set1, set2) {
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
return (s1 & s2) === s2;
};
_UniversalEnumset32.prototype.includesSome = function (set1, set2) {
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
return (s1 & s2) !== 0;
};
_UniversalEnumset32.prototype.count = function (set) {
var s = set & this._univ;
if (s >= 0) {
var card = s - ((s >> 1) & 3681400539) - ((s >> 2) & 1227133513);
return ((card + (card >> 3)) & 3340530119) % 63;
}
return this.count((set & 2147483647)) + 1;
};
_UniversalEnumset32.prototype.enumEntries = function (set) {
var s = set & this._univ;
var entries = [];
for (var i = 0; i < 32; ++i) {
if (s & (1 << i)) {
entries.push([this.Enum[i], i]);
}
}
return entries;
};
_UniversalEnumset32.prototype.enumKeys = function (set) {
var s = set & this._univ;
var keys = [];
for (var i = 0; i < 32; ++i) {
if (s & (1 << i)) {
keys.push(this.Enum[i]);
}
}
return keys;
};
_UniversalEnumset32.prototype.enumValues = function (set) {
var s = set & this._univ;
var values = [];
for (var i = 0; i < 32; ++i) {
if (s & (1 << i)) {
values.push(i);
}
}
return values;
};
_UniversalEnumset32.prototype.equal = function (set1, set2) {
var s1 = set1 & this._univ;
var s2 = set2 & this._univ;
return s1 === s2;
};
_UniversalEnumset32.prototype.isEnumKey = function (key) {
return typeof key === 'string' && typeof this.Enum[key] === 'number';
};
_UniversalEnumset32.prototype.isEnumValue = function (value) {
return typeof value === 'number' && typeof this.Enum[value] === 'string';
};
_UniversalEnumset32.prototype.toDigitString = function (set, radix) {
var s = set & this._univ;
return (s >>> 0).toString(radix);
};
_UniversalEnumset32.prototype.valueOf = function () {
return (this._univ | 0);
};
return _UniversalEnumset32;
}());
exports._UniversalEnumset32 = _UniversalEnumset32;
function UniversalEnumset32(enumObject) {
return _UniversalEnumset32.create(enumObject);
}
exports.UniversalEnumset32 = UniversalEnumset32;
//# sourceMappingURL=index.js.map