/* * Copyright (c) 2025, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace JS::Bytecode { struct PropertyKeyTableIndex { static constexpr u32 invalid = 0xffffffffu; bool is_valid() const { return value != invalid; } u32 value { 0 }; }; class PropertyKeyTable { AK_MAKE_NONMOVABLE(PropertyKeyTable); AK_MAKE_NONCOPYABLE(PropertyKeyTable); public: PropertyKeyTable() = default; PropertyKeyTableIndex insert(PropertyKey); PropertyKey const& get(PropertyKeyTableIndex) const; void dump() const; bool is_empty() const { return m_property_keys.is_empty(); } ReadonlySpan property_keys() const { return m_property_keys; } void visit_edges(GC::Cell::Visitor& visitor) { for (auto& key : m_property_keys) key.visit_edges(visitor); } private: Vector m_property_keys; }; } namespace AK { template<> struct SentinelOptionalTraits { static constexpr JS::Bytecode::PropertyKeyTableIndex sentinel_value() { return { JS::Bytecode::PropertyKeyTableIndex::invalid }; } static constexpr bool is_sentinel(JS::Bytecode::PropertyKeyTableIndex const& value) { return !value.is_valid(); } }; template<> class Optional : public SentinelOptional { public: using SentinelOptional::SentinelOptional; }; }