• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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