| // Copyright 2020 The PDFium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FXJS_GC_GCED_TREE_NODE_MIXIN_H_ |
| #define FXJS_GC_GCED_TREE_NODE_MIXIN_H_ |
| |
| #include "core/fxcrt/tree_node.h" |
| #include "v8/include/cppgc/garbage-collected.h" |
| #include "v8/include/cppgc/member.h" |
| #include "v8/include/cppgc/visitor.h" |
| |
| namespace fxjs { |
| |
| // For DOM/XML-ish trees, where references outside the tree are Persistent<>, |
| // usable by classes that are already garbage collected themselves. |
| template <typename T> |
| class GCedTreeNodeMixin : public cppgc::GarbageCollectedMixin, |
| public fxcrt::TreeNodeBase<T> { |
| public: |
| virtual void Trace(cppgc::Visitor* visitor) const { |
| visitor->Trace(m_pParent); |
| visitor->Trace(m_pFirstChild); |
| visitor->Trace(m_pLastChild); |
| visitor->Trace(m_pNextSibling); |
| visitor->Trace(m_pPrevSibling); |
| } |
| |
| protected: |
| GCedTreeNodeMixin() = default; |
| GCedTreeNodeMixin(const GCedTreeNodeMixin& that) = delete; |
| GCedTreeNodeMixin& operator=(const GCedTreeNodeMixin& that) = delete; |
| |
| private: |
| friend class fxcrt::TreeNodeBase<T>; |
| |
| cppgc::Member<T> m_pParent; |
| cppgc::Member<T> m_pFirstChild; |
| cppgc::Member<T> m_pLastChild; |
| cppgc::Member<T> m_pNextSibling; |
| cppgc::Member<T> m_pPrevSibling; |
| }; |
| |
| } // namespace fxjs |
| |
| using fxjs::GCedTreeNodeMixin; |
| |
| #endif // FXJS_GC_GCED_TREE_NODE_MIXIN_H_ |