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: 14 virtual void trace(Visitor*) {} 15 }; 16 17 class TraceImplInlined : public GarbageCollected<TraceImplInlined> { 18 public: 19 void trace(Visitor* visitor) { traceImpl(visitor); } 20 21 template <typename VisitorDispatcher> 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: 42 virtual void trace(Visitor* visitor) {} 43 }; 44 45 class TraceImplBaseInlined : public Base { 46 public: 47 void trace(Visitor* visitor) override { traceImpl(visitor); } 48 49 template <typename VisitorDispatcher> 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