1use std::borrow::Borrow;
2use std::hash::Hash;
3use std::cmp::Eq;
4use std::collections::HashMap;
5use std::collections::BTreeMap;
6use std::mem::transmute;
7use std::slice::Iter;
8
9fn ref_eq<'a, 'b, T>(thing: &'a T, other: &'b T) -> bool {
10 (thing as *const T) == (other as *const T)
11}
12
13pub trait HashMapMultiMut {
16 type Value;
17 type Key: Hash + Eq;
18
19 fn get_pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> Option<(&mut Self::Value, &mut Self::Value)>
20 where Self::Key: Borrow<Q>, Q: Hash + Eq;
21
22 fn pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> (&mut Self::Value, &mut Self::Value)
23 where Self::Key: Borrow<Q>, Q: Hash + Eq;
24
25 fn get_triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> Option<(&mut Self::Value, &mut Self::Value, &mut Self::Value)>
26 where Self::Key: Borrow<Q>, Q: Hash + Eq;
27
28 fn triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> (&mut Self::Value, &mut Self::Value, &mut Self::Value)
29 where Self::Key: Borrow<Q>, Q: Hash + Eq;
30
31 fn multi_mut<'a>(&'a mut self, buffer: &'a mut [*const Self::Value]) -> HashMapMutWrapper<Self::Key, Self::Value>;
32
33 fn iter_multi_mut<'a, Q: ?Sized>(&'a mut self, k: &'a [&'a Q], buffer: &'a mut [*const Self::Value]) -> HashMapMultiMutIter<Q, Self::Key, Self::Value>
34 where Self::Key: Borrow<Q>, Q: Hash + Eq;
35}
36
37impl<K: Hash + Eq, V> HashMapMultiMut for HashMap<K, V> {
38 type Value = V;
39 type Key = K;
40
41 #[allow(mutable_transmutes)]
42 fn get_pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> Option<(&mut V, &mut V)>
43 where K: Borrow<Q>, Q: Hash + Eq
44 {
45
46 let v_1 = self.get(k_1);
47 let v_2 = self.get(k_2);
48
49 match (v_1, v_2) {
50 (Some(v_1), Some(v_2)) => {
51 if ref_eq(v_1, v_2) {
52 None
53 } else {
54 unsafe { Some((transmute(v_1), transmute(v_2))) } }
59 },
60 _ => None,
61 }
62 }
63
64 #[allow(mutable_transmutes)]
65 fn pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> (&mut V, &mut V)
66 where K: Borrow<Q>, Q: Hash + Eq
67 {
68
69 let v_1 = &self[k_1];
70 let v_2 = &self[k_2];
71 if ref_eq(v_1, v_2) {
72 panic!("The keys pointed to the same value! Only non-overlapping values can be handled.")
73 } else {
74 unsafe { (transmute(v_1), transmute(v_2)) } }
79 }
80
81 #[allow(mutable_transmutes)]
82 fn get_triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> Option<(&mut V, &mut V, &mut V)>
83 where K: Borrow<Q>, Q: Hash + Eq
84 {
85
86 let v_1 = self.get(k_1);
87 let v_2 = self.get(k_2);
88 let v_3 = self.get(k_3);
89
90 match (v_1, v_2, v_3) {
91 (Some(v_1), Some(v_2), Some(v_3)) => {
92 if ref_eq(v_1, v_2) || ref_eq(v_2, v_3) || ref_eq(v_1, v_3) {
93 None
94 } else {
95 unsafe { Some((transmute(v_1), transmute(v_2), transmute(v_3))) }
96 }
101 },
102 _ => None,
103 }
104 }
105
106 #[allow(mutable_transmutes)]
107 fn triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> (&mut V, &mut V, &mut V)
108 where K: Borrow<Q>, Q: Hash + Eq
109 {
110
111 let v_1 = &self[k_1];
112 let v_2 = &self[k_2];
113 let v_3 = &self[k_3];
114 if ref_eq(v_1, v_2) || ref_eq(v_2, v_3) || ref_eq(v_1, v_3) {
115 panic!("The keys pointed to the same value! Only non-overlapping values can be handled.")
116 } else {
117 unsafe { (transmute(v_1), transmute(v_2), transmute(v_3)) }
118 }
123 }
124
125 fn multi_mut<'a>(&'a mut self, buffer: &'a mut [*const V]) -> HashMapMutWrapper<K, V>
126 {
127 HashMapMutWrapper { used: 0, map: self, buffer: buffer }
128 }
129
130 fn iter_multi_mut<'a, Q: ?Sized>(&'a mut self, keys: &'a [&'a Q], buffer: &'a mut [*const V]) -> HashMapMultiMutIter<Q, K, V>
131 where K: Borrow<Q>, Q: Hash + Eq
132 {
133 HashMapMultiMutIter { mut_wrapper: self.multi_mut(buffer), keys: keys.into_iter() }
134 }
135
136}
137
138pub struct HashMapMutWrapper<'a, K: 'a, V: 'a>
139 where K: Hash + Eq
140{
141 used: usize,
142 map: &'a mut HashMap<K, V>,
143 buffer: &'a mut [*const V],
144}
145
146impl<'a, K, V> HashMapMutWrapper<'a, K, V>
147 where K: Hash + Eq
148{
149
150 #[allow(mutable_transmutes)]
151 pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&'a mut V>
152 where K: Borrow<Q>, Q: Hash + Eq
153 {
154 if self.used == self.buffer.len() {
155 panic!("Buffer space is depleted!");
156 }
157 let v = if let Some(v) = self.map.get(k) { v } else { return None }; let ptr = v as *const V;
161 for old_ptr in &self.buffer[0..self.used] {
162 if ptr == *old_ptr {
163 panic!("No aliased references allowed! This key has been already used.");
164 }
165 }
166 self.buffer[self.used] = ptr;
167 self.used += 1;
168
169 Some(unsafe{ transmute(v) })
170 }
171
172 pub fn mut_ref<Q: ?Sized>(&mut self, k: &Q) -> &'a mut V
173 where K: Borrow<Q>, Q: Hash + Eq {
174 match self.get_mut(k) {
175 Some(v) => v,
176 None => panic!("No such key!"),
177 }
178 }
179}
180
181pub struct HashMapMultiMutIter<'a, Q: ?Sized + 'a, K: 'a, V: 'a>
182 where K: Borrow<Q> + Hash + Eq, Q: Hash + Eq
183{
184 mut_wrapper: HashMapMutWrapper<'a, K, V>,
185 keys: Iter<'a, &'a Q>,
186}
187
188impl<'a, Q: ?Sized, K, V> Iterator for HashMapMultiMutIter<'a, Q, K, V>
189 where K: Borrow<Q> + Hash + Eq, Q: Hash + Eq
190{
191 type Item = &'a mut V;
192
193 #[allow(mutable_transmutes)]
194 fn next(&mut self) -> Option<Self::Item> {
195 if self.mut_wrapper.used == self.mut_wrapper.buffer.len() { return None };
196 match self.keys.next() {
197 Some(q) => { Some(self.mut_wrapper.mut_ref(q)) }, None => None,
200 }
201
202 }
203}
204
205
206pub trait BTreeMapMultiMut {
211 type Value;
212 type Key: Ord;
213
214 fn get_pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> Option<(&mut Self::Value, &mut Self::Value)>
215 where Self::Key: Borrow<Q>, Q: Ord;
216
217 fn pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> (&mut Self::Value, &mut Self::Value)
218 where Self::Key: Borrow<Q>, Q: Ord;
219
220 fn get_triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> Option<(&mut Self::Value, &mut Self::Value, &mut Self::Value)>
221 where Self::Key: Borrow<Q>, Q: Ord;
222
223 fn triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> (&mut Self::Value, &mut Self::Value, &mut Self::Value)
224 where Self::Key: Borrow<Q>, Q: Ord;
225
226 fn multi_mut<'a>(&'a mut self, buffer: &'a mut [*const Self::Value]) -> BTreeMapMutWrapper<Self::Key, Self::Value>;
227
228 fn iter_multi_mut<'a, Q: ?Sized>(&'a mut self, k: &'a [&'a Q], buffer: &'a mut [*const Self::Value]) -> BTreeMapMultiMutIter<Q, Self::Key, Self::Value>
229 where Self::Key: Borrow<Q>, Q: Ord;
230}
231
232
233impl<K: Ord, V> BTreeMapMultiMut for BTreeMap<K, V> {
234 type Value = V;
235 type Key = K;
236
237 #[allow(mutable_transmutes)]
238 fn get_pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> Option<(&mut V, &mut V)>
239 where K: Borrow<Q>, Q: Ord
240 {
241
242 let v_1 = self.get(k_1);
243 let v_2 = self.get(k_2);
244
245 match (v_1, v_2) {
246 (Some(v_1), Some(v_2)) => {
247 if ref_eq(v_1, v_2) {
248 None
249 } else {
250 unsafe { Some((transmute(v_1), transmute(v_2))) } }
255 },
256 _ => None,
257 }
258 }
259
260 #[allow(mutable_transmutes)]
261 fn pair_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q) -> (&mut V, &mut V)
262 where K: Borrow<Q>, Q: Ord
263 {
264
265 let v_1 = &self[k_1];
266 let v_2 = &self[k_2];
267 if ref_eq(v_1, v_2) {
268 panic!("The keys pointed to the same value! Only non-overlapping values can be handled.")
269 } else {
270 unsafe { (transmute(v_1), transmute(v_2)) } }
275 }
276
277 #[allow(mutable_transmutes)]
278 fn get_triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> Option<(&mut V, &mut V, &mut V)>
279 where K: Borrow<Q>, Q: Ord
280 {
281
282 let v_1 = self.get(k_1);
283 let v_2 = self.get(k_2);
284 let v_3 = self.get(k_3);
285
286 match (v_1, v_2, v_3) {
287 (Some(v_1), Some(v_2), Some(v_3)) => {
288 if ref_eq(v_1, v_2) || ref_eq(v_2, v_3) || ref_eq(v_1, v_3) {
289 None
290 } else {
291 unsafe { Some((transmute(v_1), transmute(v_2), transmute(v_3))) }
292 }
297 },
298 _ => None,
299 }
300 }
301
302 #[allow(mutable_transmutes)]
303 fn triple_mut<Q: ?Sized>(&mut self, k_1: &Q, k_2: &Q, k_3: &Q) -> (&mut V, &mut V, &mut V)
304 where K: Borrow<Q>, Q: Ord
305 {
306
307 let v_1 = &self[k_1];
308 let v_2 = &self[k_2];
309 let v_3 = &self[k_3];
310 if ref_eq(v_1, v_2) || ref_eq(v_2, v_3) || ref_eq(v_1, v_3) {
311 panic!("The keys pointed to the same value! Only non-overlapping values can be handled.")
312 } else {
313 unsafe { (transmute(v_1), transmute(v_2), transmute(v_3)) }
314 }
319 }
320
321 fn multi_mut<'a>(&'a mut self, buffer: &'a mut [*const V]) -> BTreeMapMutWrapper<K, V>
322 {
323 BTreeMapMutWrapper { used: 0, map: self, buffer: buffer }
324 }
325
326 fn iter_multi_mut<'a, Q: ?Sized>(&'a mut self, keys: &'a [&'a Q], buffer: &'a mut [*const V]) -> BTreeMapMultiMutIter<Q, K, V>
327 where K: Borrow<Q>, Q: Ord
328 {
329 BTreeMapMultiMutIter { mut_wrapper: self.multi_mut(buffer), keys: keys.into_iter() }
330 }
331
332}
333
334pub struct BTreeMapMutWrapper<'a, K: 'a, V: 'a>
335 where K: Ord
336{
337 used: usize,
338 map: &'a mut BTreeMap<K, V>,
339 buffer: &'a mut [*const V],
340}
341
342impl<'a, K, V> BTreeMapMutWrapper<'a, K, V>
343 where K: Ord
344{
345
346 #[allow(mutable_transmutes)]
347 pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&'a mut V>
348 where K: Borrow<Q>, Q: Ord
349 {
350 if self.used == self.buffer.len() {
351 panic!("Buffer space is depleted!");
352 }
353 let v = if let Some(v) = self.map.get(k) { v } else { return None }; let ptr = v as *const V;
357 for old_ptr in &self.buffer[0..self.used] {
358 if ptr == *old_ptr {
359 panic!("No aliased references allowed! This key has been already used.");
360 }
361 }
362 self.buffer[self.used] = ptr;
363 self.used += 1;
364
365 Some(unsafe{ transmute(v) })
366 }
367
368 pub fn mut_ref<Q: ?Sized>(&mut self, k: &Q) -> &'a mut V
369 where K: Borrow<Q>, Q: Ord {
370 match self.get_mut(k) {
371 Some(v) => v,
372 None => panic!("No such key!"),
373 }
374 }
375}
376
377pub struct BTreeMapMultiMutIter<'a, Q: ?Sized + 'a, K: 'a, V: 'a>
378 where K: Borrow<Q> + Ord, Q: Ord
379{
380 mut_wrapper: BTreeMapMutWrapper<'a, K, V>,
381 keys: Iter<'a, &'a Q>,
382}
383
384impl<'a, Q: ?Sized, K, V> Iterator for BTreeMapMultiMutIter<'a, Q, K, V>
385 where K: Borrow<Q> + Ord, Q: Ord
386{
387 type Item = &'a mut V;
388
389 #[allow(mutable_transmutes)]
390 fn next(&mut self) -> Option<Self::Item> {
391 if self.mut_wrapper.used == self.mut_wrapper.buffer.len() { return None };
392 match self.keys.next() {
393 Some(q) => { Some(self.mut_wrapper.mut_ref(q)) }, None => None,
396 }
397
398 }
399}
400
401
402
403
404#[cfg(test)]
405mod tests_hash {
406
407 use std::collections::HashMap;
408 use HashMapMultiMut;
409
410 fn populate_hashmap() -> HashMap<String, String> {
411 let mut map = HashMap::new();
412 map.insert("key_one".into(), "value_one".into());
413 map.insert("key_two".into(), "value_two".into());
414 map.insert("key_three".into(), "value_three".into());
415 map.insert("key_four".into(), "value_four".into());
416 map.insert("key_five".into(), "value_five".into());
417 map.insert("key_six".into(), "value_six".into());
418 map
419 }
420
421 #[test]
422 fn test_pair_success() {
423 let mut map = populate_hashmap();
424 let (one, two): (&mut String, &mut String) = map.get_pair_mut("key_one", "key_two").unwrap();
425
426 assert_eq!(one, "value_one");
427 assert_eq!(two, "value_two");
428
429 one.push_str("_edited");
430 two.push_str("_edited");
431
432 assert_eq!(one, "value_one_edited");
433 assert_eq!(two, "value_two_edited");
434 }
435
436 #[test]
437 fn test_pair_nonexistent_key() {
438 let mut map = populate_hashmap();
439 assert_eq!(map.get_pair_mut("key_one", "key_hundred"), None);
440 }
441
442 #[test]
443 fn test_pair_overlap() {
444 let mut map = populate_hashmap();
445 assert_eq!(map.get_pair_mut("key_one", "key_one"), None);
446 }
447
448 #[test]
449 fn test_pair_panic_success() {
450 let mut map = populate_hashmap();
451 let (one, two): (&mut String, &mut String) = map.pair_mut("key_one", "key_two");
452
453 assert_eq!(one, "value_one");
454 assert_eq!(two, "value_two");
455
456 one.push_str("_edited");
457 two.push_str("_edited");
458
459 assert_eq!(one, "value_one_edited");
460 assert_eq!(two, "value_two_edited");
461 }
462
463 #[test]
464 #[should_panic]
465 fn test_pair_panic_nonexistent_key() {
466 let mut map = populate_hashmap();
467 map.pair_mut("key_one", "key_hundred");
468 }
469
470 #[test]
471 #[should_panic]
472 fn test_pair_panic_overlap() {
473 let mut map = populate_hashmap();
474 map.pair_mut("key_one", "key_one");
475 }
476
477 #[test]
478 fn test_triple_success() {
479 let mut map = populate_hashmap();
480 let (one, two, three): (&mut String, &mut String, &mut String) = map.get_triple_mut("key_one", "key_two", "key_three").unwrap();
481
482 assert_eq!(one, "value_one");
483 assert_eq!(two, "value_two");
484 assert_eq!(three, "value_three");
485
486 one.push_str("_edited");
487 two.push_str("_edited");
488 three.push_str("_edited");
489
490 assert_eq!(one, "value_one_edited");
491 assert_eq!(two, "value_two_edited");
492 assert_eq!(three, "value_three_edited");
493 }
494
495 #[test]
496 fn test_triple_nonexistent_key() {
497 let mut map = populate_hashmap();
498 assert_eq!(map.get_triple_mut("key_one", "key_hundred", "key_three"), None);
499 }
500
501 #[test]
502 fn test_triple_overlap_1() {
503 let mut map = populate_hashmap();
504 assert_eq!(map.get_triple_mut("key_one", "key_two", "key_one"), None);
505 }
506
507 #[test]
508 fn test_triple_overlap_2() {
509 let mut map = populate_hashmap();
510 assert_eq!(map.get_triple_mut("key_two", "key_two", "key_three"), None);
511 }
512
513 #[test]
514 fn test_triple_overlap_3() {
515 let mut map = populate_hashmap();
516 assert_eq!(map.get_triple_mut("key_one", "key_three", "key_three"), None);
517 }
518
519 #[test]
520 fn test_triple_overlap_4() {
521 let mut map = populate_hashmap();
522 assert_eq!(map.get_triple_mut("key_one", "key_one", "key_one"), None);
523 }
524
525 #[test]
526 fn test_triple_panic_success() {
527 let mut map = populate_hashmap();
528 let (one, two, three): (&mut String, &mut String, &mut String) = map.triple_mut("key_one", "key_two", "key_three");
529
530 assert_eq!(one, "value_one");
531 assert_eq!(two, "value_two");
532 assert_eq!(three, "value_three");
533
534 one.push_str("_edited");
535 two.push_str("_edited");
536 three.push_str("_edited");
537
538 assert_eq!(one, "value_one_edited");
539 assert_eq!(two, "value_two_edited");
540 assert_eq!(three, "value_three_edited");
541 }
542
543 #[test]
544 #[should_panic]
545 fn test_triple_panic_nonexistent_key() {
546 let mut map = populate_hashmap();
547 map.triple_mut("key_one", "key_hundred", "key_three");
548 }
549
550 #[test]
551 #[should_panic]
552 fn test_triple_panic_overlap_1() {
553 let mut map = populate_hashmap();
554 map.triple_mut("key_one", "key_two", "key_one");
555 }
556
557 #[test]
558 #[should_panic]
559 fn test_triple_panic_overlap_2() {
560 let mut map = populate_hashmap();
561 map.triple_mut("key_two", "key_two", "key_three");
562 }
563
564 #[test]
565 #[should_panic]
566 fn test_triple_panic_overlap_3() {
567 let mut map = populate_hashmap();
568 map.triple_mut("key_one", "key_three", "key_three");
569 }
570
571 #[test]
572 #[should_panic]
573 fn test_triple_panic_overlap_4() {
574 let mut map = populate_hashmap();
575 map.triple_mut("key_one", "key_one", "key_one");
576 }
577
578 #[test]
579 fn test_multi_success() {
580 let mut map = populate_hashmap();
581
582 use std::ptr::null;
583
584 let mut buffer = [null(); 3];
585 let mut wrapper = map.multi_mut(&mut buffer);
586
587 let one = wrapper.get_mut("key_one").unwrap();
588 let two = wrapper.get_mut("key_two").unwrap();
589 let three = wrapper.get_mut("key_three").unwrap();
590
591 assert_eq!(one, "value_one");
592 assert_eq!(two, "value_two");
593 assert_eq!(three, "value_three");
594
595 one.push_str("_edited");
596 two.push_str("_edited");
597 three.push_str("_edited");
598
599 assert_eq!(one, "value_one_edited");
600 assert_eq!(two, "value_two_edited");
601 assert_eq!(three, "value_three_edited");
602 }
603
604 #[test]
605 fn test_multi_ref_success() {
606 let mut map = populate_hashmap();
607
608 use std::ptr::null;
609
610 let mut buffer = [null(); 3];
611 let mut wrapper = map.multi_mut(&mut buffer);
612
613 let one = wrapper.mut_ref("key_one");
614 let two = wrapper.mut_ref("key_two");
615 let three = wrapper.mut_ref("key_three");
616
617 assert_eq!(one, "value_one");
618 assert_eq!(two, "value_two");
619 assert_eq!(three, "value_three");
620
621 one.push_str("_edited");
622 two.push_str("_edited");
623 three.push_str("_edited");
624
625 assert_eq!(one, "value_one_edited");
626 assert_eq!(two, "value_two_edited");
627 assert_eq!(three, "value_three_edited");
628 }
629
630 #[test]
631 #[should_panic]
632 fn test_multi_over_capacity() {
633 let mut map = populate_hashmap();
634
635 use std::ptr::null;
636
637 let mut buffer = [null(); 3];
638 let mut wrapper = map.multi_mut(&mut buffer);
639
640 let _one = wrapper.get_mut("key_one").unwrap();
641 let _two = wrapper.get_mut("key_two").unwrap();
642 let _three = wrapper.get_mut("key_three").unwrap();
643 let _four = wrapper.get_mut("key_four").unwrap();
644 }
645
646 #[test]
647 #[should_panic]
648 fn test_multi_same_key() {
649 let mut map = populate_hashmap();
650
651 use std::ptr::null;
652
653 let mut buffer = [null(); 3];
654 let mut wrapper = map.multi_mut(&mut buffer);
655
656 let _one = wrapper.get_mut("key_one").unwrap();
657 let _two = wrapper.get_mut("key_two").unwrap();
658 let _three = wrapper.get_mut("key_one").unwrap();
659 }
660
661 #[test]
662 fn test_multi_nonexistent() {
663 let mut map = populate_hashmap();
664
665 use std::ptr::null;
666
667 let mut buffer = [null(); 3];
668 let mut wrapper = map.multi_mut(&mut buffer);
669
670 assert_eq!(wrapper.get_mut("key_hundred"), None);
671 }
672
673 #[test]
674 #[should_panic]
675 fn test_multi_ref_nonexistent() {
676 let mut map = populate_hashmap();
677
678 use std::ptr::null;
679
680 let mut buffer = [null(); 3];
681 let mut wrapper = map.multi_mut(&mut buffer);
682
683 wrapper.mut_ref("key_hundred");
684 }
685
686 #[test]
687 fn test_multi_iter_success() {
688 let mut map = populate_hashmap();
689
690 use std::ptr::null;
691
692 let mut buffer = [null(); 3];
693 let keys = ["key_one", "key_two", "key_three"];
694 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
695
696 let one = wrapper.next().unwrap();
697 let two = wrapper.next().unwrap();
698 let three = wrapper.next().unwrap();
699
700 assert_eq!(one, "value_one");
701 assert_eq!(two, "value_two");
702 assert_eq!(three, "value_three");
703
704 one.push_str("_edited");
705 two.push_str("_edited");
706 three.push_str("_edited");
707
708 assert_eq!(one, "value_one_edited");
709 assert_eq!(two, "value_two_edited");
710 assert_eq!(three, "value_three_edited");
711 }
712
713 #[test]
714 fn test_multi_iter_over_capacity() {
715 let mut map = populate_hashmap();
716
717 use std::ptr::null;
718
719 let mut buffer = [null(); 3];
720 let keys = ["key_one", "key_two", "key_three"];
721 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
722
723 let _one = wrapper.next().unwrap();
724 let _two = wrapper.next().unwrap();
725 let _three = wrapper.next().unwrap();
726
727 assert_eq!(wrapper.next(), None);
728 }
729
730 #[test]
731 #[should_panic]
732 fn test_multi_iter_same_key() {
733 let mut map = populate_hashmap();
734
735 use std::ptr::null;
736
737 let mut buffer = [null(); 3];
738 let keys = ["key_one", "key_two", "key_one"];
739 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
740
741 let _one = wrapper.next().unwrap();
742 let _two = wrapper.next().unwrap();
743 let _three = wrapper.next().unwrap();
744 }
745
746 #[test]
747 #[should_panic]
748 fn test_multi_iter_nonexistent() {
749 let mut map = populate_hashmap();
750
751 use std::ptr::null;
752
753 let mut buffer = [null(); 3];
754 let keys = ["key_hundred"];
755 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
756
757 wrapper.next();
758 }
759
760}
761
762
763
764
765#[cfg(test)]
766mod tests_btree {
767
768 use std::collections::BTreeMap;
769 use BTreeMapMultiMut;
770
771 fn populate_hashmap() -> BTreeMap<String, String> {
772 let mut map = BTreeMap::new();
773 map.insert("key_one".into(), "value_one".into());
774 map.insert("key_two".into(), "value_two".into());
775 map.insert("key_three".into(), "value_three".into());
776 map.insert("key_four".into(), "value_four".into());
777 map.insert("key_five".into(), "value_five".into());
778 map.insert("key_six".into(), "value_six".into());
779 map
780 }
781
782 #[test]
783 fn test_pair_success() {
784 let mut map = populate_hashmap();
785 let (one, two): (&mut String, &mut String) = map.get_pair_mut("key_one", "key_two").unwrap();
786
787 assert_eq!(one, "value_one");
788 assert_eq!(two, "value_two");
789
790 one.push_str("_edited");
791 two.push_str("_edited");
792
793 assert_eq!(one, "value_one_edited");
794 assert_eq!(two, "value_two_edited");
795 }
796
797 #[test]
798 fn test_pair_nonexistent_key() {
799 let mut map = populate_hashmap();
800 assert_eq!(map.get_pair_mut("key_one", "key_hundred"), None);
801 }
802
803 #[test]
804 fn test_pair_overlap() {
805 let mut map = populate_hashmap();
806 assert_eq!(map.get_pair_mut("key_one", "key_one"), None);
807 }
808
809 #[test]
810 fn test_pair_panic_success() {
811 let mut map = populate_hashmap();
812 let (one, two): (&mut String, &mut String) = map.pair_mut("key_one", "key_two");
813
814 assert_eq!(one, "value_one");
815 assert_eq!(two, "value_two");
816
817 one.push_str("_edited");
818 two.push_str("_edited");
819
820 assert_eq!(one, "value_one_edited");
821 assert_eq!(two, "value_two_edited");
822 }
823
824 #[test]
825 #[should_panic]
826 fn test_pair_panic_nonexistent_key() {
827 let mut map = populate_hashmap();
828 map.pair_mut("key_one", "key_hundred");
829 }
830
831 #[test]
832 #[should_panic]
833 fn test_pair_panic_overlap() {
834 let mut map = populate_hashmap();
835 map.pair_mut("key_one", "key_one");
836 }
837
838 #[test]
839 fn test_triple_success() {
840 let mut map = populate_hashmap();
841 let (one, two, three): (&mut String, &mut String, &mut String) = map.get_triple_mut("key_one", "key_two", "key_three").unwrap();
842
843 assert_eq!(one, "value_one");
844 assert_eq!(two, "value_two");
845 assert_eq!(three, "value_three");
846
847 one.push_str("_edited");
848 two.push_str("_edited");
849 three.push_str("_edited");
850
851 assert_eq!(one, "value_one_edited");
852 assert_eq!(two, "value_two_edited");
853 assert_eq!(three, "value_three_edited");
854 }
855
856 #[test]
857 fn test_triple_nonexistent_key() {
858 let mut map = populate_hashmap();
859 assert_eq!(map.get_triple_mut("key_one", "key_hundred", "key_three"), None);
860 }
861
862 #[test]
863 fn test_triple_overlap_1() {
864 let mut map = populate_hashmap();
865 assert_eq!(map.get_triple_mut("key_one", "key_two", "key_one"), None);
866 }
867
868 #[test]
869 fn test_triple_overlap_2() {
870 let mut map = populate_hashmap();
871 assert_eq!(map.get_triple_mut("key_two", "key_two", "key_three"), None);
872 }
873
874 #[test]
875 fn test_triple_overlap_3() {
876 let mut map = populate_hashmap();
877 assert_eq!(map.get_triple_mut("key_one", "key_three", "key_three"), None);
878 }
879
880 #[test]
881 fn test_triple_overlap_4() {
882 let mut map = populate_hashmap();
883 assert_eq!(map.get_triple_mut("key_one", "key_one", "key_one"), None);
884 }
885
886 #[test]
887 fn test_triple_panic_success() {
888 let mut map = populate_hashmap();
889 let (one, two, three): (&mut String, &mut String, &mut String) = map.triple_mut("key_one", "key_two", "key_three");
890
891 assert_eq!(one, "value_one");
892 assert_eq!(two, "value_two");
893 assert_eq!(three, "value_three");
894
895 one.push_str("_edited");
896 two.push_str("_edited");
897 three.push_str("_edited");
898
899 assert_eq!(one, "value_one_edited");
900 assert_eq!(two, "value_two_edited");
901 assert_eq!(three, "value_three_edited");
902 }
903
904 #[test]
905 #[should_panic]
906 fn test_triple_panic_nonexistent_key() {
907 let mut map = populate_hashmap();
908 map.triple_mut("key_one", "key_hundred", "key_three");
909 }
910
911 #[test]
912 #[should_panic]
913 fn test_triple_panic_overlap_1() {
914 let mut map = populate_hashmap();
915 map.triple_mut("key_one", "key_two", "key_one");
916 }
917
918 #[test]
919 #[should_panic]
920 fn test_triple_panic_overlap_2() {
921 let mut map = populate_hashmap();
922 map.triple_mut("key_two", "key_two", "key_three");
923 }
924
925 #[test]
926 #[should_panic]
927 fn test_triple_panic_overlap_3() {
928 let mut map = populate_hashmap();
929 map.triple_mut("key_one", "key_three", "key_three");
930 }
931
932 #[test]
933 #[should_panic]
934 fn test_triple_panic_overlap_4() {
935 let mut map = populate_hashmap();
936 map.triple_mut("key_one", "key_one", "key_one");
937 }
938
939 #[test]
940 fn test_multi_success() {
941 let mut map = populate_hashmap();
942
943 use std::ptr::null;
944
945 let mut buffer = [null(); 3];
946 let mut wrapper = map.multi_mut(&mut buffer);
947
948 let one = wrapper.get_mut("key_one").unwrap();
949 let two = wrapper.get_mut("key_two").unwrap();
950 let three = wrapper.get_mut("key_three").unwrap();
951
952 assert_eq!(one, "value_one");
953 assert_eq!(two, "value_two");
954 assert_eq!(three, "value_three");
955
956 one.push_str("_edited");
957 two.push_str("_edited");
958 three.push_str("_edited");
959
960 assert_eq!(one, "value_one_edited");
961 assert_eq!(two, "value_two_edited");
962 assert_eq!(three, "value_three_edited");
963 }
964
965 #[test]
966 fn test_multi_ref_success() {
967 let mut map = populate_hashmap();
968
969 use std::ptr::null;
970
971 let mut buffer = [null(); 3];
972 let mut wrapper = map.multi_mut(&mut buffer);
973
974 let one = wrapper.mut_ref("key_one");
975 let two = wrapper.mut_ref("key_two");
976 let three = wrapper.mut_ref("key_three");
977
978 assert_eq!(one, "value_one");
979 assert_eq!(two, "value_two");
980 assert_eq!(three, "value_three");
981
982 one.push_str("_edited");
983 two.push_str("_edited");
984 three.push_str("_edited");
985
986 assert_eq!(one, "value_one_edited");
987 assert_eq!(two, "value_two_edited");
988 assert_eq!(three, "value_three_edited");
989 }
990
991 #[test]
992 #[should_panic]
993 fn test_multi_over_capacity() {
994 let mut map = populate_hashmap();
995
996 use std::ptr::null;
997
998 let mut buffer = [null(); 3];
999 let mut wrapper = map.multi_mut(&mut buffer);
1000
1001 let _one = wrapper.get_mut("key_one").unwrap();
1002 let _two = wrapper.get_mut("key_two").unwrap();
1003 let _three = wrapper.get_mut("key_three").unwrap();
1004 let _four = wrapper.get_mut("key_four").unwrap();
1005 }
1006
1007 #[test]
1008 #[should_panic]
1009 fn test_multi_same_key() {
1010 let mut map = populate_hashmap();
1011
1012 use std::ptr::null;
1013
1014 let mut buffer = [null(); 3];
1015 let mut wrapper = map.multi_mut(&mut buffer);
1016
1017 let _one = wrapper.get_mut("key_one").unwrap();
1018 let _two = wrapper.get_mut("key_two").unwrap();
1019 let _three = wrapper.get_mut("key_one").unwrap();
1020 }
1021
1022 #[test]
1023 fn test_multi_nonexistent() {
1024 let mut map = populate_hashmap();
1025
1026 use std::ptr::null;
1027
1028 let mut buffer = [null(); 3];
1029 let mut wrapper = map.multi_mut(&mut buffer);
1030
1031 assert_eq!(wrapper.get_mut("key_hundred"), None);
1032 }
1033
1034 #[test]
1035 #[should_panic]
1036 fn test_multi_ref_nonexistent() {
1037 let mut map = populate_hashmap();
1038
1039 use std::ptr::null;
1040
1041 let mut buffer = [null(); 3];
1042 let mut wrapper = map.multi_mut(&mut buffer);
1043
1044 wrapper.mut_ref("key_hundred");
1045 }
1046
1047 #[test]
1048 fn test_multi_iter_success() {
1049 let mut map = populate_hashmap();
1050
1051 use std::ptr::null;
1052
1053 let mut buffer = [null(); 3];
1054 let keys = ["key_one", "key_two", "key_three"];
1055 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
1056
1057 let one = wrapper.next().unwrap();
1058 let two = wrapper.next().unwrap();
1059 let three = wrapper.next().unwrap();
1060
1061 assert_eq!(one, "value_one");
1062 assert_eq!(two, "value_two");
1063 assert_eq!(three, "value_three");
1064
1065 one.push_str("_edited");
1066 two.push_str("_edited");
1067 three.push_str("_edited");
1068
1069 assert_eq!(one, "value_one_edited");
1070 assert_eq!(two, "value_two_edited");
1071 assert_eq!(three, "value_three_edited");
1072 }
1073
1074 #[test]
1075 fn test_multi_iter_over_capacity() {
1076 let mut map = populate_hashmap();
1077
1078 use std::ptr::null;
1079
1080 let mut buffer = [null(); 3];
1081 let keys = ["key_one", "key_two", "key_three"];
1082 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
1083
1084 let _one = wrapper.next().unwrap();
1085 let _two = wrapper.next().unwrap();
1086 let _three = wrapper.next().unwrap();
1087
1088 assert_eq!(wrapper.next(), None);
1089 }
1090
1091 #[test]
1092 #[should_panic]
1093 fn test_multi_iter_same_key() {
1094 let mut map = populate_hashmap();
1095
1096 use std::ptr::null;
1097
1098 let mut buffer = [null(); 3];
1099 let keys = ["key_one", "key_two", "key_one"];
1100 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
1101
1102 let _one = wrapper.next().unwrap();
1103 let _two = wrapper.next().unwrap();
1104 let _three = wrapper.next().unwrap();
1105 }
1106
1107 #[test]
1108 #[should_panic]
1109 fn test_multi_iter_nonexistent() {
1110 let mut map = populate_hashmap();
1111
1112 use std::ptr::null;
1113
1114 let mut buffer = [null(); 3];
1115 let keys = ["key_hundred"];
1116 let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
1117
1118 wrapper.next();
1119 }
1120
1121}