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 */ 15declare function requireNapi(s: string): any; 16 17let flag = false; 18let fastTreeMap = undefined; 19let arkPritvate = globalThis["ArkPrivate"] || undefined; 20if (arkPritvate !== undefined) { 21 fastTreeMap = arkPritvate.Load(arkPritvate.TreeMap); 22} else { 23 flag = true; 24} 25 26if (flag || fastTreeMap === undefined) { 27 const RBTreeAbility = requireNapi("util.struct") 28 interface IterableIterator<T> { 29 next: () => { 30 value: T | undefined; 31 done: boolean; 32 }; 33 } 34 class HandlerTreeMap<K, V> { 35 set(target: TreeMap<K, V>, p: any, value: any): boolean { 36 if (p in target) { 37 target[p] = value; 38 return true; 39 } 40 return false; 41 } 42 defineProperty(target: TreeMap<K, V>, p: any): boolean { 43 throw new Error("Can't define Property on TreeMap Object"); 44 } 45 deleteProperty(target: TreeMap<K, V>, p: any): boolean { 46 throw new Error("Can't delete Property on TreeMap Object"); 47 } 48 setPrototypeOf(target: TreeMap<K, V>, p: any): boolean { 49 throw new Error("Can't set Prototype on TreeMap Object"); 50 } 51 } 52 class TreeMap<K, V> { 53 private constitute: any; 54 constructor(comparator?: (firstValue: K, secondValue: K) => boolean) { 55 this.constitute = new RBTreeAbility.RBTreeClass(comparator); 56 return new Proxy(this, new HandlerTreeMap()); 57 } 58 get length() { 59 return this.constitute.memberNumber; 60 } 61 isEmpty() { 62 return this.constitute.memberNumber === 0; 63 } 64 hasKey(key: K): boolean { 65 return this.constitute.getNode(key) !== undefined; 66 } 67 hasValue(value: V): boolean { 68 return this.constitute.findNode(value) !== undefined; 69 } 70 get(key: K): V { 71 let tempNode = this.constitute.getNode(key); 72 if (tempNode === undefined) return tempNode; 73 return tempNode.value; 74 } 75 getFirstKey(): K { 76 let tempNode = this.constitute.firstNode(); 77 if (tempNode === undefined) 78 return tempNode; 79 return tempNode.key; 80 } 81 getLastKey(): K { 82 let tempNode = this.constitute.lastNode(); 83 if (tempNode === undefined) 84 return tempNode; 85 return tempNode.key; 86 } 87 setAll(map: TreeMap<K, V>) { 88 this.constitute.setAll(map.constitute); 89 } 90 set(key: K, value: V): Object { 91 return this.constitute.addNode(key, value); 92 } 93 remove(key: K): V { 94 return this.constitute.removeNode(key); 95 } 96 clear() { 97 this.constitute.clearTree(); 98 } 99 getLowerKey(key: K): K { 100 let result: any = undefined; 101 let tempNode = this.constitute.getNode(key); 102 if (tempNode === undefined) return tempNode; 103 if (tempNode.left !== undefined) return tempNode.left.key; 104 let node = tempNode; 105 while (node.parent !== undefined) { 106 if (node.parent.right === node) return node.parent.key; 107 node = node.parent; 108 } 109 return result; 110 } 111 getHigherKey(key: K): K { 112 let result: any = undefined; 113 let tempNode = this.constitute.getNode(key); 114 if (tempNode === undefined) return tempNode; 115 if (tempNode.right !== undefined) return tempNode.right.key; 116 let node = tempNode; 117 while (node.parent !== undefined) { 118 if (node.parent.left === node) return node.parent.key; 119 node = node.parent; 120 } 121 return result; 122 } 123 keys(): IterableIterator<K> { 124 let data = this.constitute; 125 let count = 0; 126 return { 127 next: function () { 128 let done = count >= data.memberNumber; 129 let value = !done ? data.keyValueArray[count].key : undefined; 130 count++; 131 return { 132 done: done, 133 value: value, 134 }; 135 }, 136 }; 137 } 138 values(): IterableIterator<V> { 139 let data = this.constitute; 140 let count = 0; 141 return { 142 next: function () { 143 let done = count >= data.memberNumber; 144 let value = !done ? data.keyValueArray[count].value : undefined; 145 count++; 146 return { 147 done: done, 148 value: value, 149 }; 150 }, 151 }; 152 } 153 replace(key: K, newValue: V): boolean { 154 let targetNode = this.constitute.getNode(key); 155 if (targetNode === undefined) return false; 156 targetNode.value = newValue; 157 return true; 158 } 159 forEach(callbackfn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, 160 thisArg?: Object): void { 161 let data = this.constitute; 162 let tagetArray = data.keyValueArray; 163 for (let i = 0; i < data.memberNumber; i++) { 164 callbackfn.call(thisArg, tagetArray[i].value as V, tagetArray[i].key); 165 } 166 } 167 entries(): IterableIterator<[K, V]> { 168 let data = this.constitute; 169 let count = 0; 170 return { 171 next: function () { 172 let done = count >= data.memberNumber; 173 let value = !done ? data.keyValueArray[count].entry() : undefined; 174 count++; 175 return { 176 done: done, 177 value: value, 178 }; 179 }, 180 }; 181 } 182 [Symbol.iterator](): IterableIterator<[K, V]> { 183 let data = this.constitute; 184 let count = 0; 185 return { 186 next: function () { 187 let done = count >= data.memberNumber; 188 let value = !done ? data.keyValueArray[count].entry() : undefined; 189 count++; 190 return { 191 done: done, 192 value: value, 193 }; 194 }, 195 }; 196 } 197 } 198 Object.freeze(TreeMap); 199 fastTreeMap = TreeMap; 200} 201export default fastTreeMap; 202