MarkedVector.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/IntrusiveList.h>
  8. #include <AK/Noncopyable.h>
  9. #include <AK/Vector.h>
  10. #include <LibJS/Forward.h>
  11. #include <LibJS/Heap/Cell.h>
  12. namespace JS {
  13. class MarkedVectorBase {
  14. AK_MAKE_NONCOPYABLE(MarkedVectorBase);
  15. public:
  16. void append(Cell* cell) { m_cells.append(cell); }
  17. void prepend(Cell* cell) { m_cells.prepend(cell); }
  18. size_t size() const { return m_cells.size(); }
  19. Span<Cell*> cells() { return m_cells.span(); }
  20. protected:
  21. explicit MarkedVectorBase(Heap&);
  22. MarkedVectorBase(MarkedVectorBase&&);
  23. MarkedVectorBase& operator=(MarkedVectorBase&& other)
  24. {
  25. m_cells = move(other.m_cells);
  26. return *this;
  27. }
  28. ~MarkedVectorBase();
  29. Heap& m_heap;
  30. IntrusiveListNode<MarkedVectorBase> m_list_node;
  31. Vector<Cell*> m_cells;
  32. public:
  33. using List = IntrusiveList<&MarkedVectorBase::m_list_node>;
  34. };
  35. template<typename T>
  36. class MarkedVector : public MarkedVectorBase {
  37. public:
  38. explicit MarkedVector(Heap& heap)
  39. : MarkedVectorBase(heap)
  40. {
  41. }
  42. ~MarkedVector() = default;
  43. MarkedVector(MarkedVector&&) = default;
  44. MarkedVector& operator=(MarkedVector&&) = default;
  45. Span<T*> span() { return Span<T*> { bit_cast<T**>(m_cells.data()), m_cells.size() }; }
  46. auto begin() { return span().begin(); }
  47. auto begin() const { return span().begin(); }
  48. auto end() { return span().end(); }
  49. auto end() const { return span().end(); }
  50. };
  51. }