1/* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16declare function requireNapi(s: string): any; 17 18let flag = false; 19let fastHashSet = undefined; 20let arkPritvate = globalThis["ArkPrivate"] || undefined; 21if (arkPritvate !== undefined) { 22 fastHashSet = arkPritvate.Load(arkPritvate.HashSet); 23} else { 24 flag = true; 25} 26 27if (flag || fastHashSet === undefined) { 28 const HashSetAbility = requireNapi("util.struct"); 29 interface IterableIterator<T> { 30 next: () => { 31 value: T | undefined; 32 done: boolean; 33 }; 34 } 35 class HandlerHashSet<T> { 36 set(target: HashSet<T>, p: any, value: any): boolean { 37 if (p in target) { 38 target[p] = value; 39 return true; 40 } 41 return false; 42 } 43 defineProperty(target: HashSet<T>, p: any): boolean { 44 throw new Error("Can't define Property on HashSet Object"); 45 } 46 deleteProperty(target: HashSet<T>, p: any): boolean { 47 throw new Error("Can't delete Property on HashSet Object"); 48 } 49 setPrototypeOf(target: HashSet<T>, p: any): boolean { 50 throw new Error("Can't set Prototype on HashSet Object"); 51 } 52 } 53 class HashSet<T> extends HashSetAbility.DictionaryClass<T, T> { 54 constructor() { 55 super(); 56 return new Proxy(this, new HandlerHashSet()); 57 } 58 get length() { 59 return this.memberNumber; 60 } 61 isEmpty(): boolean { 62 return this.memberNumber === 0; 63 } 64 has(value: T): boolean { 65 return this.hasKey(value); 66 } 67 add(value: T): boolean { 68 if (this.has(value)) return false; 69 return this.put(value); 70 } 71 remove(value: T): boolean { 72 if (this.removeMember(value) !== undefined) return true; 73 return false; 74 } 75 clear(): void { 76 super.clear(); 77 } 78 forEach(callbackfn: (value?: T, key?: T, set?: HashSet<T>) => void, 79 thisArg?: Object): void { 80 let tagetArray = this.keyValueArray; 81 for (let i = 0; i < tagetArray.length; i++) { 82 callbackfn.call(thisArg, tagetArray[i].key, tagetArray[i].key, this); 83 } 84 } 85 values(): IterableIterator<T> { 86 let data = this; 87 let count = 0; 88 return { 89 next: function () { 90 let done = count >= data.memberNumber; 91 let value = !done ? data.keyValueArray[count].key : undefined; 92 count++; 93 return { 94 done: done, 95 value: value, 96 }; 97 }, 98 }; 99 } 100 entries(): IterableIterator<[T, T]> { 101 let data = this; 102 let count = 0; 103 return { 104 next: function () { 105 let done = count >= data.memberNumber; 106 let value = !done ? data.keyValueArray[count].entry() : undefined; 107 count++; 108 return { 109 done: done, 110 value: value, 111 }; 112 }, 113 }; 114 } 115 [Symbol.iterator](): IterableIterator<T> { 116 let data = this; 117 let count = 0; 118 return { 119 next: function () { 120 let done = count >= data.memberNumber; 121 let value = !done ? data.keyValueArray[count].key : undefined; 122 count++; 123 return { 124 done: done, 125 value: value, 126 }; 127 }, 128 }; 129 } 130 } 131 Object.freeze(HashSet); 132 fastHashSet = HashSet; 133} 134export default fastHashSet;