ConservativeVector.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * Copyright (c) 2024, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/HashMap.h>
  8. #include <AK/IntrusiveList.h>
  9. #include <AK/Vector.h>
  10. #include <LibJS/Forward.h>
  11. #include <LibJS/Heap/Cell.h>
  12. #include <LibJS/Heap/HeapRoot.h>
  13. namespace JS {
  14. class ConservativeVectorBase {
  15. public:
  16. virtual ReadonlySpan<FlatPtr> possible_values() const = 0;
  17. protected:
  18. explicit ConservativeVectorBase(Heap&);
  19. ~ConservativeVectorBase();
  20. ConservativeVectorBase& operator=(ConservativeVectorBase const&);
  21. Heap* m_heap { nullptr };
  22. IntrusiveListNode<ConservativeVectorBase> m_list_node;
  23. public:
  24. using List = IntrusiveList<&ConservativeVectorBase::m_list_node>;
  25. };
  26. template<typename T, size_t inline_capacity>
  27. class ConservativeVector final
  28. : public ConservativeVectorBase
  29. , public Vector<T, inline_capacity> {
  30. public:
  31. explicit ConservativeVector(Heap& heap)
  32. : ConservativeVectorBase(heap)
  33. {
  34. }
  35. virtual ~ConservativeVector() = default;
  36. ConservativeVector(ConservativeVector const& other)
  37. : ConservativeVectorBase(*other.m_heap)
  38. , Vector<T, inline_capacity>(other)
  39. {
  40. }
  41. ConservativeVector(ConservativeVector&& other)
  42. : ConservativeVectorBase(*other.m_heap)
  43. , Vector<T, inline_capacity>(move(static_cast<Vector<T, inline_capacity>&>(other)))
  44. {
  45. }
  46. ConservativeVector& operator=(ConservativeVector const& other)
  47. {
  48. Vector<T, inline_capacity>::operator=(other);
  49. ConservativeVectorBase::operator=(other);
  50. return *this;
  51. }
  52. virtual ReadonlySpan<FlatPtr> possible_values() const override
  53. {
  54. return ReadonlySpan<FlatPtr> { reinterpret_cast<FlatPtr const*>(this->data()), this->size() };
  55. }
  56. };
  57. }