weak_table/
weak_weak_hash_map.rs

1//! A hash map where the keys and values are both held by weak pointers, and keys are compared by
2//! value.
3
4use 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> {
38    base: slice::Iter<'a, Bucket<K, V>>,
39    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> {
46        for bucket in &mut self.base {
47            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> {
98    base: slice::IterMut<'a, Bucket<K, V>>,
99    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> {
106        for bucket in &mut self.base {
107            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) {
125        for option in &mut self.base {
126            *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> {
133    base: vec::IntoIter<Bucket<K, V>>,
134    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> {
141        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));
145            }
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`.
159    ///
160    /// *O*(1) time
161    pub fn new() -> Self {
162        Self::with_capacity(DEFAULT_INITIAL_CAPACITY)
163    }
164
165    /// Creates an empty `WeakWeakHashMap` with the given capacity.
166    ///
167    /// *O*(*n*) time
168    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.
175    ///
176    /// *O*(*n*) time
177    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.
182    ///
183    /// *O*(*n*) time
184    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`.
195    ///
196    /// *O*(1) time
197    pub fn hasher(&self) -> &S {
198        &self.hash_builder
199    }
200
201    /// Returns the number of elements the map can hold without reallocating.
202    ///
203    /// *O*(1) time
204    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.
226    ///
227    /// *O*(*n*) time
228    pub fn remove_expired(&mut self) {
229        self.retain(|_, _| true)
230    }
231
232    /// Reserves room for additional elements.
233    ///
234    /// *O*(*n*) time
235    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.
241    ///
242    /// *O*(*n*) time
243    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.
250    ///
251    /// *O*(1) time
252    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.
260    ///
261    /// *O*(1) time
262    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.
269    ///
270    /// *O*(1) time
271    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.
290    ///
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`)
294    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 = {
301            let hash_code = self.hash(&key, K::hash);
302            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.
330    ///
331    /// *O*(*n*) time
332    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
342        let hash_code = self.hash(key, Q::hash);
343        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()) {
349                        if K::equals(&b_key, key) {
350                            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.
371    ///
372    /// expected *O*(1) time; worst-case *O*(*p*) time
373    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.
381    ///
382    /// expected *O*(1) time; worst-case *O*(*p*) time
383    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.
391    ///
392    /// expected *O*(1) time; worst-case *O*(*p*) time
393    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.
401    ///
402    /// expected *O*(1) time; worst-case *O*(*p*) time
403    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.
413    ///
414    /// expected *O*(1) time; worst-case *O*(*p*) time
415    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.
428    ///
429    /// expected *O*(1) time; worst-case *O*(*p*) time
430    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.
445    ///
446    /// *O*(*n*) time
447    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`.
470    ///
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`)
474    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`?
494    ///
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`)
498    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`?
507    ///
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`)
511    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
518    fn hash<Q, H>(&self, key: Q, hash: H) -> HashCode
519        where H: FnOnce(Q, &mut S::Hasher)
520    {
521        let hasher = &mut self.hash_builder.build_hasher();
522        hash(key, hasher);
523        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
550impl<K, V, S> iter::FromIterator<(K::Strong, V::Strong)> for WeakWeakHashMap<K, V, S>
551    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()) {
587                        if K::with_key(&self.key, |k| K::equals(&key, k)) {
588                            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.
606    ///
607    /// *O*(1) time
608    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.
615    ///
616    /// *O*(1) time
617    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.
625    ///
626    /// *O*(1) time
627    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.
637    ///
638    /// *O*(1) time
639    pub fn key(&self) -> &K::Strong {
640        &self.inner.key
641    }
642
643    /// Takes ownership of the key and value from the map.
644    ///
645    /// expected *O*(1) time; worst-case *O*(*p*) time
646    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.
654    ///
655    /// *O*(1) time
656    pub fn get(&self) -> &V::Strong {
657        &self.value
658    }
659
660    /// Gets a clone of the reference to the value in the entry.
661    ///
662    /// *O*(1) time
663    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.
668    ///
669    /// *O*(1) time
670    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.
676    ///
677    /// expected *O*(1) time; worst-case *O*(*p*) time
678    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`.
686    ///
687    /// *O*(1) time
688    pub fn key(&self) -> &K::Strong {
689        &self.inner.key
690    }
691
692    /// Returns ownership of the key.
693    ///
694    /// *O*(1) time
695    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.
700    ///
701    /// *O*(1) time
702    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
926    /// Creates an owning iterator from `self`.
927    ///
928    /// *O*(1) time (and *O*(*n*) time to dispose of the result)
929    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
941    /// Creates a borrowing iterator from `self`.
942    ///
943    /// *O*(1) time
944    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.
954    ///
955    /// *O*(1) time
956    pub fn iter(&self) -> Iter<K, V> {
957        self.into_iter()
958    }
959
960    /// Gets an iterator over the keys.
961    ///
962    /// *O*(1) time
963    pub fn keys(&self) -> Keys<K, V> {
964        Keys(self.iter())
965    }
966
967    /// Gets an iterator over the values.
968    ///
969    /// *O*(1) time
970    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.
975    ///
976    /// *O*(1) time (and *O*(*n*) time to dispose of the result)
977    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