5#ifndef V8_OBJECTS_ORDERED_HASH_TABLE_H_
6#define V8_OBJECTS_ORDERED_HASH_TABLE_H_
66template <
class Derived,
int entrysize>
71 template <
template <
typename>
typename HandleType>
74 Isolate* isolate, HandleType<Derived> table);
78 template <
template <
typename>
typename HandleType>
81 HandleType<Derived> table);
212 Isolate* isolate,
int capacity,
219 template <
template <
typename>
typename HandleType>
221 static HandleType<Derived>::MaybeType
Rehash(
Isolate* isolate,
222 HandleType<Derived> table);
223 template <
template <
typename>
typename HandleType>
225 static HandleType<Derived>::MaybeType
Rehash(
Isolate* isolate,
226 HandleType<Derived> table,
242 return next_entry_int;
287 template <
template <
typename>
typename HandleType>
288 requires(std::is_convertible_v<HandleType<OrderedHashSet>,
290 static HandleType<OrderedHashSet>::MaybeType Add(
291 Isolate* isolate, HandleType<OrderedHashSet> table,
296 template <
template <
typename>
typename HandleType>
297 requires(std::is_convertible_v<HandleType<OrderedHashSet>,
299 static HandleType<OrderedHashSet>::MaybeType Rehash(
300 Isolate* isolate, HandleType<OrderedHashSet> table);
301 template <
template <
typename>
typename HandleType>
302 requires(std::is_convertible_v<HandleType<OrderedHashSet>,
304 static HandleType<OrderedHashSet>::MaybeType Rehash(
305 Isolate* isolate, HandleType<OrderedHashSet> table,
int new_capacity);
307 template <
typename IsolateT>
309 IsolateT* isolate,
int capacity,
318 static const int kPrefixSize = 0;
335 template <
typename IsolateT>
337 IsolateT* isolate,
int capacity,
343 template <
template <
typename>
typename HandleType>
344 requires(std::is_convertible_v<HandleType<OrderedHashMap>,
346 static HandleType<OrderedHashMap>::MaybeType Rehash(
347 Isolate* isolate, HandleType<OrderedHashMap> table);
348 template <
template <
typename>
typename HandleType>
349 requires(std::is_convertible_v<HandleType<OrderedHashMap>,
351 static HandleType<OrderedHashMap>::MaybeType Rehash(
352 Isolate* isolate, HandleType<OrderedHashMap> table,
int new_capacity);
360 static Address GetHash(
Isolate* isolate, Address raw_key);
366 static const int kValueOffset = 1;
367 static const int kPrefixSize = 0;
417template <
class Derived>
430 Isolate* isolate,
int capacity,
450 class BodyDescriptor;
460 int chain_table_size = capacity;
462 hash_table_size + chain_table_size;
488 return nof_deleted_elements;
560 int hash_table_size = nof_buckets;
566 DCHECK_GE(
static_cast<unsigned>(next_entry), 0);
626 return capacity * Derived::kEntrySize *
kTaggedSize;
645 int offset_in_datatable = entry * Derived::kEntrySize *
kTaggedSize;
646 int offset_in_entry = relative_index *
kTaggedSize;
704 static const
int kValueIndex = 1;
736template <class SmallTable, class LargeTable>
748 static const int OrderedHashTableMinSize =
753 OrderedHashTableHandler<SmallOrderedHashMap, OrderedHashMap>;
756 :
public OrderedHashTableHandler<SmallOrderedHashMap, OrderedHashMap> {
766 OrderedHashTableHandler<SmallOrderedHashSet, OrderedHashSet>;
769 :
public OrderedHashTableHandler<SmallOrderedHashSet, OrderedHashSet> {
792 template <
typename IsolateT>
800 template <
typename IsolateT>
810 Isolate* isolate,
int capacity,
816 template <
template <
typename>
typename HandleType>
817 requires(std::is_convertible_v<HandleType<OrderedNameDictionary>,
819 static HandleType<OrderedNameDictionary>::MaybeType
Rehash(
820 Isolate* isolate, HandleType<OrderedNameDictionary> table,
838 inline void SetHash(
int hash);
845 static const int kValueOffset = 1;
846 static const int kPropertyDetailsOffset = 2;
849 static constexpr int HashIndex() {
return PrefixIndex(); }
851 static const bool kIsOrderedDictionaryType =
true;
855 OrderedHashTableHandler<SmallOrderedNameDictionary, OrderedNameDictionary>;
931 inline void SetHash(
int hash);
934 static const int kKeyIndex = 0;
935 static const int kValueIndex = 1;
936 static const int kPropertyDetailsIndex = 2;
937 static const int kEntrySize = 3;
938 static const int kPrefixSize = 1;
static constexpr int kMaxLength
static constexpr int kHeaderSize
Address field_address(size_t offset) const
T ReadField(size_t offset) const
void WriteField(size_t offset, T value) const
constexpr int as_int() const
static Handle< Map > GetMap(RootsTable &roots)
static constexpr int NextTableIndex()
void SetNumberOfDeletedElements(int num)
int RemovedIndexAt(int index)
int NumberOfBuckets() const
static const int kEntrySizeWithoutChain
static constexpr int MaxCapacity()
static const int kEntrySize
static HandleType< Derived > Shrink(Isolate *isolate, HandleType< Derived > table)
static MaybeHandle< Derived > Allocate(Isolate *isolate, int capacity, AllocationType allocation=AllocationType::kYoung)
int NextChainEntryRaw(int entry)
int NumberOfDeletedElements() const
Tagged< Object > KeyAt(InternalIndex entry)
static const int kNotFound
Tagged< Derived > NextTable()
void SetNextTable(Tagged< Derived > next_table)
bool ToKey(ReadOnlyRoots roots, InternalIndex entry, Tagged< Object > *out_key)
static constexpr int NextTableOffset()
int EntryToIndexRaw(int entry)
static constexpr int RemovedHolesIndex()
static Handle< Derived > Clear(Isolate *isolate, Handle< Derived > table)
int NumberOfElements() const
static bool IsKey(ReadOnlyRoots roots, Tagged< Object > k)
void SetNumberOfElements(int num)
void SetRemovedIndexAt(int index, int removed_index)
static constexpr int NumberOfBucketsOffset()
static HandleType< Derived >::MaybeType EnsureCapacityForAdding(Isolate *isolate, HandleType< Derived > table)
int EntryToIndex(InternalIndex entry)
static constexpr int HashTableStartIndex()
static HandleType< Derived >::MaybeType Rehash(Isolate *isolate, HandleType< Derived > table)
int HashToEntryRaw(int hash)
static const int kInitialCapacity
static constexpr int HashTableStartOffset()
static MaybeHandle< Derived > AllocateEmpty(Isolate *isolate, AllocationType allocation, RootIndex root_ndex)
static constexpr int NumberOfElementsIndex()
static const int kClearedTableSentinel
InternalIndex::Range IterateEntries()
int HashToBucket(int hash)
static bool HasKey(Isolate *isolate, Tagged< Derived > table, Tagged< Object > key)
static constexpr int NumberOfElementsOffset()
InternalIndex FindEntry(Isolate *isolate, Tagged< Object > key)
static constexpr int NumberOfDeletedElementsIndex()
static bool Delete(Isolate *isolate, Tagged< Derived > table, Tagged< Object > key)
void SetNumberOfBuckets(int num)
static constexpr int NumberOfDeletedElementsOffset()
static const int kLoadFactor
static const int kChainOffset
static constexpr int NumberOfBucketsIndex()
static constexpr int PrefixIndex()
static Tagged< HeapObject > GetEmpty(ReadOnlyRoots ro_roots)
InternalIndex FindEntry(IsolateT *isolate, DirectHandle< Object > key)
static constexpr int HashIndex()
static DirectHandle< Map > GetMap(RootsTable &roots)
static V8_EXPORT_PRIVATE MaybeHandle< SmallOrderedHashSet > Add(Isolate *isolate, Handle< SmallOrderedHashSet > table, DirectHandle< Object > key)
V8_EXPORT_PRIVATE bool HasKey(Isolate *isolate, DirectHandle< Object > key)
static Handle< SmallOrderedHashSet > Rehash(Isolate *isolate, Handle< SmallOrderedHashSet > table, int new_capacity)
static const int kPrefixSize
static const int kEntrySize
static const int kKeyIndex
static V8_EXPORT_PRIVATE bool Delete(Isolate *isolate, Tagged< SmallOrderedHashSet > table, Tagged< Object > key)
static bool Is(DirectHandle< HeapObject > table)
friend class OrderedHashSetHandler
static int SizeFor(int capacity)
static constexpr Offset NumberOfBucketsOffset()
V8_INLINE Tagged< Object > GetDataEntry(int entry, int relative_index)
int GetNextEntry(int entry) const
static bool Delete(Isolate *isolate, Tagged< Derived > table, Tagged< Object > key)
int NumberOfBuckets() const
V8_INLINE Tagged< Object > KeyAt(InternalIndex entry) const
static constexpr Offset PrefixOffset()
void SetFirstEntry(int bucket, uint8_t value)
static const int kMaxCapacity
int GetFirstEntry(int bucket) const
Address GetHashTableStartAddress(int capacity) const
void SetDataEntry(int entry, int relative_index, Tagged< Object > value)
static const int kLoadFactor
void SetNumberOfDeletedElements(int num)
static Handle< Derived > Rehash(Isolate *isolate, Handle< Derived > table, int new_capacity)
static constexpr size_t PaddingSize()
static constexpr Offset DataTableStartOffset()
Offset GetBucketsStartOffset() const
bool HasKey(Isolate *isolate, DirectHandle< Object > key)
InternalIndex FindEntry(Isolate *isolate, Tagged< Object > key)
int HashToFirstEntry(int hash) const
int NumberOfDeletedElements() const
void SetNextEntry(int entry, int next_entry)
friend class OrderedHashMapHandler
static constexpr Offset PaddingOffset()
Offset GetChainTableOffset() const
void SetNumberOfElements(int num)
int NumberOfElements() const
Offset GetDataEntryOffset(int entry, int relative_index) const
void SetNumberOfBuckets(int num)
InternalIndex::Range IterateEntries()
static MaybeHandle< Derived > Grow(Isolate *isolate, Handle< Derived > table)
static Handle< Derived > Allocate(Isolate *isolate, int capacity, AllocationType allocation=AllocationType::kYoung)
friend class OrderedNameDictionaryHandler
uint8_t getByte(Offset offset, ByteIndex index) const
static constexpr int DataTableSizeFor(int capacity)
int HashToBucket(int hash) const
static Handle< Derived > Shrink(Isolate *isolate, Handle< Derived > table)
static const uint8_t kNotFound
static const int kGrowthHack
static const int kMinCapacity
void Initialize(Isolate *isolate, int capacity)
void setByte(Offset offset, ByteIndex index, uint8_t value)
OBJECT_CONSTRUCTORS(SmallOrderedHashTable, HeapObject)
static constexpr Offset NumberOfElementsOffset()
static constexpr Offset NumberOfDeletedElementsOffset()
OBJECT_CONSTRUCTORS(SmallOrderedNameDictionary, SmallOrderedHashTable< SmallOrderedNameDictionary >)
static constexpr int ToInt(const Tagged< Object > object)
static constexpr Tagged< Smi > FromInt(int value)
void set(int index, Tagged< ElementT > value, WriteBarrierMode mode=kDefaultMode)
static constexpr int OffsetOfElementAt(int index)
Tagged< ElementT > get(int index) const
#define EXPORT_TEMPLATE_DECLARE(export)
constexpr int kSmallOrderedHashMapMinCapacity
constexpr int kTaggedSize
bool Is(IndirectHandle< U > value)
constexpr int kOneByteSize
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
constexpr int kSmallOrderedHashSetMinCapacity
static uint32_t Hash(RegisteredExtension *extension)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DECL_VERIFIER(Name)
#define DECL_PRINTER(Name)
#define OBJECT_CONSTRUCTORS(Type,...)
#define EXPORT_DECL_VERIFIER(Name)
#define DCHECK_LE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
constexpr T RoundUp(T x, intptr_t m)
#define V8_EXPORT_PRIVATE
std::unique_ptr< ValueMirror > key