OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 import 'dart:typed_data'; | 5 import 'dart:typed_data'; |
6 | 6 |
7 // Hash table with open addressing that separates the index from keys/values. | 7 // Hash table with open addressing that separates the index from keys/values. |
8 abstract class _HashBase { | 8 abstract class _HashBase { |
9 // Each occupied entry in _index is a fixed-size integer that encodes a pair: | 9 // Each occupied entry in _index is a fixed-size integer that encodes a pair: |
10 // [ hash pattern for key | index of entry in _data ] | 10 // [ hash pattern for key | index of entry in _data ] |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 } else { | 330 } else { |
331 current = null; | 331 current = null; |
332 return false; | 332 return false; |
333 } | 333 } |
334 } | 334 } |
335 } | 335 } |
336 | 336 |
337 // Set implementation, analogous to _CompactLinkedHashMap. | 337 // Set implementation, analogous to _CompactLinkedHashMap. |
338 class _CompactLinkedHashSet<K> | 338 class _CompactLinkedHashSet<K> |
339 extends SetBase<K> with _HashBase | 339 extends SetBase<K> with _HashBase |
340 implements HashSet<K>, LinkedHashSet<K> { | 340 implements LinkedHashSet<K> { |
341 | 341 |
342 _CompactLinkedHashSet() { | 342 _CompactLinkedHashSet() { |
343 assert(_HashBase._UNUSED_PAIR == 0); | 343 assert(_HashBase._UNUSED_PAIR == 0); |
344 _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE); | 344 _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE); |
345 _data = new List(_HashBase._INITIAL_INDEX_SIZE >> 1); | 345 _data = new List(_HashBase._INITIAL_INDEX_SIZE >> 1); |
346 } | 346 } |
347 | 347 |
348 int get length => _usedData - _deletedKeys; | 348 int get length => _usedData - _deletedKeys; |
349 | 349 |
350 void _rehash() { | 350 void _rehash() { |
(...skipping 19 matching lines...) Expand all Loading... |
370 if (oldData != null) { | 370 if (oldData != null) { |
371 for (int i = 0; i < oldUsed; i += 1) { | 371 for (int i = 0; i < oldUsed; i += 1) { |
372 var key = oldData[i]; | 372 var key = oldData[i]; |
373 if (!_HashBase._isDeleted(oldData, key)) { | 373 if (!_HashBase._isDeleted(oldData, key)) { |
374 add(key); | 374 add(key); |
375 } | 375 } |
376 } | 376 } |
377 } | 377 } |
378 } | 378 } |
379 | 379 |
380 bool add(Object key) { | 380 bool add(K key) { |
381 final int size = _index.length; | 381 final int size = _index.length; |
382 final int sizeMask = size - 1; | 382 final int sizeMask = size - 1; |
383 final int maxEntries = size >> 1; | 383 final int maxEntries = size >> 1; |
384 final int fullHash = key.hashCode; | 384 final int fullHash = key.hashCode; |
385 final int hashPattern = _HashBase._hashPattern(fullHash, _hashMask, size); | 385 final int hashPattern = _HashBase._hashPattern(fullHash, _hashMask, size); |
386 int i = _HashBase._firstProbe(fullHash, sizeMask); | 386 int i = _HashBase._firstProbe(fullHash, sizeMask); |
387 int firstDeleted = -1; | 387 int firstDeleted = -1; |
388 int pair = _index[i]; | 388 int pair = _index[i]; |
389 while (pair != _HashBase._UNUSED_PAIR) { | 389 while (pair != _HashBase._UNUSED_PAIR) { |
390 if (pair == _HashBase._DELETED_PAIR) { | 390 if (pair == _HashBase._DELETED_PAIR) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 pair = _index[i]; | 464 pair = _index[i]; |
465 } | 465 } |
466 return false; | 466 return false; |
467 } | 467 } |
468 | 468 |
469 Iterator<K> get iterator => | 469 Iterator<K> get iterator => |
470 new _CompactIterator<K>(this, _data, _usedData, -1, 1); | 470 new _CompactIterator<K>(this, _data, _usedData, -1, 1); |
471 | 471 |
472 Set<K> toSet() => new Set<K>()..addAll(this); | 472 Set<K> toSet() => new Set<K>()..addAll(this); |
473 } | 473 } |
OLD | NEW |