162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file.
462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifndef HEAP_STUBS_H_
662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define HEAP_STUBS_H_
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "stddef.h"
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define WTF_MAKE_FAST_ALLOCATED                 \
1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    public:                                     \
1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t, void* p);        \
1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new[](size_t, void* p);      \
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t size);            \
1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    private:                                    \
1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typedef int __thisIsHereToForceASemicolonAfterThisMacro
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace WTF {
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class RefCounted { };
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class RawPtr {
2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class RefPtr {
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ~RefPtr() { }
3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class OwnPtr {
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ~OwnPtr() { }
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass DefaultAllocator {
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    static const bool isGarbageCollected = false;
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct VectorTraits {
4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    static const bool needsDestruction = true;
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<size_t inlineCapacity, bool isGarbageCollected, bool tNeedsDestruction>
5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VectorDestructorBase {
5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ~VectorDestructorBase() {}
5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<size_t inlineCapacity>
5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VectorDestructorBase<inlineCapacity, true, false> {};
6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<>
6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VectorDestructorBase<0, true, true> {};
6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<
6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typename T,
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    size_t inlineCapacity = 0,
6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typename Allocator = DefaultAllocator>
6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Vector : public VectorDestructorBase<inlineCapacity,
6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                           Allocator::isGarbageCollected,
7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                           VectorTraits<T>::needsDestruction> {
7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using iterator = T*;
7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using const_iterator = const T*;
7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using reverse_iterator = T*;
7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using const_reverse_iterator = const T*;
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  size_t size();
7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  T& operator[](size_t);
7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename T,
8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          size_t inlineCapacity = 0,
8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename Allocator = DefaultAllocator>
8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Deque {
8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
8662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using iterator = T*;
8762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using const_iterator = const T*;
8862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using reverse_iterator = T*;
8962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  using const_reverse_iterator = const T*;
9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
9262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename ValueArg,
9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename HashArg = void,
9462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename TraitsArg = void,
9562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename Allocator = DefaultAllocator>
9662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HashSet {
9762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
9862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef ValueArg* iterator;
9962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const ValueArg* const_iterator;
10062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef ValueArg* reverse_iterator;
10162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const ValueArg* const_reverse_iterator;
10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename ValueArg,
10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename HashArg = void,
10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename TraitsArg = void,
10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename Allocator = DefaultAllocator>
10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ListHashSet {
10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
11062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef ValueArg* iterator;
11162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const ValueArg* const_iterator;
11262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef ValueArg* reverse_iterator;
11362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const ValueArg* const_reverse_iterator;
11462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
11562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
11662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename ValueArg,
11762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename HashArg = void,
11862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename TraitsArg = void,
11962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename Allocator = DefaultAllocator>
12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass LinkedHashSet {
12162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
12262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef ValueArg* iterator;
12362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const ValueArg* const_iterator;
12462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef ValueArg* reverse_iterator;
12562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const ValueArg* const_reverse_iterator;
12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
12762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<
12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typename ValueArg,
13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typename HashArg = void,
13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typename TraitsArg = void,
13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typename Allocator = DefaultAllocator>
13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HashCountedSet {};
13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename KeyArg,
13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename MappedArg,
13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename HashArg = void,
13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename KeyTraitsArg = void,
13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename MappedTraitsArg = void,
14062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          typename Allocator = DefaultAllocator>
14162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HashMap {
14262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef MappedArg* iterator;
14462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const MappedArg* const_iterator;
14562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef MappedArg* reverse_iterator;
14662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef const MappedArg* const_reverse_iterator;
14762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
14862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Empty namespace declaration to exercise internal
15162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// handling of namespace equality.
15262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace std {
15362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  /* empty */
15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace std {
15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
15862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class unique_ptr {
15962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ~unique_ptr() { }
16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
16362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
16462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
16562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
16662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
16762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace blink {
16862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
16962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochusing namespace WTF;
17062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
17162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define DISALLOW_NEW()                   \
17262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    private:                                    \
17362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t) = delete;        \
17462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t, void*) = delete;
17562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define STACK_ALLOCATED()                                   \
17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    private:                                                \
17862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    __attribute__((annotate("blink_stack_allocated")))      \
17962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t) = delete;                    \
18062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t, void*) = delete;
18162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define ALLOW_ONLY_INLINE_ALLOCATION()    \
18362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    public:                               \
18462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t, void*);    \
18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    private:                              \
18662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* operator new(size_t) = delete;
18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define GC_PLUGIN_IGNORE(bug)                           \
18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    __attribute__((annotate("blink_gc_plugin_ignore")))
19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define USING_GARBAGE_COLLECTED_MIXIN(type)                     \
19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:                                                         \
19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    virtual void adjustAndMark(Visitor*) const override { }     \
19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    virtual bool isHeapObjectAlive(Visitor*) const override { return 0; }
19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define EAGERLY_FINALIZED() typedef int IsEagerlyFinalizedMarker
19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class GarbageCollected { };
19962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass GarbageCollectedFinalized : public GarbageCollected<T> { };
20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass RefCountedGarbageCollected : public GarbageCollectedFinalized<T> { };
20562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class Member {
20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
20862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
20962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
21062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool operator!() const { return false; }
21162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
21262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
21362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class WeakMember {
21462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
21562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
21662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
21762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool operator!() const { return false; }
21862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
21962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
22062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class Persistent {
22162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
22262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
22362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
22462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool operator!() const { return false; }
22562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class WeakPersistent {
22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool operator!() const { return false; }
23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
23462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class CrossThreadPersistent {
23562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
23662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
23762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
23862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool operator!() const { return false; }
23962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
24062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
24162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class CrossThreadWeakPersistent {
24262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
24362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    operator T*() const { return 0; }
24462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    T* operator->() { return 0; }
24562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool operator!() const { return false; }
24662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
24762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
24862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapAllocator {
24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    static const bool isGarbageCollected = true;
25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
25262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
25362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T, size_t inlineCapacity = 0>
25462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapVector : public Vector<T, inlineCapacity, HeapAllocator> { };
25562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
25662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T, size_t inlineCapacity = 0>
25762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapDeque : public Vector<T, inlineCapacity, HeapAllocator> { };
25862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
25962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
26062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapHashSet : public HashSet<T, void, void, HeapAllocator> { };
26162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
26262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
26362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapListHashSet : public ListHashSet<T, void, void, HeapAllocator> { };
26462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
26562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
26662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapLinkedHashSet : public LinkedHashSet<T, void, void, HeapAllocator> {
26762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
26862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
26962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
27062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapHashCountedSet : public HashCountedSet<T, void, void, HeapAllocator> {
27162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
27262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
27362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename K, typename V>
27462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapHashMap : public HashMap<K, V, void, void, void, HeapAllocator> { };
27562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
27662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
27762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass PersistentHeapVector : public Vector<T, 0, HeapAllocator> { };
27862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
27962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename Derived>
28062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VisitorHelper {
28162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
28262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    template<typename T>
28362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void trace(const T&);
28462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
28562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
28662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Visitor : public VisitorHelper<Visitor> {
28762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
28862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    template<typename T, void (T::*method)(Visitor*)>
28962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void registerWeakMembers(const T* obj);
29062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
29162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
29262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass InlinedGlobalMarkingVisitor
29362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    : public VisitorHelper<InlinedGlobalMarkingVisitor> {
29462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
29562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    InlinedGlobalMarkingVisitor* operator->() { return this; }
29662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
29762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    template<typename T, void (T::*method)(Visitor*)>
29862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void registerWeakMembers(const T* obj);
29962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
30062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
30162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass GarbageCollectedMixin {
30262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic:
30362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    virtual void adjustAndMark(Visitor*) const = 0;
30462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    virtual bool isHeapObjectAlive(Visitor*) const = 0;
30562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    virtual void trace(Visitor*) { }
30662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
30762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
30862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
30962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct TraceIfNeeded {
31062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    static void trace(Visitor*, T*);
31162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
31262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
31362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
31462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
31562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace WTF {
31662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
31762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T>
31862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct VectorTraits<blink::Member<T> > {
31962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    static const bool needsDestruction = false;
32062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
32162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
32262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
32362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
32462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
325