• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef TRACEIMPL_DEPENDENT_SCOPE_H_
6 #define TRACEIMPL_DEPENDENT_SCOPE_H_
7 
8 #include "heap/stubs.h"
9 
10 namespace blink {
11 
12 class X : public GarbageCollected<X> {
13  public:
trace(Visitor *)14   virtual void trace(Visitor*) {}
15 };
16 
17 template <typename T>
18 class Base : public GarbageCollected<Base<T> > {
19  public:
trace(Visitor * visitor)20   virtual void trace(Visitor* visitor) { traceImpl(visitor); }
trace(InlinedGlobalMarkingVisitor visitor)21   virtual void trace(InlinedGlobalMarkingVisitor visitor) {
22     traceImpl(visitor);
23   }
24 
25  private:
26   template <typename VisitorDispatcher>
traceImpl(VisitorDispatcher visitor)27   void traceImpl(VisitorDispatcher visitor) {}
28 };
29 
30 template <typename T>
31 class Derived : public Base<T> {
32  public:
trace(Visitor * visitor)33   void trace(Visitor* visitor) override { traceImpl(visitor); }
trace(InlinedGlobalMarkingVisitor visitor)34   void trace(InlinedGlobalMarkingVisitor visitor) override {
35     traceImpl(visitor);
36   }
37 
38  private:
39   template <typename VisitorDispatcher>
traceImpl(VisitorDispatcher visitor)40   void traceImpl(VisitorDispatcher visitor) {
41     Base<T>::trace(visitor);
42   }
43 };
44 
45 template <typename T>
46 class DerivedMissingTrace : public Base<T> {
47  public:
trace(Visitor * visitor)48   void trace(Visitor* visitor) override { traceImpl(visitor); }
trace(InlinedGlobalMarkingVisitor visitor)49   void trace(InlinedGlobalMarkingVisitor visitor) override {
50     traceImpl(visitor);
51   }
52 
53  private:
54   template <typename VisitorDispatcher>
traceImpl(VisitorDispatcher visitor)55   void traceImpl(VisitorDispatcher visitor) {
56     // Missing Base<T>::trace(visitor).
57   }
58 };
59 
60 }
61 
62 #endif  // TRACEIMPL_DEPENDENT_SCOPE_H_
63