EnableGraphPointers.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/NumericLimits.h>
  8. #include <AK/Vector.h>
  9. namespace JSSpecCompiler {
  10. struct VoidRef { };
  11. template<typename T, typename NativeNodeRef = VoidRef>
  12. class EnableGraphPointers {
  13. public:
  14. class VertexBase {
  15. public:
  16. VertexBase() = default;
  17. VertexBase(size_t index)
  18. : m_index(index)
  19. {
  20. }
  21. bool is_invalid() const { return m_index == invalid_node; }
  22. operator size_t() const { return m_index; }
  23. explicit VertexBase(NativeNodeRef const& node)
  24. requires(!IsSame<NativeNodeRef, VoidRef>)
  25. : VertexBase(node->m_index)
  26. {
  27. }
  28. auto& operator*() const { return m_instance->m_nodes[m_index]; }
  29. auto* operator->() const { return &m_instance->m_nodes[m_index]; }
  30. protected:
  31. size_t m_index = invalid_node;
  32. };
  33. using Vertex = VertexBase;
  34. inline static constexpr size_t invalid_node = NumericLimits<size_t>::max();
  35. template<typename Func>
  36. void with_graph(Func func)
  37. {
  38. m_instance = static_cast<T*>(this);
  39. func();
  40. m_instance = nullptr;
  41. }
  42. template<typename Func>
  43. void with_graph(size_t n, Func func)
  44. {
  45. m_instance = static_cast<T*>(this);
  46. m_instance->m_nodes.resize(n);
  47. func();
  48. m_instance->m_nodes.clear();
  49. m_instance = nullptr;
  50. }
  51. protected:
  52. inline static thread_local T* m_instance = nullptr;
  53. };
  54. }