/* * Copyright (c) 2021, Gunnar Beutner * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace JS::Bytecode { struct StringTableIndex { static constexpr u32 invalid = 0xffffffffu; bool is_valid() const { return value != invalid; } u32 value { 0 }; }; class StringTable { AK_MAKE_NONMOVABLE(StringTable); AK_MAKE_NONCOPYABLE(StringTable); public: StringTable() = default; StringTableIndex insert(Utf16String); Utf16String const& get(StringTableIndex) const; void dump() const; bool is_empty() const { return m_strings.is_empty(); } private: Vector m_strings; }; } namespace AK { template<> struct SentinelOptionalTraits { static constexpr JS::Bytecode::StringTableIndex sentinel_value() { return { JS::Bytecode::StringTableIndex::invalid }; } static constexpr bool is_sentinel(JS::Bytecode::StringTableIndex const& value) { return !value.is_valid(); } }; template<> class Optional : public SentinelOptional { public: using SentinelOptional::SentinelOptional; }; }