1 // Copyright 2014 the V8 project 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 V8_ZONE_ALLOCATOR_H_ 6 #define V8_ZONE_ALLOCATOR_H_ 7 8 #include <limits> 9 10 #include "src/zone.h" 11 12 namespace v8 { 13 namespace internal { 14 15 template<typename T> 16 class zone_allocator { 17 public: 18 typedef T* pointer; 19 typedef const T* const_pointer; 20 typedef T& reference; 21 typedef const T& const_reference; 22 typedef T value_type; 23 typedef size_t size_type; 24 typedef ptrdiff_t difference_type; 25 template<class O> struct rebind { 26 typedef zone_allocator<O> other; 27 }; 28 zone_allocator(Zone * zone)29 explicit zone_allocator(Zone* zone) throw() : zone_(zone) {} zone_allocator(const zone_allocator & other)30 explicit zone_allocator(const zone_allocator& other) throw() 31 : zone_(other.zone_) {} zone_allocator(const zone_allocator<U> & other)32 template<typename U> zone_allocator(const zone_allocator<U>& other) throw() 33 : zone_(other.zone_) {} 34 template<typename U> friend class zone_allocator; 35 address(reference x)36 pointer address(reference x) const {return &x;} address(const_reference x)37 const_pointer address(const_reference x) const {return &x;} 38 39 pointer allocate(size_type n, const void* hint = 0) { 40 return static_cast<pointer>(zone_->NewArray<value_type>( 41 static_cast<int>(n))); 42 } deallocate(pointer p,size_type)43 void deallocate(pointer p, size_type) { /* noop for Zones */ } 44 max_size()45 size_type max_size() const throw() { 46 return std::numeric_limits<int>::max() / sizeof(value_type); 47 } construct(pointer p,const T & val)48 void construct(pointer p, const T& val) { 49 new(static_cast<void*>(p)) T(val); 50 } destroy(pointer p)51 void destroy(pointer p) { p->~T(); } 52 53 bool operator==(zone_allocator const& other) const { 54 return zone_ == other.zone_; 55 } 56 bool operator!=(zone_allocator const& other) const { 57 return zone_ != other.zone_; 58 } 59 zone()60 Zone* zone() { return zone_; } 61 62 private: 63 zone_allocator(); 64 Zone* zone_; 65 }; 66 67 typedef zone_allocator<bool> ZoneBoolAllocator; 68 typedef zone_allocator<int> ZoneIntAllocator; 69 } // namespace internal 70 } // namespace v8 71 72 #endif // V8_ZONE_ALLOCATOR_H_ 73