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 HeapTerminatedArray_h
6#define HeapTerminatedArray_h
7
8#include "platform/heap/Heap.h"
9#include "wtf/TerminatedArray.h"
10#include "wtf/TerminatedArrayBuilder.h"
11
12namespace blink {
13
14template<typename T>
15class HeapTerminatedArray : public TerminatedArray<T> {
16    DISALLOW_ALLOCATION();
17public:
18    using TerminatedArray<T>::begin;
19    using TerminatedArray<T>::end;
20
21    void trace(Visitor* visitor)
22    {
23        for (typename TerminatedArray<T>::iterator it = begin(); it != end(); ++it)
24            visitor->trace(*it);
25    }
26
27private:
28    // Allocator describes how HeapTerminatedArrayBuilder should create new intances
29    // of TerminateArray and manage their lifetimes.
30    struct Allocator {
31        typedef HeapTerminatedArray* PassPtr;
32        typedef RawPtr<HeapTerminatedArray> Ptr;
33
34        static PassPtr create(size_t capacity)
35        {
36            return reinterpret_cast<HeapTerminatedArray*>(Heap::allocate<HeapTerminatedArray>(capacity * sizeof(T)));
37        }
38
39        static PassPtr resize(PassPtr ptr, size_t capacity)
40        {
41            return reinterpret_cast<HeapTerminatedArray*>(Heap::reallocate<HeapTerminatedArray>(ptr, capacity * sizeof(T)));
42        }
43    };
44
45    // Prohibit construction. Allocator makes HeapTerminatedArray instances for
46    // HeapTerminatedArrayBuilder by pointer casting.
47    HeapTerminatedArray();
48
49    template<typename U, template <typename> class> friend class WTF::TerminatedArrayBuilder;
50};
51
52} // namespace blink
53
54#endif // HeapTerminatedArray_h
55