• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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_H_
6 #define TRACEIMPL_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 class TraceImplInlined : public GarbageCollected<TraceImplInlined> {
18  public:
trace(Visitor * visitor)19   void trace(Visitor* visitor) { traceImpl(visitor); }
20 
21   template <typename VisitorDispatcher>
traceImpl(VisitorDispatcher visitor)22   void traceImpl(VisitorDispatcher visitor) {
23     visitor->trace(x_);
24   }
25 
26  private:
27   Member<X> x_;
28 };
29 
30 class TraceImplExtern : public GarbageCollected<TraceImplExtern> {
31  public:
32   void trace(Visitor* visitor);
33   template <typename VisitorDispatcher>
34   inline void traceImpl(VisitorDispatcher);
35 
36  private:
37   Member<X> x_;
38 };
39 
40 class Base : public GarbageCollected<Base> {
41  public:
trace(Visitor * visitor)42   virtual void trace(Visitor* visitor) {}
43 };
44 
45 class TraceImplBaseInlined : public Base {
46  public:
trace(Visitor * visitor)47   void trace(Visitor* visitor) override { traceImpl(visitor); }
48 
49   template <typename VisitorDispatcher>
traceImpl(VisitorDispatcher visitor)50   void traceImpl(VisitorDispatcher visitor) {
51     Base::trace(visitor);
52   }
53 };
54 
55 class TraceImplBaseExtern : public Base {
56  public:
57   void trace(Visitor* visitor) override;
58 
59   template <typename VisitorDispatcher>
60   void traceImpl(VisitorDispatcher);
61 
62  private:
63   Member<X> x_;
64 };
65 
66 }
67 
68 #endif
69