blob: 801bc6494ae53ecc7fa9196facb48087f3c43999 [file] [log] [blame]
Joel Galenson2370d122020-10-12 16:02:26 -07001//! A hash map where the keys and values are both held by weak pointers, and keys are compared by
2//! value.
3
Joel Galenson2370d122020-10-12 16:02:26 -07004use super::*;
5use super::size_policy::*;
6use super::traits::*;
7use super::util::*;
8
9pub use super::WeakWeakHashMap;
10
11/// Represents an entry in the table which may be occupied or vacant.
12pub enum Entry<'a, K: 'a + WeakKey, V: 'a + WeakElement> {
13 Occupied(OccupiedEntry<'a, K, V>),
14 Vacant(VacantEntry<'a, K, V>),
15}
16
17/// An occupied entry, which can be removed or viewed.
18pub struct OccupiedEntry<'a, K: 'a + WeakKey, V: 'a + WeakElement> {
19 inner: InnerEntry<'a, K, V>,
20 value: V::Strong,
21}
22
23/// A vacant entry, which can be inserted in or viewed.
24pub struct VacantEntry<'a, K: 'a + WeakKey, V: 'a + WeakElement> {
25 inner: InnerEntry<'a, K, V>,
26}
27
28struct InnerEntry<'a, K: 'a + WeakKey, V: 'a> {
29 map: &'a mut WeakWeakInnerMap<K, V>,
30 pos: usize,
31 key: K::Strong,
32 hash_code: HashCode,
33}
34
35/// An iterator over the keys and values of the weak hash map.
36#[derive(Clone, Debug)]
37pub struct Iter<'a, K: 'a, V: 'a> {
David LeGare77e4bb92022-03-02 16:21:23 +000038 base: slice::Iter<'a, Bucket<K, V>>,
Joel Galenson2370d122020-10-12 16:02:26 -070039 size: usize,
40}
41
42impl<'a, K: WeakElement, V: WeakElement> Iterator for Iter<'a, K, V> {
43 type Item = (K::Strong, V::Strong);
44
45 fn next(&mut self) -> Option<Self::Item> {
David LeGare77e4bb92022-03-02 16:21:23 +000046 for bucket in &mut self.base {
Joel Galenson2370d122020-10-12 16:02:26 -070047 if let Some((ref weak_key, ref weak_value, _)) = *bucket {
48 self.size -= 1;
49 if let (Some(key), Some(value)) = (weak_key.view(), weak_value.view()) {
50 return Some((key, value));
51 }
52 }
53 }
54
55 None
56 }
57
58 fn size_hint(&self) -> (usize, Option<usize>) {
59 (0, Some(self.size))
60 }
61}
62
63/// An iterator over the keys of the weak hash map.
64#[derive(Clone, Debug)]
65pub struct Keys<'a, K: 'a, V: 'a>(Iter<'a, K, V>);
66
67impl<'a, K: WeakElement, V: WeakElement> Iterator for Keys<'a, K, V> {
68 type Item = K::Strong;
69
70 fn next(&mut self) -> Option<Self::Item> {
71 self.0.next().map(|(k, _)| k)
72 }
73
74 fn size_hint(&self) -> (usize, Option<usize>) {
75 self.0.size_hint()
76 }
77}
78
79/// An iterator over the values of the weak hash map.
80#[derive(Clone, Debug)]
81pub struct Values<'a, K: 'a, V: 'a>(Iter<'a, K, V>);
82
83impl<'a, K: WeakElement, V: WeakElement> Iterator for Values<'a, K, V> {
84 type Item = V::Strong;
85
86 fn next(&mut self) -> Option<Self::Item> {
87 self.0.next().map(|(_, v)| v)
88 }
89
90 fn size_hint(&self) -> (usize, Option<usize>) {
91 self.0.size_hint()
92 }
93}
94
95#[derive(Debug)]
96/// An iterator that consumes the values of a weak hash map, leaving it empty.
97pub struct Drain<'a, K: 'a, V: 'a> {
David LeGare77e4bb92022-03-02 16:21:23 +000098 base: slice::IterMut<'a, Bucket<K, V>>,
Joel Galenson2370d122020-10-12 16:02:26 -070099 size: usize,
100}
101
102impl<'a, K: WeakElement, V: WeakElement> Iterator for Drain<'a, K, V> {
103 type Item = (K::Strong, V::Strong);
104
105 fn next(&mut self) -> Option<Self::Item> {
David LeGare77e4bb92022-03-02 16:21:23 +0000106 for bucket in &mut self.base {
Joel Galenson2370d122020-10-12 16:02:26 -0700107 if let Some((weak_key, weak_value, _)) = bucket.take() {
108 self.size -= 1;
109 if let (Some(key), Some(value)) = (weak_key.view(), weak_value.view()) {
110 return Some((key, value));
111 }
112 }
113 }
114
115 None
116 }
117
118 fn size_hint(&self) -> (usize, Option<usize>) {
119 (0, Some(self.size))
120 }
121}
122
123impl<'a, K, V> Drop for Drain<'a, K, V> {
124 fn drop(&mut self) {
David LeGare77e4bb92022-03-02 16:21:23 +0000125 for option in &mut self.base {
Joel Galenson2370d122020-10-12 16:02:26 -0700126 *option = None;
127 }
128 }
129}
130
131/// An iterator that consumes the values of a weak hash map, leaving it empty.
132pub struct IntoIter<K, V> {
David LeGare77e4bb92022-03-02 16:21:23 +0000133 base: vec::IntoIter<Bucket<K, V>>,
Joel Galenson2370d122020-10-12 16:02:26 -0700134 size: usize,
135}
136
137impl<K: WeakElement, V: WeakElement> Iterator for IntoIter<K, V> {
138 type Item = (K::Strong, V::Strong);
139
140 fn next(&mut self) -> Option<Self::Item> {
David LeGare77e4bb92022-03-02 16:21:23 +0000141 for (weak_key, weak_value, _) in (&mut self.base).flatten() {
142 self.size -= 1;
143 if let (Some(key), Some(value)) = (weak_key.view(), weak_value.view()) {
144 return Some((key, value));
Joel Galenson2370d122020-10-12 16:02:26 -0700145 }
146 }
147
148 None
149 }
150
151 fn size_hint(&self) -> (usize, Option<usize>) {
152 (0, Some(self.size))
153 }
154}
155
156impl<K: WeakKey, V: WeakElement> WeakWeakHashMap<K, V, RandomState>
157{
158 /// Creates an empty `WeakWeakHashMap`.
David LeGare77e4bb92022-03-02 16:21:23 +0000159 ///
160 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700161 pub fn new() -> Self {
162 Self::with_capacity(DEFAULT_INITIAL_CAPACITY)
163 }
164
165 /// Creates an empty `WeakWeakHashMap` with the given capacity.
David LeGare77e4bb92022-03-02 16:21:23 +0000166 ///
167 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700168 pub fn with_capacity(capacity: usize) -> Self {
169 Self::with_capacity_and_hasher(capacity, Default::default())
170 }
171}
172
173impl<K: WeakKey, V: WeakElement, S: BuildHasher> WeakWeakHashMap<K, V, S> {
174 /// Creates an empty `WeakWeakHashMap` with the given capacity and hasher.
David LeGare77e4bb92022-03-02 16:21:23 +0000175 ///
176 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700177 pub fn with_hasher(hash_builder: S) -> Self {
178 Self::with_capacity_and_hasher(DEFAULT_INITIAL_CAPACITY, hash_builder)
179 }
180
181 /// Creates an empty `WeakWeakHashMap` with the given capacity and hasher.
David LeGare77e4bb92022-03-02 16:21:23 +0000182 ///
183 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700184 pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self {
185 WeakWeakHashMap {
186 hash_builder,
187 inner: WeakWeakInnerMap {
188 buckets: new_boxed_option_slice(capacity),
189 len: 0,
190 }
191 }
192 }
193
194 /// Returns a reference to the map's `BuildHasher`.
David LeGare77e4bb92022-03-02 16:21:23 +0000195 ///
196 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700197 pub fn hasher(&self) -> &S {
198 &self.hash_builder
199 }
200
201 /// Returns the number of elements the map can hold without reallocating.
David LeGare77e4bb92022-03-02 16:21:23 +0000202 ///
203 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700204 pub fn capacity(&self) -> usize {
205 self.inner.capacity()
206 }
207
208 /// This has some preconditions.
209 fn resize(&mut self, capacity: usize) {
210 let old_buckets = mem::replace(&mut self.inner.buckets,
211 new_boxed_option_slice(capacity));
212
213 let iter = IntoIter {
214 base: old_buckets.into_vec().into_iter(),
215 size: self.inner.len,
216 };
217
218 self.inner.len = 0;
219
220 for (key, value) in iter {
221 self.entry_no_grow(key).or_insert(value);
222 }
223 }
224
225 /// Removes all mappings whose keys have expired.
David LeGare77e4bb92022-03-02 16:21:23 +0000226 ///
227 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700228 pub fn remove_expired(&mut self) {
229 self.retain(|_, _| true)
230 }
231
232 /// Reserves room for additional elements.
David LeGare77e4bb92022-03-02 16:21:23 +0000233 ///
234 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700235 pub fn reserve(&mut self, additional_capacity: usize) {
236 let new_capacity = additional_capacity + self.capacity();
237 self.resize(new_capacity);
238 }
239
240 /// Shrinks the capacity to the minimum allowed to hold the current number of elements.
David LeGare77e4bb92022-03-02 16:21:23 +0000241 ///
242 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700243 pub fn shrink_to_fit(&mut self) {
244 self.remove_expired();
245 let new_capacity = (self.len() as f32 / COLLECT_LOAD_FACTOR).ceil() as usize;
246 self.resize(new_capacity);
247 }
248
249 /// Returns an over-approximation of the number of elements.
David LeGare77e4bb92022-03-02 16:21:23 +0000250 ///
251 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700252 pub fn len(&self) -> usize {
253 self.inner.len
254 }
255
256 /// Is the map empty?
257 ///
258 /// Note that this may return false even if all keys in the map have
259 /// expired, if they haven't been collected yet.
David LeGare77e4bb92022-03-02 16:21:23 +0000260 ///
261 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700262 pub fn is_empty(&self) -> bool {
263 self.len() == 0
264 }
265
266 /// The proportion of buckets that are used.
267 ///
268 /// This is an over-approximation because of expired keys.
David LeGare77e4bb92022-03-02 16:21:23 +0000269 ///
270 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700271 pub fn load_factor(&self) -> f32 {
272 (self.len() as f32 + 1.0) / self.capacity() as f32
273 }
274
275 fn maybe_adjust_size(&mut self) {
276 if self.load_factor() > COLLECT_LOAD_FACTOR {
277 self.remove_expired();
278
279 let load_factor = self.load_factor();
280 let capacity = self.capacity();
281 if load_factor > GROW_LOAD_FACTOR {
282 self.resize(max(1, capacity * 2));
283 } else if load_factor < SHRINK_LOAD_FACTOR && capacity > DEFAULT_INITIAL_CAPACITY {
284 self.resize(max(1, capacity / 2));
285 }
286 }
287 }
288
289 /// Gets the requested entry.
David LeGare77e4bb92022-03-02 16:21:23 +0000290 ///
291 /// expected *O*(*n*) time; worst-case *O*(*nq*) time (where *n* is
292 /// `self.capacity()` and *q* is the length of the probe sequences
293 /// in `other`)
Joel Galenson2370d122020-10-12 16:02:26 -0700294 pub fn entry(&mut self, key: K::Strong) -> Entry<K, V> {
295 self.maybe_adjust_size();
296 self.entry_no_grow(key)
297 }
298
299 fn entry_no_grow(&mut self, key: K::Strong) -> Entry<K, V> {
300 let mut inner = {
David LeGare77e4bb92022-03-02 16:21:23 +0000301 let hash_code = self.hash(&key, K::hash);
Joel Galenson2370d122020-10-12 16:02:26 -0700302 InnerEntry {
303 pos: self.which_bucket(hash_code),
304 map: &mut self.inner,
305 hash_code,
306 key,
307 }
308 };
309
310 for dist in 0 .. inner.capacity() {
311 match inner.bucket_status() {
312 BucketStatus::Unoccupied =>
313 return Entry::Vacant(VacantEntry {inner}),
314 BucketStatus::MatchesKey(value) =>
315 return Entry::Occupied(OccupiedEntry {value, inner}),
316 BucketStatus::ProbeDistance(bucket_distance) => {
317 if bucket_distance < dist {
318 return Entry::Vacant(VacantEntry {inner})
319 } else {
320 inner.pos = inner.next_bucket(inner.pos);
321 }
322 }
323 }
324 }
325
326 panic!("WeakKeyHashTable::entry: out of space");
327 }
328
329 /// Removes all associations from the map.
David LeGare77e4bb92022-03-02 16:21:23 +0000330 ///
331 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700332 pub fn clear(&mut self) {
333 self.drain();
334 }
335
336 fn find_bucket<Q>(&self, key: &Q) -> Option<(usize, K::Strong, V::Strong)>
337 where Q: ?Sized + Hash + Eq,
338 K::Key: Borrow<Q>
339 {
340 if self.capacity() == 0 { return None; }
341
David LeGare77e4bb92022-03-02 16:21:23 +0000342 let hash_code = self.hash(key, Q::hash);
Joel Galenson2370d122020-10-12 16:02:26 -0700343 let mut pos = self.which_bucket(hash_code);
344
345 for dist in 0 .. self.capacity() {
346 if let Some((ref w_key, ref w_value, b_hash_code)) = self.inner.buckets[pos] {
347 if b_hash_code == hash_code {
348 if let (Some(b_key), Some(b_value)) = (w_key.view(), w_value.view()) {
David LeGare77e4bb92022-03-02 16:21:23 +0000349 if K::equals(&b_key, key) {
Joel Galenson2370d122020-10-12 16:02:26 -0700350 return Some((pos, b_key, b_value));
351 }
352 }
353 }
354
355 let bucket_dist =
356 self.probe_distance(pos, self.which_bucket(hash_code));
357 if bucket_dist < dist {
358 return None;
359 }
360 } else {
361 return None;
362 }
363
364 pos = self.next_bucket(pos);
365 }
366
367 None
368 }
369
370 /// Returns a reference to the value corresponding to the key.
David LeGare77e4bb92022-03-02 16:21:23 +0000371 ///
372 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700373 pub fn get<Q>(&self, key: &Q) -> Option<V::Strong>
374 where Q: ?Sized + Hash + Eq,
375 K::Key: Borrow<Q>
376 {
377 self.find_bucket(key).map(|tup| tup.2)
378 }
379
380 /// Returns the strong reference to the key, if present.
David LeGare77e4bb92022-03-02 16:21:23 +0000381 ///
382 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700383 pub fn get_key<Q>(&self, key: &Q) -> Option<K::Strong>
384 where Q: ?Sized + Hash + Eq,
385 K::Key: Borrow<Q>
386 {
387 self.find_bucket(key).map(|tup| tup.1)
388 }
389
390 /// Returns strong references to both the key and the value, if present.
David LeGare77e4bb92022-03-02 16:21:23 +0000391 ///
392 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700393 pub fn get_both<Q>(&self, key: &Q) -> Option<(K::Strong, V::Strong)>
394 where Q: ?Sized + Hash + Eq,
395 K::Key: Borrow<Q>
396 {
397 self.find_bucket(key).map(|tup| (tup.1, tup.2))
398 }
399
400 /// Returns true if the map contains the specified key.
David LeGare77e4bb92022-03-02 16:21:23 +0000401 ///
402 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700403 pub fn contains_key<Q>(&self, key: &Q) -> bool
404 where Q: ?Sized + Hash + Eq,
405 K::Key: Borrow<Q>
406 {
407 self.find_bucket(key).is_some()
408 }
409
410 /// Unconditionally inserts the value, returning the old value if already present.
411 ///
412 /// Unlike `std::collections::HashMap`, this replaces the key even if occupied.
David LeGare77e4bb92022-03-02 16:21:23 +0000413 ///
414 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700415 pub fn insert(&mut self, key: K::Strong, value: V::Strong) -> Option<V::Strong> {
416 match self.entry(key) {
417 Entry::Occupied(mut occupied) => {
418 Some(occupied.insert(value))
419 },
420 Entry::Vacant(vacant) => {
421 vacant.insert(value);
422 None
423 }
424 }
425 }
426
427 /// Removes the entry with the given key, if it exists, and returns the value.
David LeGare77e4bb92022-03-02 16:21:23 +0000428 ///
429 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700430 pub fn remove<Q>(&mut self, key: &Q) -> Option<V::Strong>
431 where Q: ?Sized + Hash + Eq,
432 K::Key: Borrow<Q>
433 {
434 if let Some((pos, _, value)) = self.find_bucket(key) {
435 self.inner.remove_index(pos);
436 Some(value)
437 } else {
438 None
439 }
440 }
441
442 /// Removes all mappings not satisfying the given predicate.
443 ///
444 /// Also removes any expired mappings.
David LeGare77e4bb92022-03-02 16:21:23 +0000445 ///
446 /// *O*(*n*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700447 pub fn retain<F>(&mut self, mut f: F)
448 where F: FnMut(K::Strong, V::Strong) -> bool
449 {
450 for i in 0 .. self.capacity() {
451 let remove = match self.inner.buckets[i] {
452 None => false,
453 Some(ref bucket) =>
454 match (bucket.0.view(), bucket.1.view()) {
455 (Some(key), Some(value)) => !f(key, value),
456 _ => true,
457 }
458 };
459
460 if remove {
461 self.inner.remove_index(i);
462 }
463 }
464 }
465
466 /// Is this map a submap of the other, using the given value comparison.
467 ///
468 /// In particular, all the keys of `self` must be in `other` and the values must compare
469 /// `true` with `value_equal`.
David LeGare77e4bb92022-03-02 16:21:23 +0000470 ///
471 /// expected *O*(*n*) time; worst-case *O*(*nq*) time (where *n* is
472 /// `self.capacity()` and *q* is the length of the probe sequences
473 /// in `other`)
Joel Galenson2370d122020-10-12 16:02:26 -0700474 pub fn is_submap_with<F, S1, V1>(&self, other: &WeakWeakHashMap<K, V1, S1>,
475 mut value_equal: F) -> bool
476 where V1: WeakElement,
477 F: FnMut(V::Strong, V1::Strong) -> bool,
478 S1: BuildHasher
479 {
480 for (key, value1) in self {
481 if let Some(value2) = K::with_key(&key, |k| other.get(k)) {
482 if !value_equal(value1, value2) {
483 return false;
484 }
485 } else {
486 return false;
487 }
488 }
489
490 true
491 }
492
493 /// Is `self` a submap of `other`?
David LeGare77e4bb92022-03-02 16:21:23 +0000494 ///
495 /// expected *O*(*n*) time; worst-case *O*(*nq*) time (where *n* is
496 /// `self.capacity()` and *q* is the length of the probe sequences
497 /// in `other`)
Joel Galenson2370d122020-10-12 16:02:26 -0700498 pub fn is_submap<V1, S1>(&self, other: &WeakWeakHashMap<K, V1, S1>) -> bool
499 where V1: WeakElement,
500 V::Strong: PartialEq<V1::Strong>,
501 S1: BuildHasher
502 {
503 self.is_submap_with(other, |v, v1| v == v1)
504 }
505
506 /// Are the keys of `self` a subset of the keys of `other`?
David LeGare77e4bb92022-03-02 16:21:23 +0000507 ///
508 /// expected *O*(*n*) time; worst-case *O*(*nq*) time (where *n* is
509 /// `self.capacity()` and *q* is the length of the probe sequences
510 /// in `other`)
Joel Galenson2370d122020-10-12 16:02:26 -0700511 pub fn domain_is_subset<V1, S1>(&self, other: &WeakWeakHashMap<K, V1, S1>) -> bool
512 where V1: WeakElement,
513 S1: BuildHasher
514 {
515 self.is_submap_with(other, |_, _| true)
516 }
517
David LeGare77e4bb92022-03-02 16:21:23 +0000518 fn hash<Q, H>(&self, key: Q, hash: H) -> HashCode
519 where H: FnOnce(Q, &mut S::Hasher)
Joel Galenson2370d122020-10-12 16:02:26 -0700520 {
David LeGare77e4bb92022-03-02 16:21:23 +0000521 let hasher = &mut self.hash_builder.build_hasher();
522 hash(key, hasher);
Joel Galenson2370d122020-10-12 16:02:26 -0700523 HashCode(hasher.finish())
524 }
525}
526
527impl<K, V, V1, S, S1> PartialEq<WeakWeakHashMap<K, V1, S1>> for WeakWeakHashMap<K, V, S>
528 where K: WeakKey,
529 V: WeakElement,
530 V1: WeakElement,
531 V::Strong: PartialEq<V1::Strong>,
532 S: BuildHasher,
533 S1: BuildHasher
534{
535 fn eq(&self, other: &WeakWeakHashMap<K, V1, S1>) -> bool {
536 self.is_submap(other) && other.domain_is_subset(self)
537 }
538}
539
540impl<K: WeakKey, V: WeakElement, S: BuildHasher> Eq for WeakWeakHashMap<K, V, S>
541 where V::Strong: Eq
542{ }
543
544impl<K: WeakKey, V: WeakElement, S: BuildHasher + Default> Default for WeakWeakHashMap<K, V, S> {
545 fn default() -> Self {
546 WeakWeakHashMap::with_hasher(Default::default())
547 }
548}
549
David LeGare77e4bb92022-03-02 16:21:23 +0000550impl<K, V, S> iter::FromIterator<(K::Strong, V::Strong)> for WeakWeakHashMap<K, V, S>
Joel Galenson2370d122020-10-12 16:02:26 -0700551 where K: WeakKey,
552 V: WeakElement,
553 S: BuildHasher + Default
554{
555 fn from_iter<T: IntoIterator<Item=(K::Strong, V::Strong)>>(iter: T) -> Self {
556 let mut result = WeakWeakHashMap::with_hasher(Default::default());
557 result.extend(iter);
558 result
559 }
560}
561
562impl<K, V, S> Extend<(K::Strong, V::Strong)> for WeakWeakHashMap<K, V, S>
563 where K: WeakKey,
564 V: WeakElement,
565 S: BuildHasher
566{
567 fn extend<T: IntoIterator<Item=(K::Strong, V::Strong)>>(&mut self, iter: T) {
568 for (key, value) in iter {
569 self.insert(key, value);
570 }
571 }
572}
573
574enum BucketStatus<V: WeakElement> {
575 Unoccupied,
576 MatchesKey(V::Strong),
577 ProbeDistance(usize),
578}
579
580impl<'a, K: WeakKey, V: WeakElement> InnerEntry<'a, K, V> {
581 // Gets the status of the current bucket.
582 fn bucket_status(&self) -> BucketStatus<V> {
583 match &self.map.buckets[self.pos] {
584 Some(bucket) => {
585 if bucket.2 == self.hash_code {
586 if let (Some(key), Some(value)) = (bucket.0.view(), bucket.1.view()) {
David LeGare77e4bb92022-03-02 16:21:23 +0000587 if K::with_key(&self.key, |k| K::equals(&key, k)) {
Joel Galenson2370d122020-10-12 16:02:26 -0700588 return BucketStatus::MatchesKey(value);
589 }
590 }
591 }
592
593 let dist = self.probe_distance(self.pos,
594 self.which_bucket(bucket.2));
595 BucketStatus::ProbeDistance(dist)
596 },
597 None => BucketStatus::Unoccupied,
598 }
599 }
600}
601
602impl<'a, K: WeakKey, V: WeakElement> Entry<'a, K, V> {
603 /// Ensures a value is in the entry by inserting a default value
604 /// if empty, and returns a mutable reference to the value in the
605 /// entry.
David LeGare77e4bb92022-03-02 16:21:23 +0000606 ///
607 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700608 pub fn or_insert(self, default: V::Strong) -> V::Strong {
609 self.or_insert_with(|| default)
610 }
611
612 /// Ensures a value is in the entry by inserting the result of the
613 /// default function if empty, and returns a mutable reference to
614 /// the value in the entry.
David LeGare77e4bb92022-03-02 16:21:23 +0000615 ///
616 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700617 pub fn or_insert_with<F: FnOnce() -> V::Strong>(self, default: F) -> V::Strong {
618 match self {
619 Entry::Occupied(occupied) => occupied.get_strong(),
620 Entry::Vacant(vacant) => vacant.insert(default()),
621 }
622 }
623
624 /// Returns a reference to this entry's key.
David LeGare77e4bb92022-03-02 16:21:23 +0000625 ///
626 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700627 pub fn key(&self) -> &K::Strong {
628 match *self {
629 Entry::Occupied(ref occupied) => occupied.key(),
630 Entry::Vacant(ref vacant) => vacant.key(),
631 }
632 }
633}
634
635impl<'a, K: WeakKey, V: WeakElement> OccupiedEntry<'a, K, V> {
636 /// Gets a reference to the key held by the entry.
David LeGare77e4bb92022-03-02 16:21:23 +0000637 ///
638 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700639 pub fn key(&self) -> &K::Strong {
640 &self.inner.key
641 }
642
643 /// Takes ownership of the key and value from the map.
David LeGare77e4bb92022-03-02 16:21:23 +0000644 ///
645 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700646 pub fn remove_entry(self) -> (K::Strong, V::Strong) {
647 let (_, w_value, _) = self.inner.map.buckets[self.inner.pos].take().unwrap();
648 let value = w_value.view().unwrap();
649 self.inner.map.remove_index(self.inner.pos);
650 (self.inner.key, value)
651 }
652
653 /// Gets a reference to the value in the entry.
David LeGare77e4bb92022-03-02 16:21:23 +0000654 ///
655 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700656 pub fn get(&self) -> &V::Strong {
657 &self.value
658 }
659
660 /// Gets a clone of the reference to the value in the entry.
David LeGare77e4bb92022-03-02 16:21:23 +0000661 ///
662 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700663 pub fn get_strong(&self) -> V::Strong {
664 V::clone(&self.value)
665 }
666
667 /// Replaces the value in the entry with the given value.
David LeGare77e4bb92022-03-02 16:21:23 +0000668 ///
669 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700670 pub fn insert(&mut self, value: V::Strong) -> V::Strong {
671 self.inner.map.buckets[self.inner.pos].as_mut().unwrap().1 = V::new(&value);
672 mem::replace(&mut self.value, value)
673 }
674
675 /// Removes the entry, returning the value.
David LeGare77e4bb92022-03-02 16:21:23 +0000676 ///
677 /// expected *O*(1) time; worst-case *O*(*p*) time
Joel Galenson2370d122020-10-12 16:02:26 -0700678 pub fn remove(self) -> V::Strong {
679 self.remove_entry().1
680 }
681}
682
683impl<'a, K: WeakKey, V: WeakElement> VacantEntry<'a, K, V> {
684 /// Gets a reference to the key that would be used when inserting a
685 /// value through the `VacantEntry`.
David LeGare77e4bb92022-03-02 16:21:23 +0000686 ///
687 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700688 pub fn key(&self) -> &K::Strong {
689 &self.inner.key
690 }
691
692 /// Returns ownership of the key.
David LeGare77e4bb92022-03-02 16:21:23 +0000693 ///
694 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700695 pub fn into_key(self) -> K::Strong {
696 self.inner.key
697 }
698
699 /// Inserts the key and value into the map, returning the same value.
David LeGare77e4bb92022-03-02 16:21:23 +0000700 ///
701 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700702 pub fn insert(self, value: V::Strong) -> V::Strong {
703 let old_bucket = mem::replace(
704 &mut self.inner.map.buckets[self.inner.pos],
705 Some((K::new(&self.inner.key), V::new(&value), self.inner.hash_code)));
706
707 if let Some(full_bucket) = old_bucket {
708 let next_bucket = self.next_bucket(self.inner.pos);
709 self.inner.map.steal(next_bucket, full_bucket);
710 }
711
712 self.inner.map.len += 1;
713
714 value
715 }
716}
717
718impl<K: WeakKey, V: WeakElement> WeakWeakInnerMap<K, V> {
719 // Steals buckets starting at `pos`, replacing them with `bucket`.
720 fn steal(&mut self, mut pos: usize, mut bucket: FullBucket<K, V>) {
721 let mut my_dist = self.probe_distance(pos, self.which_bucket(bucket.2));
722
723 while let Some(hash_code) = self.buckets[pos].as_ref().and_then(
724 |bucket| if bucket.0.is_expired() || bucket.1.is_expired() {
725 None
726 } else {
727 Some(bucket.2)
728 }) {
729
730 let victim_dist = self.probe_distance(pos, self.which_bucket(hash_code));
731
732 if my_dist > victim_dist {
733 mem::swap(self.buckets[pos].as_mut().unwrap(), &mut bucket);
734 my_dist = victim_dist;
735 }
736
737 pos = self.next_bucket(pos);
738 my_dist += 1;
739 }
740
741 self.buckets[pos] = Some(bucket);
742 }
743
744 /// Removes the element at `dst`, shifting if necessary to preserve invariants.
745 fn remove_index(&mut self, mut dst: usize) {
746 let mut src = self.next_bucket(dst);
747
748 // We are going to remove the buckets in the range [dst, src)
749
750 loop {
751 let hash_code_option = self.buckets[src].as_ref().map(|tup| tup.2);
752
753 if let Some(hash_code) = hash_code_option {
754 let goal_pos = self.which_bucket(hash_code);
755 let dist = self.probe_distance(src, goal_pos);
756 if dist == 0 { break; }
757
758 let expired = {
759 let bucket = self.buckets[src].as_ref().unwrap();
760 bucket.0.is_expired() || bucket.1.is_expired()
761 };
762
763 if !expired {
764 if in_interval(dst, goal_pos, src) {
765 self.erase_range(dst, goal_pos);
766 self.buckets[goal_pos] = self.buckets[src].take();
767 dst = self.next_bucket(goal_pos);
768 } else {
769 self.buckets[dst] = self.buckets[src].take();
770 dst = self.next_bucket(dst);
771 }
772 }
773 } else {
774 break;
775 }
776
777 src = self.next_bucket(src);
778 }
779
780 self.erase_range(dst, src);
781 }
782
783 /// Erases the (presumably expired, but not empty) elements in [start, limit).
784 fn erase_range(&mut self, mut start: usize, limit: usize)
785 {
786 while start != limit {
787 self.buckets[start] = None;
788 self.len -= 1;
789 start = self.next_bucket(start);
790 }
791 }
792}
793
794// Is value in [start, limit) modulo capacity?
795fn in_interval(start: usize, value: usize, limit: usize) -> bool
796{
797 if start <= limit {
798 start <= value && value < limit
799 } else {
800 start <= value || value < limit
801 }
802}
803
804// Helper trait for computing with indices modulo capacity.
805trait ModuloCapacity {
806 fn capacity(&self) -> usize;
807
808 fn probe_distance(&self, actual: usize, ideal: usize) -> usize {
809 if actual >= ideal {
810 actual - ideal
811 } else {
812 actual + self.capacity() - ideal
813 }
814 }
815
816 fn next_bucket(&self, pos: usize) -> usize {
817 assert_ne!( self.capacity(), 0 );
818 (pos + 1) % self.capacity()
819 }
820
821 fn which_bucket(&self, hash_code: HashCode) -> usize {
822 assert_ne!( self.capacity(), 0 );
823 (hash_code.0 as usize) % self.capacity()
824 }
825}
826
827impl<K, V> ModuloCapacity for WeakWeakInnerMap<K, V> {
828 fn capacity(&self) -> usize {
829 self.buckets.len()
830 }
831}
832
833impl<K, V, S> ModuloCapacity for WeakWeakHashMap<K, V, S> {
834 fn capacity(&self) -> usize {
835 self.inner.capacity()
836 }
837}
838
839impl<'a, K: WeakKey, V: WeakElement> ModuloCapacity for InnerEntry<'a, K, V> {
840 fn capacity(&self) -> usize {
841 self.map.capacity()
842 }
843}
844
845impl<'a, K: WeakKey, V: WeakElement> ModuloCapacity for OccupiedEntry<'a, K, V> {
846 fn capacity(&self) -> usize {
847 self.inner.capacity()
848 }
849}
850
851impl<'a, K: WeakKey, V: WeakElement> ModuloCapacity for VacantEntry<'a, K, V> {
852 fn capacity(&self) -> usize {
853 self.inner.capacity()
854 }
855}
856
857impl<K, V> Debug for WeakWeakInnerMap<K, V>
858 where K: WeakElement,
859 K::Strong: Debug,
860 V: WeakElement,
861 V::Strong: Debug
862{
863 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
864 write!(f, "{{ ")?;
865 for (i, bucket) in self.buckets.iter().enumerate() {
866 if let Some((k, v, _)) = bucket {
867 write!(f, "[{}] {:?} => {:?}, ", i, k.view(), v.view())?;
868 }
869 }
870 write!(f, "}}")
871 }
872}
873
874impl<K: WeakElement, V: WeakElement, S> Debug for WeakWeakHashMap<K, V, S>
875 where K::Strong: Debug,
876 V::Strong: Debug
877{
878 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
879 self.inner.fmt(f)
880 }
881}
882
883impl<'a, K: WeakKey, V: WeakElement> Debug for Entry<'a, K, V>
884 where K::Strong: Debug,
885 V::Strong: Debug
886{
887 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
888 match *self {
889 Entry::Occupied(ref e) => e.fmt(f),
890 Entry::Vacant(ref e) => e.fmt(f),
891 }
892 }
893}
894
895impl<'a, K: WeakKey, V: WeakElement> Debug for OccupiedEntry<'a, K, V>
896 where K::Strong: Debug,
897 V::Strong: Debug
898{
899 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
900 self.inner.fmt(f)
901 }
902}
903
904impl<'a, K: WeakKey, V: WeakElement> Debug for VacantEntry<'a, K, V>
905 where K::Strong: Debug,
906 V::Strong: Debug
907{
908 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
909 self.inner.fmt(f)
910 }
911}
912
913impl<'a, K: WeakKey, V: WeakElement> Debug for InnerEntry<'a, K, V>
914 where K::Strong: Debug,
915 V::Strong: Debug
916{
917 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
918 write!(f, "InnerEntry {{ pos = {}, buckets = {:?} }}", self.pos, self.map)
919 }
920}
921
922impl<K: WeakElement, V: WeakElement, S> IntoIterator for WeakWeakHashMap<K, V, S> {
923 type Item = (K::Strong, V::Strong);
924 type IntoIter = IntoIter<K, V>;
925
David LeGare77e4bb92022-03-02 16:21:23 +0000926 /// Creates an owning iterator from `self`.
927 ///
928 /// *O*(1) time (and *O*(*n*) time to dispose of the result)
Joel Galenson2370d122020-10-12 16:02:26 -0700929 fn into_iter(self) -> Self::IntoIter {
930 IntoIter {
931 size: self.inner.len,
932 base: self.inner.buckets.into_vec().into_iter(),
933 }
934 }
935}
936
937impl<'a, K: WeakElement, V: WeakElement, S> IntoIterator for &'a WeakWeakHashMap<K, V, S> {
938 type Item = (K::Strong, V::Strong);
939 type IntoIter = Iter<'a, K, V>;
940
David LeGare77e4bb92022-03-02 16:21:23 +0000941 /// Creates a borrowing iterator from `self`.
942 ///
943 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700944 fn into_iter(self) -> Self::IntoIter {
945 Iter {
946 base: self.inner.buckets.iter(),
947 size: self.inner.len,
948 }
949 }
950}
951
952impl<K: WeakElement, V: WeakElement, S> WeakWeakHashMap<K, V, S> {
953 /// Gets an iterator over the keys and values.
David LeGare77e4bb92022-03-02 16:21:23 +0000954 ///
955 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700956 pub fn iter(&self) -> Iter<K, V> {
957 self.into_iter()
958 }
959
960 /// Gets an iterator over the keys.
David LeGare77e4bb92022-03-02 16:21:23 +0000961 ///
962 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700963 pub fn keys(&self) -> Keys<K, V> {
964 Keys(self.iter())
965 }
966
967 /// Gets an iterator over the values.
David LeGare77e4bb92022-03-02 16:21:23 +0000968 ///
969 /// *O*(1) time
Joel Galenson2370d122020-10-12 16:02:26 -0700970 pub fn values(&self) -> Values<K, V> {
971 Values(self.iter())
972 }
973
974 /// Gets a draining iterator, which removes all the values but retains the storage.
David LeGare77e4bb92022-03-02 16:21:23 +0000975 ///
976 /// *O*(1) time (and *O*(*n*) time to dispose of the result)
Joel Galenson2370d122020-10-12 16:02:26 -0700977 pub fn drain(&mut self) -> Drain<K, V> {
978 let old_len = self.inner.len;
979 self.inner.len = 0;
980 Drain {
981 base: self.inner.buckets.iter_mut(),
982 size: old_len,
983 }
984 }
985}
986