modified TS associative container

Signed-off-by: wangyong <wangyong237@huawei.com>
This commit is contained in:
wangyong
2022-01-16 11:52:51 +08:00
parent 5e2c79abb4
commit 2e1e6a03b6
8 changed files with 97 additions and 168 deletions
+3 -7
View File
@@ -31,7 +31,6 @@ if (flag || fastHashMap === undefined) {
done: boolean;
};
}
class HandlerHashMap<K, V> {
set(target: HashMap<K, V>, p: any, value: any): boolean {
if (p in target) {
@@ -41,22 +40,20 @@ if (flag || fastHashMap === undefined) {
return false;
}
defineProperty(target: HashMap<K, V>, p: any): boolean {
throw new Error("Can't defineProperty on HashMap Object");
throw new Error("Can't define Property on HashMap Object");
}
deleteProperty(target: HashMap<K, V>, p: any): boolean {
throw new Error("Can't deleteProperty on HashMap Object");
throw new Error("Can't delete Property on HashMap Object");
}
setPrototypeOf(target: HashMap<K, V>, p: any): boolean {
throw new Error("Can't setPrototype on HashMap Object");
throw new Error("Can't set Prototype on HashMap Object");
}
}
class HashMap<K, V> extends HashMapAbility.DictionaryClass<K, V> {
constructor() {
super();
return new Proxy(this, new HandlerHashMap());
}
get length() {
return this.memberNumber;
}
@@ -161,7 +158,6 @@ if (flag || fastHashMap === undefined) {
};
}
}
Object.freeze(HashMap);
fastHashMap = HashMap;
}
+14 -17
View File
@@ -23,6 +23,7 @@ if (arkPritvate !== undefined) {
} else {
flag = true;
}
if (flag || fastHashSet === undefined) {
const HashSetAbility = requireNapi("struct");
interface IterableIterator<T> {
@@ -31,7 +32,6 @@ if (flag || fastHashSet === undefined) {
done: boolean;
};
}
class HandlerHashSet<T> {
set(target: HashSet<T>, p: any, value: any): boolean {
if (p in target) {
@@ -41,22 +41,20 @@ if (flag || fastHashSet === undefined) {
return false;
}
defineProperty(target: HashSet<T>, p: any): boolean {
throw new Error("Can't defineProperty on HashMap Object");
throw new Error("Can't define Property on HashSet Object");
}
deleteProperty(target: HashSet<T>, p: any): boolean {
throw new Error("Can't deleteProperty on HashMap Object");
throw new Error("Can't delete Property on HashSet Object");
}
setPrototypeOf(target: HashSet<T>, p: any): boolean {
throw new Error("Can't setPrototype on HashMap Object");
throw new Error("Can't set Prototype on HashSet Object");
}
}
class HashSet<T> extends HashSetAbility.DictionaryClass<T, T> {
constructor() {
super();
return new Proxy(this, new HandlerHashSet());
}
get length() {
return this.memberNumber;
}
@@ -85,12 +83,12 @@ if (flag || fastHashSet === undefined) {
}
}
values(): IterableIterator<T> {
let _this = this;
let i = 0;
let data = this;
let count = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].key : undefined;
var done = count >= data.memberNumber;
var value = !done ? data.keyValueArray[count++].key : undefined;
return {
done: done,
value: value,
@@ -99,12 +97,12 @@ if (flag || fastHashSet === undefined) {
};
}
entries(): IterableIterator<[T, T]> {
let _this = this;
let data = this;
let count = 0;
return {
next: function () {
var done = count >= _this.memberNumber;
var value = !done ? _this.keyValueArray[count++].entry() : undefined;
var done = count >= data.memberNumber;
var value = !done ? data.keyValueArray[count++].entry() : undefined;
return {
done: done,
value: value,
@@ -113,12 +111,12 @@ if (flag || fastHashSet === undefined) {
};
}
[Symbol.iterator](): IterableIterator<T> {
let _this = this;
let data = this;
let count = 0;
return {
next: function () {
var done = count >= _this.memberNumber;
var value = !done ? _this.keyValueArray[count++].key : undefined;
var done = count >= data.memberNumber;
var value = !done ? data.keyValueArray[count++].key : undefined;
return {
done: done,
value: value,
@@ -127,7 +125,6 @@ if (flag || fastHashSet === undefined) {
};
}
}
Object.freeze(HashSet);
fastHashSet = HashSet;
}
+7 -10
View File
@@ -31,7 +31,6 @@ if (flag || fastLightWeightMap === undefined) {
done: boolean;
};
}
class HandlerLightWeightMap<K, V> {
set(target: LightWeightMap<K, V>, p: any, value: any): boolean {
if (p in target) {
@@ -41,22 +40,20 @@ if (flag || fastLightWeightMap === undefined) {
return false;
}
defineProperty(target: LightWeightMap<K, V>, p: any): boolean {
throw new Error("Can't defineProperty on LightWeightMap Object");
throw new Error("Can't define Property on LightWeightMap Object");
}
deleteProperty(target: LightWeightMap<K, V>, p: any): boolean {
throw new Error("Can't deleteProperty on LightWeightMap Object");
throw new Error("Can't delete Property on LightWeightMap Object");
}
setPrototypeOf(target: LightWeightMap<K, V>, p: any): boolean {
throw new Error("Can't setPrototype on LightWeightMap Object");
throw new Error("Can't set Prototype on LightWeightMap Object");
}
}
class LightWeightMap<K, V> extends LightWeightAbility.LightWeightClass<K, V> {
constructor() {
super();
return new Proxy(this, new HandlerLightWeightMap());
}
get length() {
return this.memberNumber;
}
@@ -166,9 +163,9 @@ if (flag || fastLightWeightMap === undefined) {
}
forEach(callbackfn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void,
thisArg?: Object): void {
let _this = this;
for (let i = 0; i < _this.memberNumber; i++) {
callbackfn.call(thisArg, _this.members.values[i], _this.members.keys[i], _this);
let data = this;
for (let i = 0; i < data.memberNumber; i++) {
callbackfn.call(thisArg, data.members.values[i], data.members.keys[i], data);
}
}
[Symbol.iterator](): IterableIterator<[K, V]> {
@@ -212,10 +209,10 @@ if (flag || fastLightWeightMap === undefined) {
};
}
}
Object.freeze(LightWeightMap);
fastLightWeightMap = LightWeightMap;
}
export default {
LightWeightMap: fastLightWeightMap,
};
+7 -10
View File
@@ -31,7 +31,6 @@ if (flag || fastLightWeightSet === undefined) {
done: boolean;
};
}
class HandlerLightWeightSet<T> {
set(target: LightWeightSet<T>, p: any, value: any): boolean {
if (p in target) {
@@ -41,22 +40,20 @@ if (flag || fastLightWeightSet === undefined) {
return false;
}
defineProperty(target: LightWeightSet<T>, p: any): boolean {
throw new Error("Can't LightWeightSet on HashMap Object");
throw new Error("Can't define Property on LightWeightSet Object");
}
deleteProperty(target: LightWeightSet<T>, p: any): boolean {
throw new Error("Can't LightWeightSet on HashMap Object");
throw new Error("Can't delete Property on LightWeightSet Object");
}
setPrototypeOf(target: LightWeightSet<T>, p: any): boolean {
throw new Error("Can't LightWeightSet on HashMap Object");
throw new Error("Can't set Prototype on LightWeightSet Object");
}
}
class LightWeightSet<T> extends LightWeightAbility.LightWeightClass<T, T> {
constructor() {
super();
return new Proxy(this, new HandlerLightWeightSet());
}
get length() {
return this.memberNumber;
}
@@ -127,9 +124,9 @@ if (flag || fastLightWeightSet === undefined) {
}
forEach(callbackfn: (value?: T, key?: T, set?: LightWeightSet<T>) => void,
thisArg?: Object): void {
let _this = this;
for (let i = 0; i < _this.memberNumber; i++) {
callbackfn.call(thisArg, _this.members.keys[i], _this.members.keys[i], _this);
let data = this;
for (let i = 0; i < data.memberNumber; i++) {
callbackfn.call(thisArg, data.members.keys[i], data.members.keys[i], data);
}
}
[Symbol.iterator](): IterableIterator<T> {
@@ -175,10 +172,10 @@ if (flag || fastLightWeightSet === undefined) {
};
}
}
Object.freeze(LightWeightSet);
fastLightWeightSet = LightWeightSet;
}
export default {
LightWeightSet: fastLightWeightSet,
};
+12 -15
View File
@@ -31,7 +31,6 @@ if (flag || fastPlainArray === undefined) {
done: boolean;
};
}
class HandlerPlainArray<T> {
set(target: PlainArray<T>, p: any, value: any): boolean {
if (p in target) {
@@ -41,13 +40,13 @@ if (flag || fastPlainArray === undefined) {
return false;
}
defineProperty(target: PlainArray<T>, p: any): boolean {
throw new Error("Can't PlainArray on HashMap Object");
throw new Error("Can't define Property on PlainArray Object");
}
deleteProperty(target: PlainArray<T>, p: any): boolean {
throw new Error("Can't PlainArray on HashMap Object");
throw new Error("Can't delete Property on PlainArray Object");
}
setPrototypeOf(target: PlainArray<T>, p: any): boolean {
throw new Error("Can't PlainArray on HashMap Object");
throw new Error("Can't set Prototype on PlainArray Object");
}
}
class PlainArray<T> extends PlainAbility.PlainArrayClass<T> {
@@ -55,12 +54,11 @@ if (flag || fastPlainArray === undefined) {
super();
return new Proxy(this, new HandlerPlainArray());
}
get length() {
return this.memberNumber;
}
add(key: number, value: T): void {
if(typeof key !== "number") {
if (typeof key !== "number") {
throw new Error("PlainArray's only number is allowed");
}
this.addmember(key, value);
@@ -77,19 +75,18 @@ if (flag || fastPlainArray === undefined) {
clone.memberNumber = this.memberNumber;
clone.members.keys = this.members.keys.slice();
clone.members.values = this.members.values.slice();
return clone;
}
has(key: number): boolean {
return this.binarySearch_Plain(key) > -1;
return this.binarySearchAtPlain(key) > -1;
}
get(key: number): T {
let index = this.binarySearch_Plain(key);
let index = this.binarySearchAtPlain(key);
if (index < 0) throw new Error("Key error found");
return this.members.values[index];
}
getIndexOfKey(key: number): number {
let result = this.binarySearch_Plain(key);
let result = this.binarySearchAtPlain(key);
return result < 0 ? -1 : result;
}
getIndexOfValue(value: T): number {
@@ -102,7 +99,7 @@ if (flag || fastPlainArray === undefined) {
return this.members.keys[index];
}
remove(key: number): T {
let index = this.binarySearch_Plain(key);
let index = this.binarySearchAtPlain(key);
if (index < 0) throw new Error(" element not in this plainarray");
return this.deletemember(index);
}
@@ -140,12 +137,12 @@ if (flag || fastPlainArray === undefined) {
}
}
[Symbol.iterator](): IterableIterator<[number, T]> {
let _this = this;
let data = this;
let count = 0;
return {
next: function () {
var done = count >= _this.memberNumber;
var value = !done ? [_this.members.keys[count], _this.members.values[count]] as [number, T] : undefined;
var done = count >= data.memberNumber;
var value = !done ? [data.members.keys[count], data.members.values[count]] as [number, T] : undefined;
count++;
return {
done: done,
@@ -154,11 +151,11 @@ if (flag || fastPlainArray === undefined) {
},
};
}
}
Object.freeze(PlainArray);
fastPlainArray = PlainArray;
}
export default {
PlainArray: fastPlainArray,
};
+14 -57
View File
@@ -42,24 +42,20 @@ function compareToString(string1: String, string2: String) {
let len1 = string1.length;
let len2 = string2.length;
let lim = (len1 > len2 ? len2 : len1);
let k = 0;
while (k < lim) {
if (string1.charCodeAt(k) === string2.charCodeAt(k)) {
k++;
if(k === lim) {
if (k === lim) {
return len1 > len2 ? ComparResult.BIGGER_THAN : ComparResult.LESS_THAN;
}
continue;
}
return string1.charCodeAt(k) > string2.charCodeAt(k) ? ComparResult.BIGGER_THAN : ComparResult.LESS_THAN;
}
throw new Error("this function run error");
}
// There is type judgment in comparison, and the input parameter type cannot be defined directly
function currencyCompare(a: any, b: any, compareFn?: Function): number {
if (a === b) return ComparResult.EQUALS;
if (compareFn != undefined) {
@@ -91,7 +87,6 @@ function isIncludeToArray(array1: Array<any>, array2: Array<any>): boolean {
return false;
}
class Pair<K, V>{
key: K;
value: V;
@@ -126,7 +121,7 @@ class PlainArrayClass<T> {
}
protected addmember(key: number, value: T) {
let index = this.binarySearch_Plain(key);
let index = this.binarySearchAtPlain(key);
if (index > 0) {
this.members.keys[index] = key;
this.members.values[index] = value;
@@ -145,10 +140,9 @@ class PlainArrayClass<T> {
return removeValue;
}
protected binarySearch_Plain(key: number, startIndex: number = 0, endIndex: number = this.memberNumber): number {
protected binarySearchAtPlain(key: number, startIndex: number = 0, endIndex: number = this.memberNumber): number {
let low = startIndex;
let high = endIndex - 1;
while (low <= high) {
let mid = (low + high) >>> 1;
let midVal = this.members.keys[mid];
@@ -161,10 +155,8 @@ class PlainArrayClass<T> {
high = mid - 1;
}
}
return -(low + 1);
}
}
class LightWeightMembers<K, V> {
@@ -188,7 +180,7 @@ class LightWeightClass<K, V> {
protected addmember(key: K, value: V = key as unknown as V) {
let hash = hashCode(key);
let index = this.binarySearch_LightWeight(hash);
let index = this.binarySearchAtLightWeight(hash);
if (index > 0) {
this.members.keys[index] = key;
this.members.values[index] = value;
@@ -199,13 +191,12 @@ class LightWeightClass<K, V> {
insert(this.members.values, index, value);
this.memberNumber++;
}
if (this.capacity < this.memberNumber) this.ensureCapacity(1);
}
protected getIndexByKey(key: K): number {
let hash = hashCode(key);
let index = this.binarySearch_LightWeight(hash);
let index = this.binarySearchAtLightWeight(hash);
if (index < 0 || index >= this.memberNumber) return -1;
return index;
}
@@ -221,8 +212,6 @@ class LightWeightClass<K, V> {
}
protected ensureCapacity(addCapacity: number = 1) {
// The TS terminal does not need to realize the capacity expansion function
// capacity ensure consistency with ark side
let tempCapacity = this.capacity + addCapacity;
while (this.capacity < tempCapacity) {
this.capacity = 2 * this.capacity;
@@ -231,7 +220,7 @@ class LightWeightClass<K, V> {
protected getIndex(key: K): number {
let hash = hashCode(key);
let index = this.binarySearch_LightWeight(hash);
let index = this.binarySearchAtLightWeight(hash);
if (index < 0) index = ~index;
return index;
}
@@ -244,10 +233,9 @@ class LightWeightClass<K, V> {
return resultArray;
}
protected binarySearch_LightWeight(hash: number, startIndex: number = 0, endIndex: number = this.memberNumber): number {
protected binarySearchAtLightWeight(hash: number, startIndex: number = 0, endIndex: number = this.memberNumber): number {
let low = startIndex;
let high = endIndex - 1;
while (low <= high) {
let mid = (low + high) >>> 1;
let midVal = this.members.hashs[mid];
@@ -260,10 +248,8 @@ class LightWeightClass<K, V> {
high = mid - 1;
}
}
return -(low + 1);
}
}
type RBTreeNodeColor = "black" | "red";
@@ -274,21 +260,18 @@ class RBTreeNode<K, V> extends Pair<K, V>{
left: RBTreeNode<K, V> | null;
right: RBTreeNode<K, V> | null;
parent: RBTreeNode<K, V> | null;
constructor(
key: K,
constructor(key: K,
value?: V,
color: RBTreeNodeColor = RED,
parent: RBTreeNode<K, V> | null = null,
left: RBTreeNode<K, V> | null = null,
right: RBTreeNode<K, V> | null = null
) {
right: RBTreeNode<K, V> | null = null) {
super(key, value);
this.color = color;
this.left = left;
this.right = right;
this.parent = parent;
}
}
class RBTreeClass<K, V> {
private _root: RBTreeNode<K, V> | null;
@@ -316,7 +299,6 @@ class RBTreeClass<K, V> {
} else {
this.addProcess(key, value)
}
return this;
}
@@ -324,7 +306,6 @@ class RBTreeClass<K, V> {
let leafNode: RBTreeNode<K, V> | null = this._root;
let parentNode: RBTreeNode<K, V> = this._root as RBTreeNode<K, V>;
let comp: number = 0;
while (leafNode !== null) {
parentNode = leafNode;
comp = currencyCompare(leafNode.key, key);
@@ -337,20 +318,16 @@ class RBTreeClass<K, V> {
leafNode = leafNode.left;
}
}
leafNode = new RBTreeNode<K, V>(key, value)
leafNode.parent = parentNode;
if (comp < 0) {
parentNode.right = leafNode;
} else {
parentNode.left = leafNode;
}
this.insertRebalance(leafNode);
this.memberNumber++;
this._isChange = true;
return this;
}
@@ -373,7 +350,6 @@ class RBTreeClass<K, V> {
}
removeNode = successor;
}
let replacementNode = (removeNode.right === null ? removeNode.left : removeNode.right);
if (replacementNode !== null) {
replacementNode.parent = removeNode.parent;
@@ -394,14 +370,12 @@ class RBTreeClass<K, V> {
if (this.getColor(removeNode) === BLACK) {
this.deleteRebalance(removeNode)
}
if (removeNode === removeNode.parent.left) {
removeNode.parent.left = null;
} else if (removeNode === removeNode.parent.right) {
removeNode.parent.right = null;
}
}
this.memberNumber--;
this._isChange = true;
}
@@ -448,7 +422,7 @@ class RBTreeClass<K, V> {
setAll(map: RBTreeClass<K, V>) {
this.recordByMinToMax();
for(let i = 0; i < this.memberNumber; i++) {
for (let i = 0; i < this.memberNumber; i++) {
map.addNode(this._treeArray[i].key, this._treeArray[i].value);
}
}
@@ -458,7 +432,6 @@ class RBTreeClass<K, V> {
this.memberNumber = 0;
}
// inorder traversal
private recordByMinToMax(): Array<RBTreeNode<K, V>> {
if (!this._isChange) return this._treeArray;
let stack = [];
@@ -476,7 +449,6 @@ class RBTreeClass<K, V> {
this._treeArray.push(node);
node = node.right;
}
this._isChange = false;
this.memberNumber = this._treeArray.length;
return this._treeArray;
@@ -486,10 +458,8 @@ class RBTreeClass<K, V> {
let newTopNode = datumPointNode.right;
if (newTopNode === null)
throw new Error("[rotate right error]: the right child node of the base node === null")
datumPointNode.right = newTopNode.left;
datumPointNode.right !== null ? datumPointNode.right.parent = datumPointNode : "";
newTopNode.parent = datumPointNode.parent;
if (datumPointNode.parent === null) {
this._root = newTopNode;
@@ -498,10 +468,8 @@ class RBTreeClass<K, V> {
} else if (datumPointNode.parent.right === datumPointNode) {
datumPointNode.parent.right = newTopNode;
}
datumPointNode.parent = newTopNode;
newTopNode.left = datumPointNode;
return this;
}
@@ -510,7 +478,6 @@ class RBTreeClass<K, V> {
if (newTopNode === null) {
throw new Error("[rotate right error]: the left child node of the base node === null")
}
datumPointNode.left = newTopNode.right;
datumPointNode.left !== null ? datumPointNode.left.parent = datumPointNode : "";
newTopNode.parent = datumPointNode.parent
@@ -521,10 +488,8 @@ class RBTreeClass<K, V> {
} else if (datumPointNode === datumPointNode.parent.right) {
datumPointNode.parent.right = newTopNode;
}
datumPointNode.parent = newTopNode;
newTopNode.right = datumPointNode;
return this;
}
@@ -685,7 +650,6 @@ class RBTreeClass<K, V> {
}
return this;
}
}
const MAX_CAPACITY = 1 << 30;
@@ -696,7 +660,6 @@ class DictionaryClass<K, V> {
private _isChange: boolean;
private _memberArray: Array<Pair<K, V>>;
private _capacity: number;
constructor() {
this._tableLink = {};
this.memberNumber = 0;
@@ -734,7 +697,6 @@ class DictionaryClass<K, V> {
const keys = Object.keys(this._tableLink).map((item) => parseInt(item));
for (let i = 0; i < keys.length; i++) {
const members = this._tableLink[keys[i]];
if (members instanceof RBTreeClass) {
let tempArray = members.keyValueArray;
for (let i = 0; i < members.memberNumber; i++) {
@@ -756,8 +718,6 @@ class DictionaryClass<K, V> {
}
protected expandCapacity() {
// The TS terminal does not need to realize the _capacity expansion function
// _capacity ensure consistency with ark side
while (this._capacity < this.memberNumber / LOADER_FACTOR && this._capacity < MAX_CAPACITY) {
this._capacity = 2 * this._capacity;
}
@@ -767,15 +727,13 @@ class DictionaryClass<K, V> {
if (key != null && value != null) {
this._isChange = true;
this.memberNumber++;
const position = this.getHashIndex(key);
let members = this._tableLink[position];
if (members instanceof LinkedList && members.count >= 8) {
let newElement = new RBTreeClass<K, V>();
let current = members.getHead();
while (current != null || current != undefined) {
if (!(current.element instanceof Pair))
if (!(current.element instanceof Pair))
throw new Error("this hashtable member save error");
newElement.addNode(current.element.key, current.element.value);
current = current.next;
@@ -798,7 +756,6 @@ class DictionaryClass<K, V> {
return true;
}
}
return false;
}
@@ -839,7 +796,7 @@ class DictionaryClass<K, V> {
return undefined;
}
protected removeMember(key: K): V | null{
protected removeMember(key: K): V | null {
const position = this.getHashIndex(key);
const members = this._tableLink[position];
if (members instanceof RBTreeClass) {
@@ -922,7 +879,6 @@ class LinkedList<T> {
public count: number;
protected next: Node<T> | null;
protected head: Node<T> | null;
constructor() {
this.count = 0;
this.next = null;
@@ -983,7 +939,7 @@ class LinkedList<T> {
this.head = node;
} else {
const previous = this.getElementAt(index--);
if (previous === null)
if (previous === null)
throw new Error("data storage error");
node.next = previous.next;
previous.next = node;
@@ -1021,6 +977,7 @@ class LinkedList<T> {
getHead() {
return this.head;
}
toString() {
if (this.head == null) {
return "";
+21 -26
View File
@@ -22,6 +22,7 @@ if (arkPritvate !== undefined) {
} else {
flag = true;
}
if (flag || fastTreeMap === undefined) {
const RBTreeAbility = requireNapi("struct")
interface IterableIterator<T> {
@@ -30,7 +31,6 @@ if (flag || fastTreeMap === undefined) {
done: boolean;
};
}
class HandlerTreeMap<K, V> {
set(target: TreeMap<K, V>, p: any, value: any): boolean {
if (p in target) {
@@ -40,23 +40,21 @@ if (flag || fastTreeMap === undefined) {
return false;
}
defineProperty(target: TreeMap<K, V>, p: any): boolean {
throw new Error("Can't defineProperty on TreeMap Object");
throw new Error("Can't define Property on TreeMap Object");
}
deleteProperty(target: TreeMap<K, V>, p: any): boolean {
throw new Error("Can't deleteProperty on TreeMap Object");
throw new Error("Can't delete Property on TreeMap Object");
}
setPrototypeOf(target: TreeMap<K, V>, p: any): boolean {
throw new Error("Can't setPrototype on TreeMap Object");
throw new Error("Can't set Prototype on TreeMap Object");
}
}
class TreeMap<K, V> {
private _constitute: any;
constructor() {
this._constitute = new RBTreeAbility.RBTreeClass();
return new Proxy(this, new HandlerTreeMap());
}
}
get length() {
return this._constitute.memberNumber;
}
@@ -88,7 +86,6 @@ if (flag || fastTreeMap === undefined) {
this._constitute.setAll(map._constitute);
}
set(key: K, value: V): Object {
// If the user enters key other than number and string, a comparison function is required
return this._constitute.addNode(key, value);
}
remove(key: K): V | null {
@@ -111,7 +108,6 @@ if (flag || fastTreeMap === undefined) {
}
getHigherKey(key: K): K {
let tempNode = this._constitute.getNode(key);
if (tempNode === null)
throw new Error("don't find this key,this node is undefine");
if (tempNode.right !== null) return tempNode.right.key;
@@ -120,16 +116,15 @@ if (flag || fastTreeMap === undefined) {
if (node.parent.left === node) return node.parent.key;
node = node.parent;
}
throw new Error("don't find a key meet the conditions");
}
keys(): IterableIterator<K> {
let _this = this._constitute;
let data = this._constitute;
let i = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].key : undefined;
var done = i >= data.memberNumber;
var value = !done ? data.keyValueArray[i++].key : undefined;
return {
done: done,
value: value,
@@ -138,12 +133,12 @@ if (flag || fastTreeMap === undefined) {
};
}
values(): IterableIterator<V> {
let _this = this._constitute;
let data = this._constitute;
let i = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].value as V : undefined;
var done = i >= data.memberNumber;
var value = !done ? data.keyValueArray[i++].value as V : undefined;
return {
done: done,
value: value,
@@ -159,19 +154,19 @@ if (flag || fastTreeMap === undefined) {
}
forEach(callbackfn: (value?: V, key?: K, map?: TreeMap<K, V>) => void,
thisArg?: Object): void {
let _this = this._constitute;
let tagetArray = _this.keyValueArray;
for (let i = 0; i < _this.memberNumber; i++) {
let data = this._constitute;
let tagetArray = data.keyValueArray;
for (let i = 0; i < data.memberNumber; i++) {
callbackfn.call(thisArg, tagetArray[i].value as V, tagetArray[i].key);
}
}
entries(): IterableIterator<[K, V]> {
let _this = this._constitute;
let data = this._constitute;
let i = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].entry() : undefined;
var done = i >= data.memberNumber;
var value = !done ? data.keyValueArray[i++].entry() : undefined;
return {
done: done,
value: value,
@@ -180,12 +175,12 @@ if (flag || fastTreeMap === undefined) {
};
}
[Symbol.iterator](): IterableIterator<[K, V]> {
let _this = this._constitute;
let data = this._constitute;
let i = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].entry() : undefined;
var done = i >= data.memberNumber;
var value = !done ? data.keyValueArray[i++].entry() : undefined;
return {
done: done,
value: value,
@@ -194,10 +189,10 @@ if (flag || fastTreeMap === undefined) {
};
}
}
Object.freeze(TreeMap);
fastTreeMap = TreeMap;
}
export default {
TreeMap: fastTreeMap,
};
+19 -26
View File
@@ -31,7 +31,6 @@ if (flag || fastTreeSet === undefined) {
done: boolean;
};
}
class HandlerTreeSet<T> {
set(target: TreeSet<T>, p: any, value: any): boolean {
if (p in target) {
@@ -41,23 +40,21 @@ if (flag || fastTreeSet === undefined) {
return false;
}
defineProperty(target: TreeSet<T>, p: any): boolean {
throw new Error("Can't TreeSet on HashMap Object");
throw new Error("Can't define Property on TreeSet Object");
}
deleteProperty(target: TreeSet<T>, p: any): boolean {
throw new Error("Can't TreeSet on HashMap Object");
throw new Error("Can't delete Property on TreeSet Object");
}
setPrototypeOf(target: TreeSet<T>, p: any): boolean {
throw new Error("Can't TreeSet on HashMap Object");
throw new Error("Can't set Prototype on TreeSet Object");
}
}
class TreeSet<T> {
private _constitute: any;
constructor() {
this._constitute = new RBTreeAbility.RBTreeClass();
return new Proxy(this, new HandlerTreeSet());
}
get length() {
return this._constitute.memberNumber;
}
@@ -92,7 +89,6 @@ if (flag || fastTreeSet === undefined) {
}
getLowerValue(key: T): T {
let tempNode = this._constitute.getNode(key);
if (tempNode === null)
throw new Error("don't find this key,this node is undefine");
if (tempNode.left !== null) return tempNode.left.key;
@@ -101,12 +97,10 @@ if (flag || fastTreeSet === undefined) {
if (node.parent.right === node) return node.parent.key;
node = node.parent; // node.parent.left === node is true;
}
throw new Error("don't find a key meet the conditions");
}
getHigherValue(key: T): T {
let tempNode = this._constitute.getNode(key);
if (tempNode === null)
throw new Error("don't find this key,this node is undefine");
if (tempNode.right !== null) return tempNode.right.key;
@@ -115,7 +109,6 @@ if (flag || fastTreeSet === undefined) {
if (node.parent.left === node) return node.parent.key;
node = node.parent; // node.parent.right === node is true;
}
throw new Error("don't find a key meet the conditions");
}
popFirst(): T {
@@ -135,12 +128,12 @@ if (flag || fastTreeSet === undefined) {
return value as T;
}
values(): IterableIterator<T> {
let _this = this._constitute;
let i = 0;
let data = this._constitute;
let count = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].value as T : undefined;
var done = count >= data.memberNumber;
var value = !done ? data.keyValueArray[count++].value as T : undefined;
return {
done: done,
value: value,
@@ -150,19 +143,19 @@ if (flag || fastTreeSet === undefined) {
}
forEach(callbackfn: (value?: T, key?: T, set?: TreeSet<T>) => void,
thisArg?: Object): void {
let _this = this._constitute;
let tagetArray = _this.keyValueArray;
for (let i = 0; i < _this.memberNumber; i++) {
let data = this._constitute;
let tagetArray = data.keyValueArray;
for (let i = 0; i < data.memberNumber; i++) {
callbackfn.call(thisArg, tagetArray[i].value as T, tagetArray[i].key);
}
}
entries(): IterableIterator<[T, T]> {
let _this = this._constitute;
let i = 0;
let data = this._constitute;
let count = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].entry() : undefined;
var done = count >= data.memberNumber;
var value = !done ? data.keyValueArray[count++].entry() : undefined;
return {
done: done,
value: value,
@@ -171,12 +164,12 @@ if (flag || fastTreeSet === undefined) {
};
}
[Symbol.iterator](): IterableIterator<T> {
let _this = this._constitute;
let i = 0;
let data = this._constitute;
let count = 0;
return {
next: function () {
var done = i >= _this.memberNumber;
var value = !done ? _this.keyValueArray[i++].key : undefined;
var done = count >= data.memberNumber;
var value = !done ? data.keyValueArray[count++].key : undefined;
return {
done: done,
value: value,
@@ -185,10 +178,10 @@ if (flag || fastTreeSet === undefined) {
};
}
}
Object.freeze(TreeSet);
fastTreeSet = TreeSet;
}
export default {
TreeSet: fastTreeSet,
};