Skip to main content

compact/
compact_hash_map.rs

1extern crate primal;
2
3use super::compact::Compact;
4use super::compact_vec::CompactVec;
5use super::simple_allocator_trait::{Allocator, DefaultHeap};
6use std::collections::hash_map::DefaultHasher;
7#[cfg(test)]
8use std::collections::HashMap;
9use std::hash::Hash;
10use std::hash::Hasher;
11use std::iter::Iterator;
12
13use std;
14use std::fmt::Write;
15
16#[derive(Clone)]
17struct Entry<K, V> {
18    hash: u32,
19    tombstoned: bool,
20    inner: Option<(K, V)>,
21}
22
23struct QuadraticProbingIterator<'a, K: 'a, V: 'a, A: 'a + Allocator = DefaultHeap> {
24    i: usize,
25    number_used: usize,
26    hash: u32,
27    map: &'a OpenAddressingMap<K, V, A>,
28}
29
30struct QuadraticProbingMutIterator<'a, K: 'a, V: 'a, A: 'a + Allocator = DefaultHeap> {
31    i: usize,
32    number_used: usize,
33    hash: u32,
34    map: &'a mut OpenAddressingMap<K, V, A>,
35}
36
37/// A dynamically-sized open adressing quadratic probing hashmap
38/// that can be stored in compact sequential storage and
39/// automatically spills over into free heap storage using `Allocator`.
40pub struct OpenAddressingMap<K, V, A: Allocator = DefaultHeap> {
41    number_alive: u32,
42    number_used: u32,
43    entries: CompactVec<Entry<K, V>, A>,
44}
45
46impl<K: Eq, V: Clone> Entry<K, V> {
47    fn make_used(&mut self, hash: u32, key: K, value: V) {
48        self.hash = hash;
49        self.inner = Some((key, value));
50    }
51
52    fn replace_value(&mut self, new_val: V) -> Option<V> {
53        debug_assert!(self.used());
54        match self.inner.as_mut() {
55            None => None,
56            Some(kv) => {
57                let old = kv.1.clone();
58                kv.1 = new_val;
59                Some(old)
60            }
61        }
62    }
63
64    fn remove(&mut self) -> Option<V> {
65        let old_val = self.value_option().cloned();
66        self.inner = None;
67        self.tombstoned = true;
68        old_val
69    }
70
71    fn used(&self) -> bool {
72        self.tombstoned || self.inner.is_some()
73    }
74
75    fn alive(&self) -> bool {
76        self.inner.is_some()
77    }
78
79    fn free(&self) -> bool {
80        self.inner.is_none() && (!self.tombstoned)
81    }
82
83    fn key(&self) -> &K {
84        &self.inner.as_ref().unwrap().0
85    }
86
87    fn value(&self) -> &V {
88        self.inner.as_ref().map(|kv| &kv.1).unwrap()
89    }
90
91    fn value_option(&self) -> Option<&V> {
92        self.inner.as_ref().map(|kv| &kv.1)
93    }
94
95    fn mut_value(&mut self) -> &mut V {
96        self.inner.as_mut().map(|kv| &mut kv.1).unwrap()
97    }
98
99    fn mut_value_option(&mut self) -> Option<&mut V> {
100        self.inner.as_mut().map(|kv| &mut kv.1)
101    }
102
103    fn is_this(&self, key: &K) -> bool {
104        self.inner.as_ref().map_or(false, |kv| &kv.0 == key)
105    }
106
107    fn into_tuple(self) -> (K, V) {
108        debug_assert!(self.alive());
109        let kv = self.inner.unwrap();
110        (kv.0, kv.1)
111    }
112}
113
114impl<K, V> std::fmt::Debug for Entry<K, V> {
115    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
116        write!(f, "Entry {:?}, {:?}", self.hash, self.inner.is_some())
117    }
118}
119
120impl<K, V> Default for Entry<K, V> {
121    fn default() -> Self {
122        Entry {
123            hash: 0,
124            tombstoned: false,
125            inner: None,
126        }
127    }
128}
129
130impl<K: Copy, V: Compact> Compact for Entry<K, V> {
131    default fn is_still_compact(&self) -> bool {
132        if self.tombstoned {
133            true
134        } else {
135            self.inner
136                .as_ref()
137                .map_or(true, |kv_tuple| kv_tuple.1.is_still_compact())
138        }
139    }
140
141    default fn dynamic_size_bytes(&self) -> usize {
142        if self.tombstoned {
143            0
144        } else {
145            self.inner
146                .as_ref()
147                .map_or(0, |kv_tuple| kv_tuple.1.dynamic_size_bytes())
148        }
149    }
150
151    default unsafe fn compact(source: *mut Self, dest: *mut Self, new_dynamic_part: *mut u8) {
152        (*dest).hash = (*source).hash;
153        (*dest).tombstoned = (*source).tombstoned;
154        ::std::ptr::copy_nonoverlapping(&(*source).inner, &mut (*dest).inner, 1);
155        if (*dest).inner.is_some() {
156            Compact::compact(
157                &mut (*source).inner.as_mut().unwrap().1,
158                &mut (*dest).inner.as_mut().unwrap().1,
159                new_dynamic_part,
160            )
161        }
162    }
163
164    default unsafe fn decompact(source: *const Self) -> Entry<K, V> {
165        if (*source).inner.is_none() {
166            Entry {
167                hash: (*source).hash,
168                tombstoned: (*source).tombstoned,
169                inner: None,
170            }
171        } else {
172            let insides = (*source).inner.as_ref().unwrap();
173            Entry {
174                hash: (*source).hash,
175                tombstoned: (*source).tombstoned,
176                inner: Some((insides.0, (Compact::decompact(&insides.1)))),
177            }
178        }
179    }
180}
181
182impl<K: Copy, V: Copy> Compact for Entry<K, V> {
183    fn is_still_compact(&self) -> bool {
184        true
185    }
186
187    fn dynamic_size_bytes(&self) -> usize {
188        0
189    }
190
191    unsafe fn compact(source: *mut Self, dest: *mut Self, _new_dynamic_part: *mut u8) {
192        (*dest).hash = (*source).hash;
193        (*dest).tombstoned = (*source).tombstoned;
194        (*dest).inner = (*source).inner;
195    }
196
197    unsafe fn decompact(source: *const Self) -> Entry<K, V> {
198        Entry {
199            hash: (*source).hash,
200            tombstoned: (*source).tombstoned,
201            inner: (*source).inner,
202        }
203    }
204}
205
206lazy_static! {
207    static ref PRIME_SIEVE: primal::Sieve = primal::Sieve::new(1_000_000);
208}
209
210impl<'a, K: Copy, V: Compact, A: Allocator> QuadraticProbingIterator<'a, K, V, A> {
211    fn for_map(
212        map: &'a OpenAddressingMap<K, V, A>,
213        hash: u32,
214    ) -> QuadraticProbingIterator<K, V, A> {
215        QuadraticProbingIterator {
216            i: 0,
217            number_used: map.entries.capacity(),
218            hash,
219            map,
220        }
221    }
222}
223
224impl<'a, K: Copy, V: Compact, A: Allocator> QuadraticProbingMutIterator<'a, K, V, A> {
225    fn for_map(
226        map: &'a mut OpenAddressingMap<K, V, A>,
227        hash: u32,
228    ) -> QuadraticProbingMutIterator<K, V, A> {
229        QuadraticProbingMutIterator {
230            i: 0,
231            number_used: map.entries.capacity(),
232            hash,
233            map,
234        }
235    }
236}
237
238impl<'a, K, V, A: Allocator> Iterator for QuadraticProbingIterator<'a, K, V, A> {
239    type Item = &'a Entry<K, V>;
240
241    fn next(&mut self) -> Option<Self::Item> {
242        if self.i >= self.number_used {
243            return None;
244        }
245        let index = (self.hash as usize + self.i * self.i) % self.number_used;
246        self.i += 1;
247        Some(&self.map.entries[index])
248    }
249}
250
251impl<'a, K, V, A: Allocator> Iterator for QuadraticProbingMutIterator<'a, K, V, A> {
252    type Item = &'a mut Entry<K, V>;
253    fn next(&mut self) -> Option<&'a mut Entry<K, V>> {
254        if self.i >= self.number_used {
255            return None;
256        }
257        let index = (self.hash as usize + self.i * self.i) % self.number_used;
258        self.i += 1;
259        Some(unsafe { &mut *(&mut self.map.entries[index] as *mut Entry<K, V>) })
260    }
261}
262
263impl<K: Copy + Eq + Hash, V: Compact, A: Allocator> OpenAddressingMap<K, V, A> {
264    /// constructor
265    pub fn new() -> Self {
266        Self::with_capacity(4)
267    }
268    /// constructor
269    pub fn with_capacity(l: usize) -> Self {
270        OpenAddressingMap {
271            entries: vec![Entry::default(); Self::find_next_prime(l)].into(),
272            number_alive: 0,
273            number_used: 0,
274        }
275    }
276
277    /// Amount of entries in the dictionary
278    pub fn len(&self) -> usize {
279        self.number_alive as usize
280    }
281
282    /// Amount of used entries in the dictionary
283    #[cfg(test)]
284    pub fn len_used(&self) -> usize {
285        self.number_used as usize
286    }
287
288    /// Capacity of the dictionary
289    #[cfg(test)]
290    pub fn capacity(&self) -> usize {
291        self.entries.capacity()
292    }
293
294    /// Is the dictionary empty?
295    pub fn is_empty(&self) -> bool {
296        self.number_alive == 0
297    }
298
299    /// Look up the value for key `query`, if it exists
300    pub fn get(&self, query: K) -> Option<&V> {
301        self.find_used(query).and_then(|e| e.value_option())
302    }
303
304    /// get mutable
305    pub fn get_mut(&mut self, query: K) -> Option<&mut V> {
306        self.find_used_mut(query).and_then(|e| e.mut_value_option())
307    }
308
309    /// Does the dictionary contain a value for `query`?
310    pub fn contains_key(&self, query: K) -> bool {
311        self.get(query).map_or(false, |_| true)
312    }
313
314    /// Insert new value at key `query` and return the previous value at that key, if any existed
315    pub fn insert(&mut self, query: K, value: V) -> Option<V> {
316        self.insert_inner_growing(query, value)
317    }
318
319    /// Remove value at key `query` and return it, if it existed
320    pub fn remove(&mut self, query: K) -> Option<V> {
321        self.remove_inner(query)
322    }
323
324    /// Iterator over all keys in the dictionary
325    pub fn keys<'a>(&'a self) -> impl Iterator<Item = &'a K> + 'a {
326        self.entries.iter().filter(|e| e.alive()).map(|e| e.key())
327    }
328
329    /// Iterator over all values in the dictionary
330    pub fn values<'a>(&'a self) -> impl Iterator<Item = &'a V> + 'a {
331        self.entries.iter().filter(|e| e.alive()).map(|e| e.value())
332    }
333
334    /// Iterator over mutable references to all values in the dictionary
335    pub fn values_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut V> + 'a {
336        self.entries
337            .iter_mut()
338            .filter(|e| e.alive())
339            .map(|e| e.mut_value())
340    }
341
342    /// Iterator over all key-value pairs in the dictionary
343    pub fn pairs<'a>(&'a self) -> impl Iterator<Item = (&'a K, &'a V)> + 'a {
344        self.entries
345            .iter()
346            .filter(|e| e.alive())
347            .map(|e| (e.key(), e.value()))
348    }
349
350    /// Iterator over all key-value pairs in the dictionary,
351    /// with the value as a mutable reference
352    pub fn pairs_mut<'a>(&'a mut self) -> impl Iterator<Item = (K, &'a mut V)> + 'a
353    where
354        K: Copy,
355    {
356        self.entries
357            .iter_mut()
358            .filter(|e| e.alive())
359            .map(|e| (*e.key(), e.mut_value()))
360    }
361
362    fn hash(key: K) -> u32 {
363        let mut hasher = DefaultHasher::new();
364        key.hash(&mut hasher);
365        hasher.finish() as u32
366    }
367
368    fn insert_inner_growing(&mut self, query: K, value: V) -> Option<V> {
369        self.ensure_capacity();
370        self.insert_inner(query, value)
371    }
372
373    fn insert_inner(&mut self, query: K, value: V) -> Option<V> {
374        let res = self.insert_inner_inner(query, value);
375        if res.is_none() {
376            self.number_alive += 1;
377            self.number_used += 1;
378        }
379        res
380    }
381
382    fn insert_inner_inner(&mut self, query: K, value: V) -> Option<V> {
383        let hash = Self::hash(query);
384        for entry in self.quadratic_iterator_mut(hash) {
385            if entry.free() {
386                entry.make_used(hash, query, value);
387                return None;
388            } else if entry.is_this(&query) {
389                return entry.replace_value(value);
390            }
391        }
392        panic!("should have place")
393    }
394
395    fn remove_inner(&mut self, query: K) -> Option<V> {
396        // remove inner does not alter the size because of tombstones
397        let old = self.remove_inner_inner(query);
398        if old.is_some() {
399            self.number_alive -= 1;
400        }
401        old
402    }
403
404    fn remove_inner_inner(&mut self, query: K) -> Option<V> {
405        let hash = Self::hash(query);
406        for entry in self.quadratic_iterator_mut(hash) {
407            if entry.is_this(&query) {
408                return entry.remove();
409            }
410        }
411        None
412    }
413
414    fn ensure_capacity(&mut self) {
415        if self.number_used as usize > self.entries.capacity() / 2 {
416            let mut new_capacity = self.entries.capacity() * 2;
417
418            // if there are lots of dead entries we do not need to double
419            // we are going to just garbage collect them
420            let number_dead = self.entries.capacity() - self.number_alive as usize;
421            if number_dead > self.entries.capacity() / 2 {
422                new_capacity = self.entries.capacity();
423            }
424
425            let mut new_hash_map = Self::with_capacity(new_capacity);
426
427            for entry in self.entries.drain() {
428                if entry.alive() {
429                    let tuple = entry.into_tuple();
430                    new_hash_map.insert(tuple.0, tuple.1);
431                }
432            }
433
434            *self = new_hash_map;
435        }
436    }
437
438    fn find_used(&self, query: K) -> Option<&Entry<K, V>> {
439        for entry in self.quadratic_iterator(query) {
440            if entry.is_this(&query) {
441                return Some(entry);
442            }
443        }
444        None
445    }
446
447    fn find_used_mut(&mut self, query: K) -> Option<&mut Entry<K, V>> {
448        let h = Self::hash(query);
449        for entry in self.quadratic_iterator_mut(h) {
450            if entry.is_this(&query) {
451                return Some(entry);
452            }
453        }
454        None
455    }
456
457    fn quadratic_iterator(&self, query: K) -> QuadraticProbingIterator<K, V, A> {
458        QuadraticProbingIterator::for_map(self, Self::hash(query))
459    }
460
461    fn quadratic_iterator_mut(&mut self, hash: u32) -> QuadraticProbingMutIterator<K, V, A> {
462        QuadraticProbingMutIterator::for_map(self, hash)
463    }
464
465    fn find_next_prime(n: usize) -> usize {
466        PRIME_SIEVE.primes_from(n).find(|&i| i >= n).unwrap()
467    }
468
469    fn display(&self) -> String {
470        let mut res = String::new();
471        writeln!(&mut res, "size: {:?}", self.number_alive).unwrap();
472        let mut size_left: isize = self.number_alive as isize;
473        for entry in self.entries.iter() {
474            if entry.used() {
475                size_left -= 1;
476            }
477            writeln!(&mut res, "  {:?} {:?}", entry.used(), entry.hash).unwrap();
478        }
479        writeln!(&mut res, "size_left : {:?}", size_left).unwrap();
480        res
481    }
482}
483
484impl<K: Copy + Eq + Hash, V: Compact, A: Allocator> Compact for OpenAddressingMap<K, V, A> {
485    default fn is_still_compact(&self) -> bool {
486        self.entries.is_still_compact()
487    }
488
489    default fn dynamic_size_bytes(&self) -> usize {
490        self.entries.dynamic_size_bytes()
491    }
492
493    default unsafe fn compact(source: *mut Self, dest: *mut Self, new_dynamic_part: *mut u8) {
494        (*dest).number_alive = (*source).number_alive;
495        (*dest).number_used = (*source).number_used;
496        Compact::compact(
497            &mut (*source).entries,
498            &mut (*dest).entries,
499            new_dynamic_part,
500        );
501    }
502
503    unsafe fn decompact(source: *const Self) -> OpenAddressingMap<K, V, A> {
504        OpenAddressingMap {
505            entries: Compact::decompact(&(*source).entries),
506            number_alive: (*source).number_alive,
507            number_used: (*source).number_used,
508        }
509    }
510}
511
512impl<K: Copy, V: Compact + Clone, A: Allocator> Clone for OpenAddressingMap<K, V, A> {
513    fn clone(&self) -> Self {
514        OpenAddressingMap {
515            entries: self.entries.clone(),
516            number_alive: self.number_alive,
517            number_used: self.number_used,
518        }
519    }
520}
521
522impl<K: Copy + Eq + Hash, V: Compact, A: Allocator> Default for OpenAddressingMap<K, V, A> {
523    fn default() -> Self {
524        OpenAddressingMap::with_capacity(5)
525    }
526}
527
528impl<K: Copy + Eq + Hash, V: Compact + Clone, A: Allocator> ::std::iter::FromIterator<(K, V)>
529    for OpenAddressingMap<K, V, A>
530{
531    /// Construct a compact dictionary from an interator over key-value pairs
532    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter_to_be: T) -> Self {
533        let iter = iter_to_be.into_iter();
534        let mut map = Self::with_capacity(iter.size_hint().0);
535        for (key, value) in iter {
536            map.insert(key, value);
537        }
538        map
539    }
540}
541
542impl<
543        K: Copy + Eq + Hash + ::std::fmt::Debug,
544        V: Compact + Clone + ::std::fmt::Debug,
545        A: Allocator,
546    > ::std::fmt::Debug for OpenAddressingMap<K, V, A>
547{
548    fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
549        f.debug_map().entries(self.pairs()).finish()
550    }
551}
552
553impl<K: Hash + Eq + Copy, I: Compact, A1: Allocator, A2: Allocator>
554    OpenAddressingMap<K, CompactVec<I, A1>, A2>
555{
556    /// Push a value onto the `CompactVec` at the key `query`
557    pub fn push_at(&mut self, query: K, item: I) {
558        if self.push_at_inner(query, item) {
559            self.number_alive += 1;
560            self.number_used += 1;
561        }
562    }
563
564    /// return true if new value pushed
565    fn push_at_inner(&mut self, query: K, item: I) -> bool {
566        self.ensure_capacity();
567        let hash = Self::hash(query);
568        for entry in self.quadratic_iterator_mut(hash) {
569            if entry.is_this(&query) {
570                entry.mut_value().push(item);
571                return false;
572            } else if !entry.used() {
573                let mut val = CompactVec::new();
574                val.push(item);
575                entry.make_used(hash, query, val);
576                return true;
577            }
578        }
579        println!("{:?}", self.display());
580        panic!("should always have place");
581    }
582
583    /// Iterator over the `CompactVec` at the key `query`
584    pub fn get_iter<'a>(&'a self, query: K) -> impl Iterator<Item = &'a I> + 'a {
585        self.get(query)
586            .into_iter()
587            .flat_map(|vec_in_option| vec_in_option.iter())
588    }
589
590    /// Remove the `CompactVec` at the key `query` and iterate over its elements (if it existed)
591    pub fn remove_iter<'a>(&'a mut self, query: K) -> impl Iterator<Item = I> + 'a {
592        self.remove(query)
593            .into_iter()
594            .flat_map(|vec_in_option| vec_in_option.into_iter())
595    }
596}
597
598impl<T: Hash> Hash for CompactVec<T> {
599    fn hash<H: Hasher>(&self, state: &mut H) {
600        for elem in self {
601            elem.hash(state);
602        }
603    }
604}
605
606#[cfg(feature = "serde-serialization")]
607use serde::ser::SerializeMap;
608#[cfg(feature = "serde-serialization")]
609use std::marker::PhantomData;
610
611#[cfg(feature = "serde-serialization")]
612impl<K, V, A> ::serde::Serialize for OpenAddressingMap<K, V, A>
613where
614    K: Copy + Eq + Hash + ::serde::Serialize,
615    V: Compact + ::serde::Serialize,
616    A: Allocator,
617{
618    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
619    where
620        S: ::serde::Serializer,
621    {
622        let mut map = serializer.serialize_map(Some(self.len()))?;
623        for (k, v) in self.pairs() {
624            map.serialize_entry(k, v)?;
625        }
626        map.end()
627    }
628}
629
630#[cfg(feature = "serde-serialization")]
631struct OpenAddressingMapVisitor<K, V, A: Allocator> {
632    marker: PhantomData<fn() -> OpenAddressingMap<K, V, A>>,
633}
634
635#[cfg(feature = "serde-serialization")]
636impl<K, V, A: Allocator> OpenAddressingMapVisitor<K, V, A> {
637    fn new() -> Self {
638        OpenAddressingMapVisitor {
639            marker: PhantomData,
640        }
641    }
642}
643
644#[cfg(feature = "serde-serialization")]
645impl<'de, K, V, A> ::serde::de::Visitor<'de> for OpenAddressingMapVisitor<K, V, A>
646where
647    K: Copy + Eq + Hash + ::serde::de::Deserialize<'de>,
648    V: Compact + ::serde::de::Deserialize<'de>,
649    A: Allocator,
650{
651    type Value = OpenAddressingMap<K, V, A>;
652
653    fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
654        formatter.write_str("A Compact Hash Map")
655    }
656
657    fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
658    where
659        M: ::serde::de::MapAccess<'de>,
660    {
661        let mut map = OpenAddressingMap::with_capacity(access.size_hint().unwrap_or(0));
662
663        while let Some((key, value)) = access.next_entry()? {
664            map.insert(key, value);
665        }
666
667        Ok(map)
668    }
669}
670
671#[cfg(feature = "serde-serialization")]
672impl<'de, K, V, A> ::serde::de::Deserialize<'de> for OpenAddressingMap<K, V, A>
673where
674    K: Copy + Eq + Hash + ::serde::de::Deserialize<'de>,
675    V: Compact + ::serde::de::Deserialize<'de>,
676    A: Allocator,
677{
678    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
679    where
680        D: ::serde::de::Deserializer<'de>,
681    {
682        deserializer.deserialize_map(OpenAddressingMapVisitor::new())
683    }
684}
685
686#[cfg(test)]
687fn elem(n: usize) -> usize {
688    (n * n) as usize
689}
690
691#[test]
692fn very_basic1() {
693    let mut map: OpenAddressingMap<u32, u32> = OpenAddressingMap::with_capacity(2);
694    map.insert(0, 54);
695    assert!(*map.get(0).unwrap() == 54);
696    map.insert(1, 48);
697    assert!(*map.get(1).unwrap() == 48);
698}
699
700#[test]
701fn very_basic2() {
702    let mut map: OpenAddressingMap<u32, u32> = OpenAddressingMap::with_capacity(3);
703    map.insert(0, 54);
704    map.insert(1, 48);
705    assert!(*map.get(0).unwrap() == 54);
706    assert!(*map.get(1).unwrap() == 48);
707}
708
709#[test]
710fn basic() {
711    let n: usize = 10000;
712    let mut map: OpenAddressingMap<usize, usize> = OpenAddressingMap::with_capacity(n);
713    assert!(map.is_empty() == true);
714    for i in 0..n {
715        let e = elem(i);
716        map.insert(i, e);
717    }
718    assert!(map.is_empty() == false);
719    for i in 0..n {
720        let test = map.get(i).unwrap();
721        let exp = elem(i);
722        assert!(*test == exp, " failed exp {:?}  was {:?}", exp, test);
723    }
724    assert!(map.len() == n as usize);
725    assert!(*map.get(n - 1).unwrap() == elem(n - 1));
726    assert!(*map.get(n - 100).unwrap() == elem(n - 100));
727    assert!(map.contains_key(n - 300) == true);
728    assert!(map.contains_key(n + 1) == false);
729    assert!(map.remove(500) == Some(elem(500)));
730    assert!(map.get(500).is_none());
731}
732
733#[test]
734fn iter() {
735    let mut map: OpenAddressingMap<usize, usize> = OpenAddressingMap::with_capacity(200);
736    let n = 10;
737    assert!(map.is_empty() == true);
738    for n in 0..n {
739        map.insert(n, n * n);
740    }
741    for k in map.keys() {
742        println!(" k {:?}", k);
743    }
744    for n in 0..n {
745        let mut keys = map.keys();
746        assert!(
747            keys.find(|&i| {
748                println!("find {:?} {:?}", i, n);
749                *i == n
750            }).is_some(),
751            "fail n {:?} ",
752            n
753        );
754    }
755    for n in 0..n {
756        let mut values = map.values();
757        assert!(values.find(|i| **i == elem(n)).is_some());
758    }
759}
760
761#[test]
762fn values_mut() {
763    let mut map: OpenAddressingMap<usize, usize> = OpenAddressingMap::new();
764    assert!(map.is_empty() == true);
765    for n in 0..100 {
766        map.insert(n, n * n);
767    }
768    {
769        let mut values_mut = map.values_mut();
770        for i in &mut values_mut {
771            *i = *i + 1;
772        }
773    }
774    for i in 0..100 {
775        assert!(*map.get(i).unwrap() == i * i + 1);
776    }
777}
778
779#[test]
780fn pairs() {
781    let mut map: OpenAddressingMap<usize, usize> = OpenAddressingMap::new();
782    assert!(map.is_empty() == true);
783    for n in 0..100 {
784        map.insert(n, n * n);
785    }
786    for (key, value) in map.pairs() {
787        assert!(elem(*key) == *value);
788    }
789}
790
791#[test]
792fn push_at() {
793    let mut map: OpenAddressingMap<usize, CompactVec<usize>> = OpenAddressingMap::new();
794    assert!(map.is_empty() == true);
795    for n in 0..10000 {
796        map.push_at(n, elem(n));
797        map.push_at(n, elem(n) + 1);
798    }
799
800    for n in 0..10000 {
801        println!("n {:?}", n);
802        let mut iter = map.get_iter(n);
803        assert!(iter.find(|&i| *i == elem(n)).is_some());
804        let mut iter2 = map.get_iter(n);
805        assert!(iter2.find(|&i| *i == elem(n) + 1).is_some());
806    }
807}
808
809#[test]
810fn remove_iter() {
811    let mut map: OpenAddressingMap<usize, CompactVec<usize>> = OpenAddressingMap::new();
812    assert!(map.is_empty() == true);
813    for n in 0..1000 {
814        map.push_at(n, elem(n));
815        map.push_at(n, elem(n) + 1);
816    }
817    let target = 500;
818    let mut iter = map.remove_iter(target);
819    assert!(iter.find(|i| *i == elem(target)).is_some());
820    assert!(iter.find(|i| *i == elem(target) + 1).is_some());
821}
822
823#[test]
824fn ensure_capacity_works() {
825    let mut map: OpenAddressingMap<usize, CompactVec<usize>> = OpenAddressingMap::new();
826    assert!(map.is_empty() == true);
827    for n in 0..100 {
828        map.push_at(n, elem(n));
829        map.push_at(n, elem(n) + 1);
830    }
831    assert!(map.is_empty() == false);
832}
833
834#[test]
835fn insert_after_remove_works_same_hash() {
836    // get 2 elems with the same hash
837    let mut hash_to_usize: HashMap<u32, usize> = HashMap::new();
838    let mut bad_pair_opt = None;
839    for i in 0..<usize>::max_value() {
840        if i % 10000 == 0 {
841            println!("i {}", i);
842        }
843        let hash = OpenAddressingMap::<usize, usize>::hash(i);
844        if hash_to_usize.contains_key(&hash) {
845            let p: usize = *hash_to_usize.get(&hash).unwrap();
846            bad_pair_opt = Some((i, p));
847            break;
848        }
849        hash_to_usize.insert(hash, i);
850    }
851
852    type NestedType = OpenAddressingMap<usize, usize>;
853    let mut map: NestedType = OpenAddressingMap::new();
854
855    let bad_pair = bad_pair_opt.unwrap();
856    println!("bad pair {:?}", bad_pair);
857    map.insert(bad_pair.0, 1);
858    println!("map {}", map.display());
859    map.insert(bad_pair.1, 2);
860    println!("map {}", map.display());
861    map.remove(bad_pair.0);
862    println!("map {}", map.display());
863    map.insert(bad_pair.1, 3);
864    println!("map {}", map.display());
865
866    let mut n1 = 0;
867    for (key, _) in map.pairs() {
868        if *key == bad_pair.1 {
869            n1 += 1;
870        }
871    }
872    assert!(n1 == 1);
873}
874
875#[test]
876fn compact_notcopy() {
877    type NestedType = OpenAddressingMap<usize, CompactVec<usize>>;
878
879    let mut map: NestedType = OpenAddressingMap::new();
880    let assert_fun = |map: &NestedType, t: usize| {
881        assert!(
882            map.get(t)
883                .unwrap()
884                .into_iter()
885                .find(|i| **i == elem(t))
886                .is_some()
887        )
888    };
889
890    for n in 0..1000 {
891        map.push_at(n, elem(n));
892        map.push_at(n, elem(n) + 1);
893    }
894    assert_fun(&map, 500);
895    let bytes = map.total_size_bytes();
896    let storage = DefaultHeap::allocate(bytes);
897    unsafe {
898        Compact::compact_behind(&mut map, storage as *mut NestedType);
899        ::std::mem::forget(map);
900        assert_fun(&(*(storage as *mut NestedType)), 449);
901        let decompacted = Compact::decompact(storage as *mut NestedType);
902        assert_fun(&decompacted, 449);
903        DefaultHeap::deallocate(storage, bytes);
904    }
905}
906
907#[test]
908fn compact_copy() {
909    type NestedType = OpenAddressingMap<usize, usize>;
910
911    let mut map: NestedType = OpenAddressingMap::new();
912    let assert_fun = |map: &NestedType, t: usize| assert!(map.get(t).is_some());
913
914    for n in 0..1000 {
915        map.insert(n, elem(n));
916    }
917    assert_fun(&map, 500);
918    let bytes = map.total_size_bytes();
919    let storage = DefaultHeap::allocate(bytes);
920    unsafe {
921        Compact::compact_behind(&mut map, storage as *mut NestedType);
922        ::std::mem::forget(map);
923        assert_fun(&(*(storage as *mut NestedType)), 449);
924        let decompacted = Compact::decompact(storage as *mut NestedType);
925        assert_fun(&decompacted, 449);
926        DefaultHeap::deallocate(storage, bytes);
927    }
928}
929
930#[test]
931fn map_len_is_the_amount_of_inserted_and_not_removed_items() {
932    type Map = OpenAddressingMap<usize, usize>;
933    let mut map: Map = OpenAddressingMap::new();
934    for n in 0..1000 {
935        map.insert(n, elem(n));
936    }
937    for n in 0..10 {
938        map.remove(n);
939    }
940    assert_eq!(990, map.len());
941}
942
943#[test]
944fn when_there_are_lots_of_dead_tombstoned_entries_capacity_is_not_doubled() {
945    type Map = OpenAddressingMap<usize, usize>;
946    let mut map: Map = OpenAddressingMap::new();
947    for n in 0..1000 {
948        map.insert(n, elem(n));
949    }
950    for n in 0..600 {
951        map.remove(n);
952    }
953    println!("self {}", map.capacity());
954    assert_eq!(400, map.len());
955    assert_eq!(1000, map.len_used());
956    assert_eq!(3203, map.capacity());
957    for n in 0..1000 {
958        map.insert(10000 + n, elem(n));
959    }
960    assert_eq!(1400, map.len());
961    assert_eq!(3203, map.capacity());
962}
963
964#[test]
965fn when_there_are_lots_of_few_tombstoned_entries_capacity_is_doubled() {
966    type Map = OpenAddressingMap<usize, usize>;
967    let mut map: Map = OpenAddressingMap::new();
968    for n in 0..1000 {
969        map.insert(n, elem(n));
970    }
971    for n in 0..60 {
972        map.remove(n);
973    }
974    println!("self {}", map.capacity());
975    assert_eq!(940, map.len());
976    assert_eq!(1000, map.len_used());
977    assert_eq!(3203, map.capacity());
978    for n in 0..1000 {
979        map.insert(10000 + n, elem(n));
980    }
981    assert_eq!(1940, map.len());
982    assert_eq!(6421, map.capacity());
983}