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 FINALIZE_AFTER_DISPATCH_H_
6#define FINALIZE_AFTER_DISPATCH_H_
7
8#include "heap/stubs.h"
9
10namespace blink {
11
12class NeedsFinalize : public GarbageCollectedFinalized<NeedsFinalize> {
13public:
14    void Trace(Visitor*);
15    void TraceAfterDispatch(Visitor*);
16    // Needs a FinalizeGarbageCollectedObject method.
17};
18
19class NeedsDispatch : public GarbageCollectedFinalized<NeedsDispatch> {
20public:
21    void Trace(Visitor*);
22    // Needs a TraceAfterDispatch method.
23    void FinalizeGarbageCollectedObject() { };
24};
25
26class NeedsFinalizedBase : public GarbageCollected<NeedsFinalizedBase> {
27public:
28    void Trace(Visitor*) { };
29    void TraceAfterDispatch(Visitor*) { };
30    void FinalizeGarbageCollectedObject() { };
31};
32
33class A : GarbageCollectedFinalized<A> {
34public:
35    void Trace(Visitor*);
36    void TraceAfterDispatch(Visitor*);
37    void FinalizeGarbageCollectedObject();
38protected:
39    enum Type { TB, TC, TD };
40    A(Type type) : m_type(type) { }
41private:
42    Type m_type;
43};
44
45class B : public A {
46public:
47    B() : A(TB) { }
48    ~B() { }
49    void TraceAfterDispatch(Visitor*);
50private:
51    Member<A> m_a;
52};
53
54class C : public A {
55public:
56    C() : A(TC) { }
57    void TraceAfterDispatch(Visitor*);
58private:
59    Member<A> m_a;
60};
61
62// This class is considered abstract does not need to be dispatched to.
63class Abstract : public A {
64protected:
65    Abstract(Type type) : A(type) { }
66};
67
68class D : public Abstract {
69public:
70    D() : Abstract(TD) { }
71    void TraceAfterDispatch(Visitor*);
72private:
73    Member<A> m_a;
74};
75
76}
77
78#endif
79