14d6c458bSopenharmony_ci/*
24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License.
54d6c458bSopenharmony_ci * You may obtain a copy of the License at
64d6c458bSopenharmony_ci *
74d6c458bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84d6c458bSopenharmony_ci *
94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and
134d6c458bSopenharmony_ci * limitations under the License.
144d6c458bSopenharmony_ci */
154d6c458bSopenharmony_cideclare function requireNapi(s: string): any;
164d6c458bSopenharmony_ciinterface ArkPrivate {
174d6c458bSopenharmony_ci  HashMap: number;
184d6c458bSopenharmony_ci  Load(key: number): Object;
194d6c458bSopenharmony_ci}
204d6c458bSopenharmony_cilet flag: boolean = false;
214d6c458bSopenharmony_cilet fastHashMap: Object = undefined;
224d6c458bSopenharmony_cilet arkPritvate: ArkPrivate = globalThis.ArkPrivate || undefined;
234d6c458bSopenharmony_ciif (arkPritvate !== undefined) {
244d6c458bSopenharmony_ci  fastHashMap = arkPritvate.Load(arkPritvate.HashMap);
254d6c458bSopenharmony_ci} else {
264d6c458bSopenharmony_ci  flag = true;
274d6c458bSopenharmony_ci}
284d6c458bSopenharmony_ciif (flag || fastHashMap === undefined) {
294d6c458bSopenharmony_ci  let hashMapAbility: any = requireNapi('util.struct');
304d6c458bSopenharmony_ci  const errorUtil = hashMapAbility.errorUtil;
314d6c458bSopenharmony_ci  interface IterableIterator<T> {
324d6c458bSopenharmony_ci    next: () => {
334d6c458bSopenharmony_ci      value: T | undefined;
344d6c458bSopenharmony_ci      done: boolean;
354d6c458bSopenharmony_ci    };
364d6c458bSopenharmony_ci  }
374d6c458bSopenharmony_ci  class HandlerHashMap<K, V> {
384d6c458bSopenharmony_ci    set(target: HashMap<K, V>, p: string, value: string): boolean {
394d6c458bSopenharmony_ci      if (p in target) {
404d6c458bSopenharmony_ci        target[p] = value;
414d6c458bSopenharmony_ci        return true;
424d6c458bSopenharmony_ci      }
434d6c458bSopenharmony_ci      return false;
444d6c458bSopenharmony_ci    }
454d6c458bSopenharmony_ci    defineProperty(): boolean {
464d6c458bSopenharmony_ci      throw new Error(`Can't define Property on HashMap Object`);
474d6c458bSopenharmony_ci    }
484d6c458bSopenharmony_ci    deleteProperty(): boolean {
494d6c458bSopenharmony_ci      throw new Error(`Can't delete Property on HashMap Object`);
504d6c458bSopenharmony_ci    }
514d6c458bSopenharmony_ci    setPrototypeOf(): boolean {
524d6c458bSopenharmony_ci      throw new Error(`Can't set Prototype on HashMap Object`);
534d6c458bSopenharmony_ci    }
544d6c458bSopenharmony_ci  }
554d6c458bSopenharmony_ci  class HashMap<K, V> extends hashMapAbility.DictionaryClass<K, V> {
564d6c458bSopenharmony_ci    constructor() {
574d6c458bSopenharmony_ci      errorUtil.checkNewTargetIsNullError('HashMap', !new.target);
584d6c458bSopenharmony_ci      super();
594d6c458bSopenharmony_ci      return new Proxy(this, new HandlerHashMap());
604d6c458bSopenharmony_ci    }
614d6c458bSopenharmony_ci    get length(): number {
624d6c458bSopenharmony_ci      return this.memberNumber;
634d6c458bSopenharmony_ci    }
644d6c458bSopenharmony_ci    isEmpty(): boolean {
654d6c458bSopenharmony_ci      errorUtil.checkBindError('isEmpty', HashMap, this);
664d6c458bSopenharmony_ci      return this.memberNumber === 0;
674d6c458bSopenharmony_ci    }
684d6c458bSopenharmony_ci    hasKey(key: K): boolean {
694d6c458bSopenharmony_ci      errorUtil.checkBindError('hasKey', HashMap, this);
704d6c458bSopenharmony_ci      return super.hasKey(key);
714d6c458bSopenharmony_ci    }
724d6c458bSopenharmony_ci    hasValue(value: V): boolean {
734d6c458bSopenharmony_ci      errorUtil.checkBindError('hasValue', HashMap, this);
744d6c458bSopenharmony_ci      return super.values().indexOf(value) > -1;
754d6c458bSopenharmony_ci    }
764d6c458bSopenharmony_ci    get(key: K): V {
774d6c458bSopenharmony_ci      errorUtil.checkBindError('get', HashMap, this);
784d6c458bSopenharmony_ci      return this.getValueByKey(key);
794d6c458bSopenharmony_ci    }
804d6c458bSopenharmony_ci    setAll(map: HashMap<K, V>): void {
814d6c458bSopenharmony_ci      errorUtil.checkBindError('setAll', HashMap, this);
824d6c458bSopenharmony_ci      errorUtil.checkTypeError('map', 'HashMap', map);
834d6c458bSopenharmony_ci      let memebers: Array<HashMap<K, V>> = [];
844d6c458bSopenharmony_ci      memebers = map.keyValueArray;
854d6c458bSopenharmony_ci      for (let i: number = 0; i < memebers.length; i++) {
864d6c458bSopenharmony_ci        this.put(memebers[i].key, memebers[i].value);
874d6c458bSopenharmony_ci      }
884d6c458bSopenharmony_ci    }
894d6c458bSopenharmony_ci    set(key: K, value: V): Object {
904d6c458bSopenharmony_ci      errorUtil.checkBindError('set', HashMap, this);
914d6c458bSopenharmony_ci      return super.put(key, value);
924d6c458bSopenharmony_ci    }
934d6c458bSopenharmony_ci    remove(key: K): V {
944d6c458bSopenharmony_ci      errorUtil.checkBindError('remove', HashMap, this);
954d6c458bSopenharmony_ci      let result: V = this.removeMember(key);
964d6c458bSopenharmony_ci      return result;
974d6c458bSopenharmony_ci    }
984d6c458bSopenharmony_ci    clear(): void {
994d6c458bSopenharmony_ci      errorUtil.checkBindError('clear', HashMap, this);
1004d6c458bSopenharmony_ci      super.clear();
1014d6c458bSopenharmony_ci    }
1024d6c458bSopenharmony_ci    keys(): IterableIterator<K> {
1034d6c458bSopenharmony_ci      errorUtil.checkBindError('keys', HashMap, this);
1044d6c458bSopenharmony_ci      let count: number = 0;
1054d6c458bSopenharmony_ci      return {
1064d6c458bSopenharmony_ci        next: function (): { done: boolean, value: K } {
1074d6c458bSopenharmony_ci          let done: boolean = false;
1084d6c458bSopenharmony_ci          let value: K = undefined;
1094d6c458bSopenharmony_ci          done = count >= this.memberNumber;
1104d6c458bSopenharmony_ci          value = done ? undefined : this.keyValueArray[count].key;
1114d6c458bSopenharmony_ci          count++;
1124d6c458bSopenharmony_ci          return {
1134d6c458bSopenharmony_ci            done: done,
1144d6c458bSopenharmony_ci            value: value,
1154d6c458bSopenharmony_ci          };
1164d6c458bSopenharmony_ci        },
1174d6c458bSopenharmony_ci      };
1184d6c458bSopenharmony_ci    }
1194d6c458bSopenharmony_ci    values(): IterableIterator<V> {
1204d6c458bSopenharmony_ci      errorUtil.checkBindError('values', HashMap, this);
1214d6c458bSopenharmony_ci      let count: number = 0;
1224d6c458bSopenharmony_ci      return {
1234d6c458bSopenharmony_ci        next: function (): { done: boolean, value: V } {
1244d6c458bSopenharmony_ci          let done: boolean = false;
1254d6c458bSopenharmony_ci          let value: V = undefined;
1264d6c458bSopenharmony_ci          done = count >= this.memberNumber;
1274d6c458bSopenharmony_ci          value = done ? undefined : this.keyValueArray[count].value;
1284d6c458bSopenharmony_ci          count++;
1294d6c458bSopenharmony_ci          return {
1304d6c458bSopenharmony_ci            done: done,
1314d6c458bSopenharmony_ci            value: value,
1324d6c458bSopenharmony_ci          };
1334d6c458bSopenharmony_ci        },
1344d6c458bSopenharmony_ci      };
1354d6c458bSopenharmony_ci    }
1364d6c458bSopenharmony_ci    replace(key: K, newValue: V): boolean {
1374d6c458bSopenharmony_ci      errorUtil.checkBindError('replace', HashMap, this);
1384d6c458bSopenharmony_ci      return super.replaceMember(key, newValue);
1394d6c458bSopenharmony_ci    }
1404d6c458bSopenharmony_ci    forEach(callbackfn: (value?: V, key?: K, map?: HashMap<K, V>) => void,
1414d6c458bSopenharmony_ci      thisArg?: Object): void {
1424d6c458bSopenharmony_ci      errorUtil.checkBindError('forEach', HashMap, this);
1434d6c458bSopenharmony_ci      errorUtil.checkTypeError('callbackfn', 'callable', callbackfn);
1444d6c458bSopenharmony_ci      let tagetArray: Array<HashMap<K, V>> = [];
1454d6c458bSopenharmony_ci      tagetArray = this.keyValueArray;
1464d6c458bSopenharmony_ci      for (let i: number = 0; i < tagetArray.length; i++) {
1474d6c458bSopenharmony_ci        callbackfn.call(thisArg, tagetArray[i].value, tagetArray[i].key, this);
1484d6c458bSopenharmony_ci      }
1494d6c458bSopenharmony_ci    }
1504d6c458bSopenharmony_ci    entries(): IterableIterator<[K, V]> {
1514d6c458bSopenharmony_ci      errorUtil.checkBindError('entries', HashMap, this);
1524d6c458bSopenharmony_ci      let count: number = 0;
1534d6c458bSopenharmony_ci      return {
1544d6c458bSopenharmony_ci        next: function (): { done: boolean, value: [K, V] } {
1554d6c458bSopenharmony_ci          let done: boolean = false;
1564d6c458bSopenharmony_ci          let value: [K, V] = undefined;
1574d6c458bSopenharmony_ci          done = count >= this.memberNumber;
1584d6c458bSopenharmony_ci          value = done ? undefined : this.keyValueArray[count].entry();
1594d6c458bSopenharmony_ci          count++;
1604d6c458bSopenharmony_ci          return {
1614d6c458bSopenharmony_ci            done: done,
1624d6c458bSopenharmony_ci            value: value,
1634d6c458bSopenharmony_ci          };
1644d6c458bSopenharmony_ci        },
1654d6c458bSopenharmony_ci      };
1664d6c458bSopenharmony_ci    }
1674d6c458bSopenharmony_ci    [Symbol.iterator](): IterableIterator<[K, V]> {
1684d6c458bSopenharmony_ci      errorUtil.checkBindError('Symbol.iterator', HashMap, this);
1694d6c458bSopenharmony_ci      return this.entries();
1704d6c458bSopenharmony_ci    }
1714d6c458bSopenharmony_ci  }
1724d6c458bSopenharmony_ci  Object.freeze(HashMap);
1734d6c458bSopenharmony_ci  fastHashMap = HashMap;
1744d6c458bSopenharmony_ci}
1754d6c458bSopenharmony_ciexport default fastHashMap;
176