• 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 */
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;