| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_HASH_MAP_H_ | 5 #ifndef VM_HASH_MAP_H_ |
| 6 #define VM_HASH_MAP_H_ | 6 #define VM_HASH_MAP_H_ |
| 7 | 7 |
| 8 namespace dart { | 8 namespace dart { |
| 9 | 9 |
| 10 template <typename KeyValueTrait> | 10 template <typename KeyValueTrait> |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 } | 99 } |
| 100 | 100 |
| 101 | 101 |
| 102 template <typename KeyValueTrait> | 102 template <typename KeyValueTrait> |
| 103 DirectChainedHashMap<KeyValueTrait>:: | 103 DirectChainedHashMap<KeyValueTrait>:: |
| 104 DirectChainedHashMap(const DirectChainedHashMap& other) | 104 DirectChainedHashMap(const DirectChainedHashMap& other) |
| 105 : ValueObject(), | 105 : ValueObject(), |
| 106 array_size_(other.array_size_), | 106 array_size_(other.array_size_), |
| 107 lists_size_(other.lists_size_), | 107 lists_size_(other.lists_size_), |
| 108 count_(other.count_), | 108 count_(other.count_), |
| 109 array_(Isolate::Current()->current_zone()-> | 109 array_(Thread::Current()->zone()-> |
| 110 Alloc<HashMapListElement>(other.array_size_)), | 110 Alloc<HashMapListElement>(other.array_size_)), |
| 111 lists_(Isolate::Current()->current_zone()-> | 111 lists_(Thread::Current()->zone()-> |
| 112 Alloc<HashMapListElement>(other.lists_size_)), | 112 Alloc<HashMapListElement>(other.lists_size_)), |
| 113 free_list_head_(other.free_list_head_) { | 113 free_list_head_(other.free_list_head_) { |
| 114 memmove(array_, other.array_, array_size_ * sizeof(HashMapListElement)); | 114 memmove(array_, other.array_, array_size_ * sizeof(HashMapListElement)); |
| 115 memmove(lists_, other.lists_, lists_size_ * sizeof(HashMapListElement)); | 115 memmove(lists_, other.lists_, lists_size_ * sizeof(HashMapListElement)); |
| 116 } | 116 } |
| 117 | 117 |
| 118 | 118 |
| 119 template <typename KeyValueTrait> | 119 template <typename KeyValueTrait> |
| 120 void DirectChainedHashMap<KeyValueTrait>::Resize(intptr_t new_size) { | 120 void DirectChainedHashMap<KeyValueTrait>::Resize(intptr_t new_size) { |
| 121 const typename KeyValueTrait::Value kNoValue = | 121 const typename KeyValueTrait::Value kNoValue = |
| 122 KeyValueTrait::ValueOf(typename KeyValueTrait::Pair()); | 122 KeyValueTrait::ValueOf(typename KeyValueTrait::Pair()); |
| 123 | 123 |
| 124 ASSERT(new_size > count_); | 124 ASSERT(new_size > count_); |
| 125 // Hashing the values into the new array has no more collisions than in the | 125 // Hashing the values into the new array has no more collisions than in the |
| 126 // old hash map, so we can use the existing lists_ array, if we are careful. | 126 // old hash map, so we can use the existing lists_ array, if we are careful. |
| 127 | 127 |
| 128 // Make sure we have at least one free element. | 128 // Make sure we have at least one free element. |
| 129 if (free_list_head_ == kNil) { | 129 if (free_list_head_ == kNil) { |
| 130 ResizeLists(lists_size_ << 1); | 130 ResizeLists(lists_size_ << 1); |
| 131 } | 131 } |
| 132 | 132 |
| 133 HashMapListElement* new_array = | 133 HashMapListElement* new_array = |
| 134 Isolate::Current()->current_zone()->Alloc<HashMapListElement>(new_size); | 134 Thread::Current()->zone()->Alloc<HashMapListElement>(new_size); |
| 135 InitArray(new_array, new_size); | 135 InitArray(new_array, new_size); |
| 136 | 136 |
| 137 HashMapListElement* old_array = array_; | 137 HashMapListElement* old_array = array_; |
| 138 intptr_t old_size = array_size_; | 138 intptr_t old_size = array_size_; |
| 139 | 139 |
| 140 intptr_t old_count = count_; | 140 intptr_t old_count = count_; |
| 141 count_ = 0; | 141 count_ = 0; |
| 142 array_size_ = new_size; | 142 array_size_ = new_size; |
| 143 array_ = new_array; | 143 array_ = new_array; |
| 144 | 144 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 162 USE(old_count); | 162 USE(old_count); |
| 163 ASSERT(count_ == old_count); | 163 ASSERT(count_ == old_count); |
| 164 } | 164 } |
| 165 | 165 |
| 166 | 166 |
| 167 template <typename T> | 167 template <typename T> |
| 168 void DirectChainedHashMap<T>::ResizeLists(intptr_t new_size) { | 168 void DirectChainedHashMap<T>::ResizeLists(intptr_t new_size) { |
| 169 ASSERT(new_size > lists_size_); | 169 ASSERT(new_size > lists_size_); |
| 170 | 170 |
| 171 HashMapListElement* new_lists = | 171 HashMapListElement* new_lists = |
| 172 Isolate::Current()->current_zone()-> | 172 Thread::Current()->zone()-> |
| 173 Alloc<HashMapListElement>(new_size); | 173 Alloc<HashMapListElement>(new_size); |
| 174 InitArray(new_lists, new_size); | 174 InitArray(new_lists, new_size); |
| 175 | 175 |
| 176 HashMapListElement* old_lists = lists_; | 176 HashMapListElement* old_lists = lists_; |
| 177 intptr_t old_size = lists_size_; | 177 intptr_t old_size = lists_size_; |
| 178 | 178 |
| 179 lists_size_ = new_size; | 179 lists_size_ = new_size; |
| 180 lists_ = new_lists; | 180 lists_ = new_lists; |
| 181 | 181 |
| 182 if (old_lists != NULL) { | 182 if (old_lists != NULL) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 } | 241 } |
| 242 | 242 |
| 243 static inline bool IsKeyEqual(Pair kv, Key key) { | 243 static inline bool IsKeyEqual(Pair kv, Key key) { |
| 244 return kv->Equals(key); | 244 return kv->Equals(key); |
| 245 } | 245 } |
| 246 }; | 246 }; |
| 247 | 247 |
| 248 } // namespace dart | 248 } // namespace dart |
| 249 | 249 |
| 250 #endif // VM_HASH_MAP_H_ | 250 #endif // VM_HASH_MAP_H_ |
| OLD | NEW |