mirror of
https://github.com/openharmony/js_util_module.git
synced 2026-07-19 18:23:35 -04:00
!80 modified TS associative container
Merge pull request !80 from wangyong/association_container
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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 "";
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user