1/* 2 * Copyright (c) 2021 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_TEMPLATE_MAP_H 17#define ECMASCRIPT_TEMPLATE_MAP_H 18 19#include "ecmascript/js_array.h" 20#include "ecmascript/tagged_hash_table.h" 21 22namespace panda::ecmascript { 23class TemplateMap : public TaggedHashTable<TemplateMap> { 24public: 25 using HashTable = TaggedHashTable<TemplateMap>; 26 static inline bool IsMatch(const JSTaggedValue &key, const JSTaggedValue &other) 27 { 28 return key == other; 29 } 30 static inline int Hash(const JSTaggedValue &obj) 31 { 32 ASSERT(obj.IsJSArray()); 33 JSArray *array = JSArray::Cast(obj.GetTaggedObject()); 34 uint32_t len = array->GetArrayLength(); 35 return len; 36 } 37 inline static int GetKeyIndex(int entry) 38 { 39 return HashTable::TABLE_HEADER_SIZE + entry * GetEntrySize() + ENTRY_KEY_INDEX; 40 } 41 inline static int GetValueIndex(int entry) 42 { 43 return HashTable::TABLE_HEADER_SIZE + entry * GetEntrySize() + ENTRY_VALUE_INDEX; 44 } 45 inline static int GetEntryIndex(int entry) 46 { 47 return HashTable::TABLE_HEADER_SIZE + entry * GetEntrySize(); 48 } 49 inline static int GetEntrySize() 50 { 51 return ENTRY_SIZE; 52 } 53 static TemplateMap *Cast(TaggedObject *object) 54 { 55 return reinterpret_cast<TemplateMap *>(object); 56 } 57 static const int DEFAULT_ELEMENTS_NUMBER = 16; 58 static JSHandle<TemplateMap> Create(JSThread *thread, int numberOfElements = DEFAULT_ELEMENTS_NUMBER) 59 { 60 return HashTable::Create(thread, numberOfElements); 61 } 62 static int ComputeCompactSize([[maybe_unused]] const JSHandle<TemplateMap> &table, int computeHashTableSize, 63 [[maybe_unused]] int tableSize, [[maybe_unused]] int addedElements) 64 { 65 return computeHashTableSize; 66 } 67 static const int ENTRY_SIZE = 2; 68 static const int ENTRY_KEY_INDEX = 0; 69 static const int ENTRY_VALUE_INDEX = 1; 70}; 71} // namespace panda::ecmascript 72#endif // ECMASCRIPT_TEMPLATE_MAP_H