1/*
2 * Copyright (c) 2021-2023 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
16#ifndef ECMASCRIPT_DFX_HPROF_STRING_HASHMAP_H
17#define ECMASCRIPT_DFX_HPROF_STRING_HASHMAP_H
18
19#include "ecmascript/ecma_vm.h"
20#include "ecmascript/mem/c_containers.h"
21#include "ecmascript/mem/c_string.h"
22
23namespace panda::ecmascript {
24using StringKey = uint64_t;
25using StringId = uint64_t;
26
27// An Implementation for Native StringTable without Auto Mem-Management
28// To make sure when using String, it still stays where it was.
29class StringHashMap {
30public:
31    explicit StringHashMap(const EcmaVM *vm) : vm_(vm)
32    {
33        ASSERT(vm_ != nullptr);
34    }
35    ~StringHashMap()
36    {
37        Clear();
38    }
39    NO_MOVE_SEMANTIC(StringHashMap);
40    NO_COPY_SEMANTIC(StringHashMap);
41    /*
42     * The ID is the seat number in JSON file Range from 0~string_table_.size()
43     */
44    StringId GetStringId(const CString *cstr) const;
45    /*
46     * Get all keys sorted by insert order
47     */
48    const CVector<StringKey> &GetOrderedKeyStorage() const
49    {
50        return orderedKey_;
51    }
52    /*
53     * Get string by its hash key
54     */
55    CString *GetStringByKey(StringKey key) const;
56    std::pair<uint64_t, CString *> GetStringAndIdPair(StringKey key) const;
57    StringId InsertStrAndGetStringId(const CString &cstrArg);
58    size_t GetCapcity() const
59    {
60        ASSERT(orderedKey_.size() == hashmap_.size());
61        return orderedKey_.size();
62    }
63    /*
64     * For external call to use this StringTable
65     */
66    CString *GetString(const CString &cstr);
67
68private:
69    StringKey GenerateStringKey(const CString *cstr) const;
70    CString *FindOrInsertString(const CString *cstr);
71    /*
72     * Free all memory
73     */
74    void Clear();
75    const EcmaVM *vm_;
76    CVector<StringKey> orderedKey_;  // Used for Serialize Order
77    size_t index_ {2};  // 2: Offset the String-Table Header
78    CUnorderedMap<StringKey, StringId> indexMap_;
79    CUnorderedMap<StringKey, CString *> hashmap_;
80};
81}  // namespace panda::ecmascript
82#endif  // ECMASCRIPT_DFX_HPROF_STRING_HASHMAP_H
83