/* * Copyright (c) 2021, Idan Horowitz * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace JS { class JS_API WeakMap final : public Object , public GC::WeakContainer { JS_OBJECT(WeakMap, Object); GC_DECLARE_ALLOCATOR(WeakMap); public: static GC::Ref create(Realm&); virtual ~WeakMap() override = default; Optional weak_map_get(GC::Ptr) const; bool weak_map_has(GC::Ptr) const; void weak_map_set(GC::Ptr, Value); bool weak_map_remove(GC::Ptr); size_t weak_map_size() const { return m_values.size(); } virtual Cell const& owner_cell(Badge) const override { return *this; } virtual void remove_dead_cells(Badge) override; virtual size_t external_memory_size() const override; private: explicit WeakMap(Object& prototype); virtual bool is_weak_map() const final { return true; } void visit_edges(Visitor&) override; void account_external_memory_change(size_t old_external_memory_size); HashMap, Value> m_values; // This stores Cell pointers instead of Object pointers to aide with sweeping }; template<> inline bool Object::fast_is() const { return is_weak_map(); } }