1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2015 The Chromium Authors. All rights reserved.
2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file.
4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifndef REGISTER_WEAK_MEMBERS_TEMPLATE_H_
6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define REGISTER_WEAK_MEMBERS_TEMPLATE_H_
7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "heap/stubs.h"
9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace blink {
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass X : public GarbageCollected<X> {
13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void trace(Visitor* visitor) { traceImpl(visitor); }
15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); }
16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private:
18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <typename VisitorDispatcher>
19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void traceImpl(VisitorDispatcher visitor) {}
20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass HasUntracedWeakMembers : public GarbageCollected<HasUntracedWeakMembers> {
23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void trace(Visitor* visitor) { traceImpl(visitor); }
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); }
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Don't have to be defined for the purpose of this test.
28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void clearWeakMembers(Visitor* visitor);
29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private:
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <typename VisitorDispatcher>
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void traceImpl(VisitorDispatcher visitor) {
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    visitor->template registerWeakMembers<
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        HasUntracedWeakMembers,
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        &HasUntracedWeakMembers::clearWeakMembers>(this);
36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  WeakMember<X> x_;
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // REGISTER_WEAK_MEMBERS_TEMPLATE_H_
44