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
37pub 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 pub fn new() -> Self {
266 Self::with_capacity(4)
267 }
268 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 pub fn len(&self) -> usize {
279 self.number_alive as usize
280 }
281
282 #[cfg(test)]
284 pub fn len_used(&self) -> usize {
285 self.number_used as usize
286 }
287
288 #[cfg(test)]
290 pub fn capacity(&self) -> usize {
291 self.entries.capacity()
292 }
293
294 pub fn is_empty(&self) -> bool {
296 self.number_alive == 0
297 }
298
299 pub fn get(&self, query: K) -> Option<&V> {
301 self.find_used(query).and_then(|e| e.value_option())
302 }
303
304 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 pub fn contains_key(&self, query: K) -> bool {
311 self.get(query).map_or(false, |_| true)
312 }
313
314 pub fn insert(&mut self, query: K, value: V) -> Option<V> {
316 self.insert_inner_growing(query, value)
317 }
318
319 pub fn remove(&mut self, query: K) -> Option<V> {
321 self.remove_inner(query)
322 }
323
324 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 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 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 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 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 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 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 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 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 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 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 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 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}