// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // Defines growable array classes, that differ where they are allocated: // - GrowableArray: allocated on stack. // - ZoneGrowableArray: allocated in the zone. // - MallocGrowableArray: allocates using malloc/realloc; free is only called // at destruction. #ifndef RUNTIME_VM_GROWABLE_ARRAY_H_ #define RUNTIME_VM_GROWABLE_ARRAY_H_ #include "platform/growable_array.h" #include "vm/thread_state.h" #include "vm/zone.h" namespace dart { template class GrowableArray : public BaseGrowableArray { public: GrowableArray(Zone* zone, intptr_t initial_capacity) : BaseGrowableArray(initial_capacity, ASSERT_NOTNULL(zone)) {} explicit GrowableArray(intptr_t initial_capacity) : BaseGrowableArray( initial_capacity, ASSERT_NOTNULL(ThreadState::Current()->zone())) {} GrowableArray() : BaseGrowableArray( ASSERT_NOTNULL(ThreadState::Current()->zone())) {} }; template class ZoneGrowableArray : public BaseGrowableArray { public: ZoneGrowableArray(Zone* zone, intptr_t initial_capacity) : BaseGrowableArray(initial_capacity, ASSERT_NOTNULL(zone)) {} explicit ZoneGrowableArray(intptr_t initial_capacity) : BaseGrowableArray( initial_capacity, ASSERT_NOTNULL(ThreadState::Current()->zone())) {} ZoneGrowableArray() : BaseGrowableArray( ASSERT_NOTNULL(ThreadState::Current()->zone())) {} }; // T must be a Handle type. template class BaseGrowableHandlePtrArray : public B { public: BaseGrowableHandlePtrArray(Zone* zone, intptr_t initial_capacity) : zone_(zone), array_(zone, initial_capacity) {} // Use unique zone handles to store objects. void Add(const T& t) { array_.Add(&T::ZoneHandle(zone_, t.ptr())); } T& operator[](intptr_t index) const { return *array_[index]; } const T& At(intptr_t index) const { return operator[](index); } void SetAt(intptr_t index, const T& t) { array_[index] = &T::ZoneHandle(zone_, t.ptr()); } intptr_t length() const { return array_.length(); } void Clear() { array_.Clear(); } const GrowableArray& growable_array() const { return array_; } private: Zone* zone_; GrowableArray array_; DISALLOW_COPY_AND_ASSIGN(BaseGrowableHandlePtrArray); }; template class GrowableHandlePtrArray : public BaseGrowableHandlePtrArray { public: GrowableHandlePtrArray(Zone* zone, intptr_t initial_capacity) : BaseGrowableHandlePtrArray(zone, initial_capacity) {} }; template class ZoneGrowableHandlePtrArray : public BaseGrowableHandlePtrArray { public: ZoneGrowableHandlePtrArray(Zone* zone, intptr_t initial_capacity) : BaseGrowableHandlePtrArray(zone, initial_capacity) {} }; } // namespace dart #endif // RUNTIME_VM_GROWABLE_ARRAY_H_