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