1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file.
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#ifndef HeapTerminatedArray_h
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#define HeapTerminatedArray_h
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "platform/heap/Heap.h"
9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/TerminatedArray.h"
10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/TerminatedArrayBuilder.h"
11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<typename T>
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class HeapTerminatedArray : public TerminatedArray<T> {
16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DISALLOW_ALLOCATION();
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    using TerminatedArray<T>::begin;
19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    using TerminatedArray<T>::end;
20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void trace(Visitor* visitor)
22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        for (typename TerminatedArray<T>::iterator it = begin(); it != end(); ++it)
24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            visitor->trace(*it);
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private:
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Allocator describes how HeapTerminatedArrayBuilder should create new intances
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // of TerminateArray and manage their lifetimes.
30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    struct Allocator {
31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        typedef HeapTerminatedArray* PassPtr;
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        typedef RawPtr<HeapTerminatedArray> Ptr;
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        static PassPtr create(size_t capacity)
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return reinterpret_cast<HeapTerminatedArray*>(Heap::allocate<HeapTerminatedArray>(capacity * sizeof(T)));
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        static PassPtr resize(PassPtr ptr, size_t capacity)
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return reinterpret_cast<HeapTerminatedArray*>(Heap::reallocate<HeapTerminatedArray>(ptr, capacity * sizeof(T)));
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    };
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Prohibit construction. Allocator makes HeapTerminatedArray instances for
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // HeapTerminatedArrayBuilder by pointer casting.
47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HeapTerminatedArray();
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    template<typename U, template <typename> class> friend class WTF::TerminatedArrayBuilder;
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif // HeapTerminatedArray_h
55