1use std::marker::PhantomData;
4
5use super::{
6 indices::KeyIndices,
7 ops::MinMax,
8 store::{Filterable, MetaData, Store},
9 view::Keys,
10};
11
12#[derive(Debug)]
14pub struct IntIndex<K = i32, X = usize> {
15 pos_data: Vec<Option<(K, KeyIndices<X>)>>,
16 neg_data: Vec<Option<(K, KeyIndices<X>)>>,
17 min_max_cache: MinMax<K>,
18 _key: PhantomData<K>,
19}
20
21impl<K, X> Filterable for IntIndex<K, X>
22where
23 K: Into<i32> + TryInto<usize> + Copy,
24{
25 type Key = K;
26 type Index = X;
27
28 #[inline]
29 fn get(&self, key: &Self::Key) -> &[X] {
30 let ikey: i32 = (*key).into();
31 match self.data(ikey).get(pos(ikey)) {
32 Some(Some((_, idx))) => idx.as_slice(),
33 _ => &[],
34 }
35 }
36
37 #[inline]
38 fn contains(&self, key: &Self::Key) -> bool {
39 let ikey: i32 = (*key).into();
40 matches!(self.data(ikey).get(pos(ikey)), Some(Some(_)))
41 }
42}
43
44impl<K, X> Store for IntIndex<K, X>
45where
46 K: Into<i32> + TryInto<usize> + Ord + Default + Copy,
47 X: Ord + Clone,
48{
49 fn insert(&mut self, key: K, x: X) {
50 let orig_key = key;
51 let i32key: i32 = key.into();
52 let pos = pos(i32key);
53 let data = self.data_mut(i32key);
54
55 if data.len() <= pos {
56 data.resize(pos + 1, None);
57 }
58
59 match data[pos].as_mut() {
60 Some((_, idx)) => idx.add(x),
61 None => data[pos] = Some((orig_key, KeyIndices::new(x))),
62 }
63
64 self.min_max_cache.new_value(orig_key);
65 }
66
67 fn delete(&mut self, key: K, x: &X) {
68 let orig_key = key;
69 let i32key: i32 = key.into();
70 let data = self.data_mut(i32key);
71
72 if let Some(Some((_, rm_idx))) = data.get_mut(pos(i32key)) {
73 if rm_idx.remove(x).is_empty() {
75 data[pos(i32key)] = None
76 }
77 }
78
79 if orig_key == self.min_max_cache.min {
80 self.min_max_cache.min = self._find_min();
81 }
82 if orig_key == self.min_max_cache.max {
83 self.min_max_cache.max = self._find_max();
84 }
85 }
86
87 fn with_capacity(capacity: usize) -> Self {
88 IntIndex {
89 pos_data: Vec::with_capacity(capacity),
90 neg_data: Vec::with_capacity(capacity),
91 min_max_cache: MinMax::default(),
92 _key: PhantomData,
93 }
94 }
95}
96
97impl<K, X> IntIndex<K, X> {
98 #[inline]
99 fn data(&self, key: i32) -> &[Option<(K, KeyIndices<X>)>] {
100 if key < 0 {
101 return &self.neg_data;
102 }
103 &self.pos_data
104 }
105
106 #[inline]
107 fn data_mut(&mut self, key: i32) -> &mut Vec<Option<(K, KeyIndices<X>)>> {
108 if key < 0 {
109 return &mut self.neg_data;
110 }
111 &mut self.pos_data
112 }
113}
114
115impl<K> Keys for IntIndex<K>
116where
117 K: Into<i32> + TryInto<usize> + Ord + Default + Copy,
118{
119 type Key = K;
120
121 fn exist(&self, key: &K) -> bool {
122 let key: i32 = (*key).into();
123 matches!(self.data(key).get(pos(key)), Some(Some(_)))
124 }
125
126 fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = &'a Self::Key> + 'a> {
127 Box::new(KeyIntIter::new(&self.neg_data, &self.pos_data))
128 }
129
130 fn from_iter<I>(it: I) -> Self
131 where
132 I: IntoIterator<Item = K>,
133 {
134 fn add_key<K>(view: &mut IntIndex<K>, key: K)
135 where
136 K: Into<i32> + TryInto<usize> + Copy,
137 {
138 let ikey: i32 = key.into();
139 let pos = pos(ikey);
140 let data = view.data_mut(ikey);
141
142 if data.len() <= pos {
143 data.resize(pos + 1, None);
144 }
145
146 data[pos] = Some((key, KeyIndices::empty()))
147 }
148
149 let v = Vec::from_iter(it);
150 let mut view =
151 Self::with_capacity(v.iter().map(|k| pos((*k).into())).max().unwrap_or_default());
152 v.into_iter().for_each(|key| add_key(&mut view, key));
153 view
154 }
155}
156
157#[inline]
158fn pos(key: i32) -> usize {
159 if key < 0 {
160 key.abs().try_into()
161 } else {
162 key.try_into()
163 }
164 .expect("key could not convert into usize")
165}
166
167struct KeyIntIter<'a, K> {
168 pos: &'a [Option<(K, KeyIndices)>],
169 iter: std::slice::Iter<'a, Option<(K, KeyIndices)>>,
170 is_neg: bool,
171}
172
173impl<'a, K> KeyIntIter<'a, K> {
174 fn new(neg: &'a [Option<(K, KeyIndices)>], pos: &'a [Option<(K, KeyIndices)>]) -> Self {
175 Self {
176 pos,
177 is_neg: true,
178 iter: neg.iter(),
179 }
180 }
181}
182
183impl<'a, K> Iterator for KeyIntIter<'a, K> {
184 type Item = &'a K;
185
186 fn next(&mut self) -> Option<Self::Item> {
187 if let Some(opt) = self.iter.by_ref().flatten().next() {
188 return Some(&opt.0);
189 }
190
191 if self.is_neg {
192 self.is_neg = false;
193 self.iter = self.pos.iter();
194
195 if let Some(opt) = self.iter.by_ref().flatten().next() {
196 return Some(&opt.0);
197 }
198 }
199
200 None
201 }
202}
203
204impl<K, X> MetaData for IntIndex<K, X> {
205 type Meta<'m> = IntMeta<'m, K,X> where K: 'm, X:'m;
206
207 fn meta(&self) -> Self::Meta<'_> {
208 IntMeta(self)
209 }
210}
211
212pub struct IntMeta<'s, K: 's, X>(&'s IntIndex<K, X>);
214
215impl<'s, K, X> IntMeta<'s, K, X>
216where
217 K: 's + Copy,
218{
219 pub const fn min_key(&self) -> K {
221 self.0.min_max_cache.min
222 }
223
224 pub const fn max_key(&self) -> K {
226 self.0.min_max_cache.max
227 }
228}
229
230impl<K, X> IntIndex<K, X>
231where
232 K: Default + Copy,
233{
234 fn _find_min(&self) -> K {
236 let n = self
237 .neg_data
238 .iter()
239 .rev()
240 .find_map(|o| o.as_ref().map(|(k, _)| *k));
241
242 if let Some(n) = n {
243 return n;
244 }
245
246 self.pos_data
247 .iter()
248 .find_map(|o| o.as_ref().map(|(k, _)| *k))
249 .unwrap_or_default()
250 }
251
252 fn _find_max(&self) -> K {
254 let p = self
255 .pos_data
256 .iter()
257 .rev()
258 .find_map(|o| o.as_ref().map(|(k, _)| *k));
259
260 if let Some(p) = p {
261 return p;
262 }
263
264 self.neg_data
265 .iter()
266 .find_map(|o| o.as_ref().map(|(k, _)| *k))
267 .unwrap_or_default()
268 }
269}
270
271#[cfg(test)]
272mod tests {
273 use super::*;
274 use crate::index::filter::Filter;
275
276 impl IntIndex<i32> {
277 fn new() -> Self {
278 Self {
279 pos_data: Vec::new(),
280 neg_data: Vec::new(),
281 min_max_cache: MinMax::default(),
282 _key: PhantomData,
283 }
284 }
285 }
286
287 #[test]
288 fn insert_plus() {
289 let mut i = IntIndex::new();
290 i.insert(1, 3);
291 i.insert(2, 4);
292
293 assert!(i.contains(&1));
294 assert!(!i.contains(&3));
295
296 let r = i.get(&2).iter().collect::<Vec<_>>();
297 assert_eq!(vec![&4], r);
298 }
299
300 #[test]
301 fn insert_minus() {
302 let mut i = IntIndex::new();
303 i.insert(-1, 3);
304 i.insert(-2, 4);
305
306 assert!(i.contains(&-1));
307 assert!(!i.contains(&-3));
308
309 let r = i.get(&-2).iter().collect::<Vec<_>>();
310 assert_eq!(vec![&4], r);
311 }
312
313 #[test]
314 fn insert_plus_minus() {
315 let mut i = IntIndex::new();
316 i.insert(1, 3);
317 i.insert(-2, 4);
318 i.insert(3, 8);
319
320 assert!(i.contains(&1));
321 assert!(i.contains(&-2));
322 assert!(i.contains(&3));
323 assert!(!i.contains(&5));
324
325 let r = i.get_many([-2, 3]).collect::<Vec<_>>();
326 assert_eq!(vec![&4, &8], r);
327 }
328
329 #[test]
330 fn delete_plus_minus() {
331 let mut i = IntIndex::new();
332 i.insert(1, 3);
333 i.insert(-2, 4);
334 i.insert(1, 5);
335
336 assert!(i.contains(&1));
337 assert!(i.contains(&-2));
338
339 i.delete(1, &3);
340 assert!(i.contains(&1));
341 assert!(i.contains(&-2));
342
343 i.delete(1, &5);
344 assert!(!i.contains(&1));
345 assert!(i.contains(&-2));
346 }
347
348 #[test]
349 fn filter() {
350 let mut i = IntIndex::with_capacity(4);
351 i.insert(2, 4);
352
353 assert_eq!(i.get(&2), [4]);
354
355 i.insert(1, 3);
356 let f = Filter(&i);
357 assert_eq!([3, 4], (f.eq(&2) | f.eq(&1)));
358 }
359
360 #[test]
361 fn meta() {
362 let mut i = IntIndex::<i8>::with_capacity(3);
363 i.insert(2, 4);
364
365 assert_eq!(2i8, i.meta().min_key());
366 assert_eq!(2i8, i.meta().max_key());
367
368 i.insert(1, 3);
369 assert_eq!(1, i.meta().min_key());
370 assert_eq!(2, i.meta().max_key());
371 }
372
373 #[test]
374 fn index_str() {
375 let mut i = IntIndex::<i8, String>::with_capacity(8);
376 i.insert(1, "Jasmin".into());
377 i.insert(2, "Mario 1".into());
378 i.insert(2, "Mario 2".into());
379 i.insert(-5, "Paul".into());
380
381 assert!(i.contains(&-5));
382
383 for idx in i.get(&1).iter() {
384 assert_eq!(&String::from("Jasmin"), idx);
385 }
386
387 let idxs = i.get(&1);
388 let mut it = idxs.iter();
389 assert_eq!(Some(&"Jasmin".into()), it.next());
390 assert_eq!(None, it.next());
391
392 let idxs = i.get(&2);
393 let mut it = idxs.iter();
394 assert_eq!(Some(&"Mario 1".into()), it.next());
395 assert_eq!(Some(&"Mario 2".into()), it.next());
396 assert_eq!(None, it.next());
397
398 let r = i.get_many([1, -5]).collect::<Vec<_>>();
399 assert_eq!(vec![&String::from("Jasmin"), &String::from("Paul")], r);
400
401 let r = i.get_many([-5, 1]).collect::<Vec<_>>();
402 assert_eq!(vec![&String::from("Paul"), &String::from("Jasmin")], r);
403 }
404
405 mod unique {
406 use super::*;
407
408 #[test]
409 fn empty() {
410 let i = IntIndex::new();
411 assert_eq!(0, i.get(&2).len());
412 assert!(i.pos_data.is_empty());
413 assert!(i.neg_data.is_empty());
414 }
415
416 #[test]
417 fn find_idx_2_usize_pos() {
418 let mut i = IntIndex::new();
419 i.insert(2, 4);
420
421 assert_eq!(i.get(&2), [4]);
422 assert_eq!(3, i.pos_data.len());
423 assert_eq!(0, i.neg_data.len());
424 }
425
426 #[test]
427 fn find_idx_2_usize_neg() {
428 let mut i = IntIndex::new();
429 i.insert(-2, 4);
430
431 assert_eq!(i.get(&-2), [4]);
432 assert_eq!(0, i.pos_data.len());
433 assert_eq!(3, i.neg_data.len());
434 }
435
436 #[test]
437 fn find_idx_2_bool() {
438 let mut i = IntIndex::<bool>::with_capacity(2);
439 i.insert(true, 4);
440
441 assert_eq!(i.get(&true), [4]);
442 assert_eq!(2, i.pos_data.len());
443 assert_eq!(0, i.neg_data.len());
444 }
445
446 #[test]
447 fn find_idx_2_u16() {
448 let mut i = IntIndex::<u16>::with_capacity(2);
449 i.insert(2, 4);
450
451 assert_eq!(i.get(&2), [4]);
452 assert_eq!(3, i.pos_data.len());
453 assert_eq!(0, i.neg_data.len());
454 }
455
456 #[test]
457 fn or_find_idx_3_4() {
458 let mut idx = IntIndex::new();
459 idx.insert(2, 4);
460 idx.insert(4, 8);
461 idx.insert(3, 6);
462
463 let f = Filter(&idx);
464
465 assert_eq!([6, 8], f.eq(&3) | f.eq(&4));
466 assert_eq!([6], f.eq(&3) & f.eq(&3));
467 assert_eq!([6], f.eq(&3) | f.eq(&99));
468 assert_eq!([8], f.eq(&99) | f.eq(&4));
469 assert_eq!([], f.eq(&3) & f.eq(&4));
470
471 idx.insert(99, 0);
472 assert_eq!([0], idx.get(&99));
473 }
474
475 #[test]
476 fn query_and_or() {
477 let mut idx = IntIndex::new();
478 idx.insert(2, 4);
479 idx.insert(4, 8);
480 idx.insert(3, 6);
481
482 let f = Filter(&idx);
483
484 assert_eq!([], f.eq(&3) & f.eq(&2));
485
486 assert_eq!([6], f.eq(&3) | f.eq(&4) & f.eq(&2));
493 }
494
495 #[test]
496 fn out_of_bound() {
497 let i = IntIndex::new();
498 assert_eq!(0, i.get(&2).len());
499 }
500
501 #[test]
502 fn with_capacity() {
503 let mut i = IntIndex::<u8>::with_capacity(5);
504 i.insert(1, 4);
505 assert_eq!(2, i.pos_data.len());
506 assert_eq!(5, i.pos_data.capacity());
507 assert_eq!(0, i.neg_data.len());
508 assert_eq!(5, i.neg_data.capacity());
509 }
510
511 #[test]
512 fn find_eq_many_unique() {
513 let l = [0, 1, 2, 3, 4, 5, 6];
514 let i = IntIndex::<u8>::from_list(l);
515
516 assert_eq!(0, i.get_many([]).items_vec(&l).len());
517 assert_eq!(0, i.get_many([9]).items_vec(&l).len());
518 assert_eq!(vec![&2], i.get_many([2]).items_vec(&l));
519 assert_eq!(vec![&6, &2], i.get_many([6, 2]).items_vec(&l));
520 assert_eq!(vec![&6, &2], i.get_many([9, 6, 2]).items_vec(&l));
521 assert_eq!(vec![&5, &6, &2], i.get_many([5, 9, 6, 2]).items_vec(&l));
522
523 assert_eq!(vec![&2, &3, &4, &5, &6], i.get_many(2..=6).items_vec(&l));
524 assert_eq!(vec![&2, &3, &4, &5, &6], i.get_many(2..9).items_vec(&l));
525 }
526
527 #[test]
528 fn contains() {
529 let mut i = IntIndex::<u8>::with_capacity(2);
530 i.insert(5, 5);
531 i.insert(2, 2);
532
533 assert!(i.contains(&5));
534 assert!(!i.contains(&55));
535 }
536
537 #[test]
538 fn min() {
539 let mut idx = IntIndex::<i16>::with_capacity(100);
540 assert_eq!(0, idx.meta().min_key());
541 assert_eq!(0, idx._find_min());
542
543 idx.insert(4, 4);
544 assert_eq!(4, idx.meta().min_key());
545 assert_eq!(4, idx._find_min());
546
547 idx.insert(-2, 8);
548 assert_eq!(-2, idx.meta().min_key());
549 assert_eq!(-2, idx._find_min());
550
551 idx.insert(99, 6);
552 assert_eq!(-2, idx.meta().min_key());
553 assert_eq!(-2, idx._find_min());
554 }
555
556 #[test]
557 fn min_rm() {
558 let mut idx = IntIndex::<u16>::with_capacity(100);
559 idx.insert(4, 4);
560 assert_eq!(4, idx.meta().min_key());
561 assert_eq!(4, idx._find_min());
562
563 idx.insert(2, 8);
564 assert_eq!(2, idx.meta().min_key());
565 assert_eq!(2, idx._find_min());
566
567 idx.delete(2, &8);
568 assert_eq!(4, idx.meta().min_key()); assert_eq!(4, idx._find_min()); }
571
572 #[test]
573 fn max() {
574 let mut idx = IntIndex::<i16>::with_capacity(100);
575 assert_eq!(0, idx.meta().max_key());
576
577 idx.insert(4, 4);
578 assert_eq!(4, idx.meta().max_key());
579
580 idx.insert(-2, 8);
581 assert_eq!(4, idx.meta().max_key());
582
583 idx.insert(99, 6);
584 assert_eq!(99, idx.meta().max_key());
585 }
586
587 #[test]
588 fn update() {
589 let mut idx = IntIndex::new();
590 idx.insert(2, 4);
591
592 assert_eq!(2, idx.meta().min_key());
593 assert_eq!(2, idx.meta().max_key());
594
595 idx.update(99, 4, 100);
597 assert_eq!(101, idx.pos_data.len());
598 assert_eq!([4], idx.get(&100));
599
600 idx.update(2, 8, 2);
602 assert_eq!([4, 8], idx.get(&2));
603
604 idx.update(2, 8, 4);
606 assert_eq!([8], idx.get(&4));
607 assert_eq!([4], idx.get(&2));
608
609 assert_eq!(2, idx.meta().min_key());
610 assert_eq!(100, idx.meta().max_key());
611 }
612
613 #[test]
614 fn delete_empty() {
615 let idx = IntIndex::new();
616
617 assert_eq!(0, idx.meta().min_key());
618 assert_eq!(0, idx.meta().max_key());
619 }
620
621 #[test]
622 fn delete_pos() {
623 let mut idx = IntIndex::new();
624 idx.insert(2, 4);
625 idx.insert(2, 3);
626 idx.insert(3, 1);
627
628 assert_eq!(2, idx.meta().min_key());
629 assert_eq!(3, idx.meta().max_key());
630
631 idx.delete(2, &100);
633 assert_eq!([3, 4], idx.get(&2));
634
635 idx.delete(2, &3);
637 assert_eq!([4], idx.get(&2));
638 assert_eq!(2, idx.meta().min_key());
639 assert_eq!(3, idx.meta().max_key());
640
641 idx.delete(2, &4);
643 assert!(idx.get(&2).is_empty());
644 assert_eq!(3, idx.meta().min_key());
645 assert_eq!(3, idx.meta().max_key());
646
647 idx.insert(2, 4);
648 idx.delete(3, &1);
650 assert_eq!(2, idx.meta().max_key());
651 }
652
653 #[test]
654 fn delete_neg() {
655 let mut idx = IntIndex::new();
656 idx.insert(-2, 4);
657 idx.insert(-2, 3);
658 idx.insert(-3, 1);
659
660 assert_eq!(-3, idx.meta().min_key());
661 assert_eq!(-2, idx.meta().max_key());
662
663 idx.delete(-3, &1);
664 assert_eq!(-2, idx.meta().min_key());
665 assert_eq!(-2, idx.meta().max_key());
666
667 idx.insert(-3, 1);
668 assert_eq!(-3, idx.meta().min_key());
669 assert_eq!(-2, idx.meta().max_key());
670
671 idx.delete(-2, &4);
672 idx.delete(-2, &3);
673 assert_eq!(-3, idx.meta().min_key());
674 assert_eq!(-3, idx.meta().max_key());
675 }
676
677 #[test]
678 fn delete_pos_neg() {
679 let mut idx = IntIndex::new();
680 idx.insert(2, 4);
681 idx.insert(-2, 3);
682 idx.insert(-3, 1);
683
684 assert_eq!(-3, idx.meta().min_key());
685 assert_eq!(2, idx.meta().max_key());
686
687 idx.delete(-3, &1);
688 assert_eq!(-2, idx.meta().min_key());
689 assert_eq!(2, idx.meta().max_key());
690
691 idx.insert(-3, 1);
692 assert_eq!(-3, idx.meta().min_key());
693 assert_eq!(2, idx.meta().max_key());
694
695 idx.delete(2, &4);
696 assert_eq!(-3, idx.meta().min_key());
697 assert_eq!(-2, idx.meta().max_key());
698 }
699 }
700
701 mod multi {
702 use super::*;
703
704 #[test]
705 fn empty() {
706 let i = IntIndex::<u8>::with_capacity(2);
707 assert_eq!(0, i.get(&2).len());
708 assert!(i.pos_data.is_empty());
709 assert!(i.neg_data.is_empty());
710 }
711
712 #[test]
713 fn find_idx_2() {
714 let mut i = IntIndex::<u8, i32>::with_capacity(2);
715 i.insert(2, 2);
716 i.insert(2, -2);
717
718 assert_eq!(i.get(&2), [-2, 2]);
719 assert_eq!(3, i.pos_data.len());
720 assert_eq!(0, i.neg_data.len());
721 }
722
723 #[test]
724 fn double_index() {
725 let mut i = IntIndex::new();
726 i.insert(2, 2);
727 i.insert(2, 1);
728 assert_eq!(i.get(&2), [1, 2]);
729
730 i.insert(-2, 2);
731 i.insert(-2, 1);
732 assert_eq!(i.get(&-2), [1, 2]);
733 }
734
735 #[test]
736 fn find_eq_many_unique() {
737 let l = [0, 2, 2, -3, 4, 5, -6];
738 let i = IntIndex::<i8>::from_list(l);
739
740 assert_eq!(0, i.get_many([]).items_vec(&l).len());
741 assert_eq!(0, i.get_many([9]).items_vec(&l).len());
742
743 assert_eq!(vec![&2, &2], i.get_many([2]).items_vec(&l));
744 assert_eq!(vec![&-6, &2, &2], i.get_many([-6, 2]).items_vec(&l));
745 assert_eq!(vec![&-6, &2, &2], i.get_many([9, -6, 2]).items_vec(&l));
746 assert_eq!(
747 vec![&5, &-6, &2, &2],
748 i.get_many([5, 9, -6, 2]).items_vec(&l)
749 );
750 }
751
752 #[test]
753 fn contains() {
754 let mut i = IntIndex::<i8, i8>::with_capacity(3);
755 i.insert(2, 2);
756 i.insert(2, 1);
757 assert!(i.contains(&2));
758 assert!(!i.contains(&55));
759
760 i.insert(-2, -2);
761 i.insert(-2, -1);
762 assert!(i.contains(&-2));
763 assert!(!i.contains(&-55));
764 }
765 }
766
767 mod keys {
768 use super::*;
769
770 #[test]
771 fn empty() {
772 let keys = IntIndex::from_iter(Vec::<i32>::new());
773 assert!(!keys.exist(&1));
774 }
775
776 #[test]
777 fn one() {
778 let keys = IntIndex::from_iter([2i32]);
779 assert!(!keys.exist(&1));
780 assert!(keys.exist(&2));
781
782 let keys = IntIndex::from_iter([-2i32]);
783 assert!(!keys.exist(&-1));
784 assert!(keys.exist(&-2));
785 }
786
787 #[test]
788 fn two() {
789 let keys = IntIndex::from_iter([2i32, -2]);
790 assert!(!keys.exist(&1));
791 assert!(keys.exist(&2));
792 assert!(!keys.exist(&-1));
793 assert!(keys.exist(&-2));
794 }
795
796 #[test]
797 fn keys() {
798 let keys = IntIndex::from_iter([5, 1, 3]);
799 assert_eq!(keys.iter().collect::<Vec<_>>(), vec![&1, &3, &5]);
800
801 let keys = IntIndex::from_iter([5u8, 1, 3]);
802 assert_eq!(keys.iter().collect::<Vec<_>>(), vec![&1, &3, &5]);
803
804 let keys = IntIndex::from_iter([true, false, true]);
806 assert_eq!(keys.iter().collect::<Vec<_>>(), vec![&false, &true]);
807 }
808
809 #[test]
810 fn keys_with_neg() {
811 let keys = IntIndex::from_iter([5, -1, -3]);
812 assert_eq!(keys.iter().collect::<Vec<_>>(), vec![&-1, &-3, &5]);
813
814 let keys = IntIndex::from_iter([-5, -1, -3]);
815 assert_eq!(keys.iter().collect::<Vec<_>>(), vec![&-1, &-3, &-5]);
816
817 let keys = IntIndex::from_iter([-5, 1, 3, 5]);
818 assert_eq!(keys.iter().collect::<Vec<_>>(), vec![&-5, &1, &3, &5]);
819
820 let keys = IntIndex::from_iter([1, 3, 5, -1, -3, -5]);
821 assert_eq!(
822 keys.iter().collect::<Vec<_>>(),
823 vec![&-1, &-3, &-5, &1, &3, &5]
824 );
825 }
826 }
827}