1use core::mem;
2use core::fmt;
3use core::slice;
4use core::borrow::Borrow;
5use core::ops::{Bound, RangeBounds};
6
7#[cfg(feature = "std")]
8use std::collections::BTreeMap;
9#[cfg(feature = "std")]
10use std::collections::btree_map::{Iter as BTreeIter, IterMut as BTreeIterMut,
11 Range as BTreeRange};
12#[cfg(all(feature = "alloc", not(feature = "std")))]
13use alloc::collections::btree_map::BTreeMap;
14#[cfg(all(feature = "alloc", not(feature = "std")))]
15use alloc::collections::btree_map::{Iter as BTreeIter, IterMut as BTreeIterMut,
16 Range as BTreeRange};
17
18pub enum ManagedMap<'a, K: 'a, V: 'a> {
40 Borrowed(&'a mut [Option<(K, V)>]),
42 #[cfg(any(feature = "std", feature = "alloc"))]
44 Owned(BTreeMap<K, V>)
45}
46
47impl<'a, K: 'a, V: 'a> fmt::Debug for ManagedMap<'a, K, V>
48 where K: fmt::Debug, V: fmt::Debug {
49 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
50 match self {
51 &ManagedMap::Borrowed(ref x) => write!(f, "Borrowed({:?})", x),
52 #[cfg(any(feature = "std", feature = "alloc"))]
53 &ManagedMap::Owned(ref x) => write!(f, "Owned({:?})", x)
54 }
55 }
56}
57
58impl<'a, K: 'a, V: 'a> From<&'a mut [Option<(K, V)>]> for ManagedMap<'a, K, V> {
59 fn from(value: &'a mut [Option<(K, V)>]) -> Self {
60 ManagedMap::Borrowed(value)
61 }
62}
63
64#[cfg(any(feature = "std", feature = "alloc"))]
65impl<'a, K: 'a, V: 'a> From<BTreeMap<K, V>> for ManagedMap<'a, K, V> {
66 fn from(value: BTreeMap<K, V>) -> Self {
67 ManagedMap::Owned(value)
68 }
69}
70
71#[derive(PartialEq, Eq, PartialOrd, Ord)]
73enum RevOption<T> {
74 Some(T),
75 None
76}
77
78impl<T> From<Option<T>> for RevOption<T> {
79 fn from(other: Option<T>) -> Self {
80 match other {
81 Some(x) => RevOption::Some(x),
82 None => RevOption::None
83 }
84 }
85}
86
87impl<T> Into<Option<T>> for RevOption<T> {
88 fn into(self) -> Option<T> {
89 match self {
90 RevOption::Some(x) => Some(x),
91 RevOption::None => None
92 }
93 }
94}
95
96#[derive(Debug, Clone)]
97enum RangeInner<'a, K: 'a, V: 'a> {
98 Borrowed { slice: &'a [Option<(K, V)>], begin: usize, end: usize },
100 #[cfg(any(feature = "std", feature = "alloc"))]
102 Owned(BTreeRange<'a, K, V>),
103}
104
105#[derive(Debug, Clone)]
106pub struct Range<'a, K: 'a, V: 'a>(RangeInner<'a, K, V>);
107
108impl<'a, K: 'a, V: 'a> Iterator for Range<'a, K, V> {
109 type Item = (&'a K, &'a V);
110
111 fn next(&mut self) -> Option<Self::Item> {
112 match self.0 {
113 RangeInner::Borrowed { ref slice, ref mut begin, ref end } => {
114 *begin += 1;
115 if *begin-1 >= *end {
116 None
117 } else {
118 match slice[*begin-1] {
119 None => None,
120 Some((ref k, ref v)) => Some((k, v))
121 }
122 }
123 },
124 #[cfg(any(feature = "std", feature = "alloc"))]
125 RangeInner::Owned(ref mut range) => range.next(),
126 }
127 }
128}
129
130impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Range<'a, K, V> {
131 fn next_back(&mut self) -> Option<Self::Item> {
132 match self.0 {
133 RangeInner::Borrowed { ref slice, ref begin, ref mut end } => {
134 if *begin >= *end {
135 None
136 } else {
137 *end -= 1;
138 match slice[*end] {
139 None => None,
140 Some((ref k, ref v)) => Some((k, v))
141 }
142 }
143 },
144 #[cfg(any(feature = "std", feature = "alloc"))]
145 RangeInner::Owned(ref mut range) => range.next_back(),
146 }
147 }
148}
149
150fn binary_search_by_key_range<'a, K, V, Q: 'a, R>(slice: &[Option<(K, V)>], range: R) -> Result<(usize, usize), ()>
151 where K: Ord + Borrow<Q>, Q: Ord + ?Sized, R: RangeBounds<Q>
152{
153 if slice.len() == 0 {
154 return Err(())
155 }
156 let (mut left, mut right) = (0, slice.len() - 1);
157
158 macro_rules! key {
159 ( $e:expr) => { $e.as_ref().map(|&(ref key, _)| key.borrow()) }
160 }
161
162 let begin;
169 if let Bound::Unbounded = range.start_bound() {
170 begin = 0;
171 } else {
172 macro_rules! is_before_range {
173 ( $item: expr) => {
174 match &range.start_bound() {
175 Bound::Included(ref key_begin) => $item < Some(key_begin.borrow()),
176 Bound::Excluded(ref key_begin) => $item <= Some(key_begin.borrow()),
177 Bound::Unbounded => unreachable!()
178 }
179 }
180 };
181 while left < right {
182 let middle = left + (right - left) / 2;
183 if is_before_range!(key!(slice[middle])) {
184 left = middle + 1;
185 } else if middle > 0 && !is_before_range!(key!(slice[middle - 1])) {
186 right = middle - 1;
187 } else {
188 left = middle;
189 break
190 }
191 }
192 if left == slice.len() || is_before_range!(key!(slice[left])) {
193 return Err(())
194 }
195 begin = left
196 };
197
198 let end;
200 if let Bound::Unbounded = range.end_bound() {
201 end = slice.len()
202 } else {
203 macro_rules! is_after_range {
204 ( $item:expr ) => {
205 match &range.end_bound() {
206 Bound::Included(ref key_end) => $item > Some(key_end.borrow()),
207 Bound::Excluded(ref key_end) => $item >= Some(key_end.borrow()),
208 Bound::Unbounded => unreachable!()
209 }
210 }
211 };
212 right = slice.len(); while left < right {
214 let middle = left + (right - left + 1) / 2;
215 if is_after_range!(key!(slice[middle - 1])) {
216 right = middle - 1;
217 } else if middle < slice.len() && !is_after_range!(key!(slice[middle])) {
218 left = middle + 1;
219 } else {
220 right = middle;
221 break
222 }
223 }
224 if right == 0 || is_after_range!(key!(slice[right - 1])) {
225 return Err(())
226 }
227 end = right
228 };
229
230 Ok((begin, end))
231}
232
233fn binary_search_by_key<K, V, Q>(slice: &[Option<(K, V)>], key: &Q) -> Result<usize, usize>
234 where K: Ord + Borrow<Q>, Q: Ord + ?Sized
235{
236 slice.binary_search_by_key(&RevOption::Some(key), |entry| {
237 entry.as_ref().map(|&(ref key, _)| key.borrow()).into()
238 })
239}
240
241fn pair_by_key<'a, K, Q, V>(slice: &'a [Option<(K, V)>], key: &Q) ->
242 Result<&'a (K, V), usize>
243 where K: Ord + Borrow<Q>, Q: Ord + ?Sized
244{
245 binary_search_by_key(slice, key).map(move |idx| slice[idx].as_ref().unwrap())
246}
247
248fn pair_mut_by_key<'a, K, Q, V>(slice: &'a mut [Option<(K, V)>], key: &Q) ->
249 Result<&'a mut (K, V), usize>
250 where K: Ord + Borrow<Q>, Q: Ord + ?Sized
251{
252 binary_search_by_key(slice, key).map(move |idx| slice[idx].as_mut().unwrap())
253}
254
255impl<'a, K: Ord + 'a, V: 'a> ManagedMap<'a, K, V> {
256 pub fn clear(&mut self) {
257 match self {
258 &mut ManagedMap::Borrowed(ref mut pairs) => {
259 for item in pairs.iter_mut() {
260 *item = None
261 }
262 },
263 #[cfg(any(feature = "std", feature = "alloc"))]
264 &mut ManagedMap::Owned(ref mut map) => map.clear()
265 }
266 }
267
268 pub fn get<Q>(&self, key: &Q) -> Option<&V>
269 where K: Borrow<Q>, Q: Ord + ?Sized
270 {
271 match self {
272 &ManagedMap::Borrowed(ref pairs) => {
273 match pair_by_key(pairs, key.borrow()) {
274 Ok(&(_, ref value)) => Some(value),
275 Err(_) => None
276 }
277 },
278 #[cfg(any(feature = "std", feature = "alloc"))]
279 &ManagedMap::Owned(ref map) => map.get(key)
280 }
281 }
282
283 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
284 where K: Borrow<Q>, Q: Ord + ?Sized
285 {
286 match self {
287 &mut ManagedMap::Borrowed(ref mut pairs) => {
288 match pair_mut_by_key(pairs, key.borrow()) {
289 Ok(&mut (_, ref mut value)) => Some(value),
290 Err(_) => None
291 }
292 },
293 #[cfg(any(feature = "std", feature = "alloc"))]
294 &mut ManagedMap::Owned(ref mut map) => map.get_mut(key)
295 }
296 }
297
298 pub fn range<'b, 'c, Q: 'c, R>(&'b self, range: R) -> Range<'a, K, V>
299 where K: Borrow<Q>, Q: Ord + ?Sized, R: RangeBounds<Q>, 'b: 'a
300 {
301 match self {
302 &ManagedMap::Borrowed(ref pairs) => {
303 match binary_search_by_key_range(&pairs[0..self.len()], range) {
304 Ok((begin, end)) => Range(RangeInner::Borrowed {
305 slice: &pairs[begin..end], begin: 0, end: end-begin }),
306 Err(()) => Range(RangeInner::Borrowed {
307 slice: &[], begin: 0, end: 0 }),
308 }
309 },
310 #[cfg(any(feature = "std", feature = "alloc"))]
311 &ManagedMap::Owned(ref map) => {
312 Range(RangeInner::Owned(map.range(range)))
313 },
314 }
315 }
316
317 pub fn insert(&mut self, key: K, new_value: V) -> Result<Option<V>, (K, V)> {
318 match self {
319 &mut ManagedMap::Borrowed(ref mut pairs) if pairs.len() < 1 =>
320 Err((key, new_value)), &mut ManagedMap::Borrowed(ref mut pairs) => {
322 match binary_search_by_key(pairs, &key) {
323 Err(_) if pairs[pairs.len() - 1].is_some() =>
324 Err((key, new_value)), Err(idx) => {
326 let rotate_by = pairs.len() - idx - 1;
327 pairs[idx..].rotate_left(rotate_by);
328 assert!(pairs[idx].is_none(), "broken invariant");
329 pairs[idx] = Some((key, new_value));
330 Ok(None)
331 }
332 Ok(idx) => {
333 let mut swap_pair = Some((key, new_value));
334 mem::swap(&mut pairs[idx], &mut swap_pair);
335 let (_key, value) = swap_pair.expect("broken invariant");
336 Ok(Some(value))
337 }
338 }
339 },
340 #[cfg(any(feature = "std", feature = "alloc"))]
341 &mut ManagedMap::Owned(ref mut map) => Ok(map.insert(key, new_value))
342 }
343 }
344
345 pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
346 where K: Borrow<Q>, Q: Ord + ?Sized
347 {
348 match self {
349 &mut ManagedMap::Borrowed(ref mut pairs) => {
350 match binary_search_by_key(pairs, key) {
351 Ok(idx) => {
352 let (_key, value) = pairs[idx].take().expect("broken invariant");
353 pairs[idx..].rotate_left(1);
354 Some(value)
355 }
356 Err(_) => None
357 }
358 },
359 #[cfg(any(feature = "std", feature = "alloc"))]
360 &mut ManagedMap::Owned(ref mut map) => map.remove(key)
361 }
362 }
363
364 pub fn is_empty(&self) -> bool {
366 match self {
367 &ManagedMap::Borrowed(ref pairs) =>
368 pairs.iter().all(|item| item.is_none()),
369 #[cfg(any(feature = "std", feature = "alloc"))]
370 &ManagedMap::Owned(ref map) =>
371 map.is_empty()
372 }
373 }
374
375 pub fn len(&self) -> usize {
377 match self {
378 &ManagedMap::Borrowed(ref pairs) =>
379 pairs.iter()
380 .take_while(|item| item.is_some())
381 .count(),
382 #[cfg(any(feature = "std", feature = "alloc"))]
383 &ManagedMap::Owned(ref map) =>
384 map.len()
385 }
386 }
387
388 pub fn iter(&self) -> Iter<K, V> {
389 match self {
390 &ManagedMap::Borrowed(ref pairs) =>
391 Iter::Borrowed(pairs.iter()),
392 #[cfg(any(feature = "std", feature = "alloc"))]
393 &ManagedMap::Owned(ref map) =>
394 Iter::Owned(map.iter()),
395 }
396 }
397
398 pub fn iter_mut(&mut self) -> IterMut<K, V> {
399 match self {
400 &mut ManagedMap::Borrowed(ref mut pairs) =>
401 IterMut::Borrowed(pairs.iter_mut()),
402 #[cfg(any(feature = "std", feature = "alloc"))]
403 &mut ManagedMap::Owned(ref mut map) =>
404 IterMut::Owned(map.iter_mut()),
405 }
406 }
407}
408
409pub enum Iter<'a, K: 'a, V: 'a> {
410 Borrowed(slice::Iter<'a, Option<(K, V)>>),
412 #[cfg(any(feature = "std", feature = "alloc"))]
414 Owned(BTreeIter<'a, K, V>),
415}
416
417impl<'a, K: Ord + 'a, V: 'a> Iterator for Iter<'a, K, V> {
418 type Item = (&'a K, &'a V);
419
420 fn next(&mut self) -> Option<Self::Item> {
421 match self {
422 &mut Iter::Borrowed(ref mut iter) =>
423 match iter.next() {
424 Some(&Some((ref k, ref v))) => Some((&k, &v)),
425 Some(&None) => None,
426 None => None,
427 },
428 #[cfg(any(feature = "std", feature = "alloc"))]
429 &mut Iter::Owned(ref mut iter) =>
430 iter.next(),
431 }
432 }
433
434 fn size_hint(&self) -> (usize, Option<usize>) {
435 match self {
436 &Iter::Borrowed(ref iter) => {
437 let len = iter.clone()
438 .take_while(|item| item.is_some())
439 .count();
440 (len, Some(len))
441 },
442 #[cfg(any(feature = "std", feature = "alloc"))]
443 &Iter::Owned(ref iter) =>
444 iter.size_hint(),
445 }
446 }
447}
448
449pub enum IterMut<'a, K: 'a, V: 'a> {
450 Borrowed(slice::IterMut<'a, Option<(K, V)>>),
452 #[cfg(any(feature = "std", feature = "alloc"))]
454 Owned(BTreeIterMut<'a, K, V>),
455}
456
457impl<'a, K: Ord + 'a, V: 'a> Iterator for IterMut<'a, K, V> {
458 type Item = (&'a K, &'a mut V);
459
460 fn next(&mut self) -> Option<Self::Item> {
461 match self {
462 &mut IterMut::Borrowed(ref mut iter) =>
463 match iter.next() {
464 Some(&mut Some((ref k, ref mut v))) => Some((&k, v)),
465 Some(&mut None) => None,
466 None => None,
467 },
468 #[cfg(any(feature = "std", feature = "alloc"))]
469 &mut IterMut::Owned(ref mut iter) =>
470 iter.next(),
471 }
472 }
473
474 fn size_hint(&self) -> (usize, Option<usize>) {
475 match self {
476 &IterMut::Borrowed(ref iter) => {
477 let (_, upper) = iter.size_hint();
478 (0, upper)
479 },
480 #[cfg(any(feature = "std", feature = "alloc"))]
481 &IterMut::Owned(ref iter) =>
482 iter.size_hint(),
483 }
484 }
485}
486
487#[cfg(test)]
489mod test {
490 use super::ManagedMap;
491 use core::ops::Bound::*;
492
493 fn all_pairs_empty() -> [Option<(&'static str, u32)>; 4] {
494 [None; 4]
495 }
496
497 fn one_pair_full() -> [Option<(&'static str, u32)>; 4] {
498 [Some(("a", 1)), None, None, None]
499 }
500
501 fn all_pairs_full() -> [Option<(&'static str, u32)>; 4] {
502 [Some(("a", 1)), Some(("b", 2)), Some(("c", 3)), Some(("d", 4))]
503 }
504
505 fn unwrap<'a, K, V>(map: &'a ManagedMap<'a, K, V>) -> &'a [Option<(K, V)>] {
506 match map {
507 &ManagedMap::Borrowed(ref map) => map,
508 _ => unreachable!()
509 }
510 }
511
512 #[test]
513 fn test_clear() {
514 let mut pairs = all_pairs_full();
515 let mut map = ManagedMap::Borrowed(&mut pairs);
516 map.clear();
517 assert!(map.is_empty());
518 assert_eq!(map.len(), 0);
519 assert_eq!(unwrap(&map), all_pairs_empty());
520 }
521
522 #[test]
523 fn test_get_some() {
524 let mut pairs = all_pairs_full();
525 let map = ManagedMap::Borrowed(&mut pairs);
526 assert_eq!(map.len(), 4);
527 assert_eq!(map.get("a"), Some(&1));
528 assert_eq!(map.get("b"), Some(&2));
529 assert_eq!(map.get("c"), Some(&3));
530 assert_eq!(map.get("d"), Some(&4));
531 }
532
533 #[test]
534 fn test_get_some_one_pair() {
535 let mut pairs = one_pair_full();
536 let map = ManagedMap::Borrowed(&mut pairs);
537 assert_eq!(map.len(), 1);
538 assert_eq!(map.get("a"), Some(&1));
539 }
540
541 #[test]
542 fn test_get_none_full() {
543 let mut pairs = all_pairs_full();
544 let map = ManagedMap::Borrowed(&mut pairs);
545 assert_eq!(map.len(), 4);
546 assert!(!map.is_empty());
547 assert_eq!(map.get("q"), None);
548 assert_eq!(map.get("0"), None);
549 }
550
551 #[test]
552 fn test_get_none() {
553 let mut pairs = one_pair_full();
554 let map = ManagedMap::Borrowed(&mut pairs);
555 assert_eq!(map.len(), 1);
556 assert!(!map.is_empty());
557 assert_eq!(map.get("0"), None);
558 assert_eq!(map.get("q"), None);
559 }
560
561 #[test]
562 fn test_get_none_empty() {
563 let mut pairs = all_pairs_empty();
564 let map = ManagedMap::Borrowed(&mut pairs);
565 assert_eq!(map.len(), 0);
566 assert!(map.is_empty());
567 assert_eq!(map.get("q"), None);
568 }
569
570 #[test]
571 fn test_range_full_unbounded() {
572 let mut pairs = all_pairs_full();
573 let map = ManagedMap::Borrowed(&mut pairs);
574 assert_eq!(map.len(), 4);
575
576 let mut range = map.range("a"..);
577 assert_eq!(range.next(), Some((&"a", &1)));
578 assert_eq!(range.next(), Some((&"b", &2)));
579 assert_eq!(range.next(), Some((&"c", &3)));
580 assert_eq!(range.next(), Some((&"d", &4)));
581 assert_eq!(range.next(), None);
582 assert_eq!(range.next_back(), None);
583
584 let mut range = map.range("a"..);
585 assert_eq!(range.next(), Some((&"a", &1)));
586 assert_eq!(range.next_back(), Some((&"d", &4)));
587 assert_eq!(range.next_back(), Some((&"c", &3)));
588 assert_eq!(range.next(), Some((&"b", &2)));
589 assert_eq!(range.next_back(), None);
590 assert_eq!(range.next(), None);
591
592 let mut range = map.range("b"..);
593 assert_eq!(range.next(), Some((&"b", &2)));
594 assert_eq!(range.next(), Some((&"c", &3)));
595 assert_eq!(range.next(), Some((&"d", &4)));
596 assert_eq!(range.next(), None);
597 assert_eq!(range.next_back(), None);
598
599 let mut range = map.range("d"..);
600 assert_eq!(range.next(), Some((&"d", &4)));
601 assert_eq!(range.next(), None);
602 assert_eq!(range.next_back(), None);
603
604 let mut range = map.range(.."e");
605 assert_eq!(range.next(), Some((&"a", &1)));
606 assert_eq!(range.next(), Some((&"b", &2)));
607 assert_eq!(range.next(), Some((&"c", &3)));
608 assert_eq!(range.next(), Some((&"d", &4)));
609 assert_eq!(range.next(), None);
610 assert_eq!(range.next_back(), None);
611
612 let mut range = map.range(.."d");
613 assert_eq!(range.next(), Some((&"a", &1)));
614 assert_eq!(range.next(), Some((&"b", &2)));
615 assert_eq!(range.next(), Some((&"c", &3)));
616 assert_eq!(range.next(), None);
617 assert_eq!(range.next_back(), None);
618
619 let mut range = map.range(.."b");
620 assert_eq!(range.next(), Some((&"a", &1)));
621 assert_eq!(range.next(), None);
622 assert_eq!(range.next_back(), None);
623
624 let mut range = map.range(.."a");
625 assert_eq!(range.next(), None);
626 assert_eq!(range.next_back(), None);
627
628 let mut range = map.range::<&str, _>(..);
629 assert_eq!(range.next(), Some((&"a", &1)));
630 assert_eq!(range.next(), Some((&"b", &2)));
631 assert_eq!(range.next(), Some((&"c", &3)));
632 assert_eq!(range.next(), Some((&"d", &4)));
633 assert_eq!(range.next(), None);
634 assert_eq!(range.next_back(), None);
635 }
636
637 #[test]
638 fn test_range_full_exclude_left() {
639 let mut pairs = all_pairs_full();
640 let map = ManagedMap::Borrowed(&mut pairs);
641 assert_eq!(map.len(), 4);
642
643 let mut range = map.range::<&str, _>((Excluded("a"), Excluded("a")));
644 assert_eq!(range.next(), None);
645 let mut range = map.range::<&str, _>((Excluded("a"), Excluded("b")));
646 assert_eq!(range.next(), None);
647 let mut range = map.range::<&str, _>((Excluded("a"), Excluded("c")));
648 assert_eq!(range.next(), Some((&"b", &2)));
649 assert_eq!(range.next(), None);
650 let mut range = map.range::<&str, _>((Excluded("a"), Excluded("d")));
651 assert_eq!(range.next(), Some((&"b", &2)));
652 assert_eq!(range.next(), Some((&"c", &3)));
653 assert_eq!(range.next(), None);
654 let mut range = map.range::<&str, _>((Excluded("a"), Excluded("e")));
655 assert_eq!(range.next(), Some((&"b", &2)));
656 assert_eq!(range.next(), Some((&"c", &3)));
657 assert_eq!(range.next(), Some((&"d", &4)));
658 assert_eq!(range.next(), None);
659 }
660
661 #[test]
662 fn test_range_full_include_right() {
663 let mut pairs = all_pairs_full();
664 let map = ManagedMap::Borrowed(&mut pairs);
665 assert_eq!(map.len(), 4);
666
667 let mut range = map.range::<&str, _>((Included("b"), Included("a")));
668 assert_eq!(range.next(), None);
669 let mut range = map.range::<&str, _>((Included("b"), Included("b")));
670 assert_eq!(range.next(), Some((&"b", &2)));
671 assert_eq!(range.next(), None);
672 let mut range = map.range::<&str, _>((Included("b"), Included("c")));
673 assert_eq!(range.next(), Some((&"b", &2)));
674 assert_eq!(range.next(), Some((&"c", &3)));
675 assert_eq!(range.next(), None);
676 let mut range = map.range::<&str, _>((Included("b"), Included("d")));
677 assert_eq!(range.next(), Some((&"b", &2)));
678 assert_eq!(range.next(), Some((&"c", &3)));
679 assert_eq!(range.next(), Some((&"d", &4)));
680 assert_eq!(range.next(), None);
681 let mut range = map.range::<&str, _>((Included("b"), Included("e")));
682 assert_eq!(range.next(), Some((&"b", &2)));
683 assert_eq!(range.next(), Some((&"c", &3)));
684 assert_eq!(range.next(), Some((&"d", &4)));
685 assert_eq!(range.next(), None);
686
687 let mut range = map.range::<&str, _>((Included("b"), Included("a")));
688 assert_eq!(range.next_back(), None);
689 let mut range = map.range::<&str, _>((Included("b"), Included("b")));
690 assert_eq!(range.next_back(), Some((&"b", &2)));
691 assert_eq!(range.next_back(), None);
692 let mut range = map.range::<&str, _>((Included("b"), Included("c")));
693 assert_eq!(range.next_back(), Some((&"c", &3)));
694 assert_eq!(range.next_back(), Some((&"b", &2)));
695 assert_eq!(range.next_back(), None);
696 let mut range = map.range::<&str, _>((Included("b"), Included("d")));
697 assert_eq!(range.next_back(), Some((&"d", &4)));
698 assert_eq!(range.next_back(), Some((&"c", &3)));
699 assert_eq!(range.next_back(), Some((&"b", &2)));
700 assert_eq!(range.next_back(), None);
701 let mut range = map.range::<&str, _>((Included("b"), Included("e")));
702 assert_eq!(range.next_back(), Some((&"d", &4)));
703 assert_eq!(range.next_back(), Some((&"c", &3)));
704 assert_eq!(range.next_back(), Some((&"b", &2)));
705 assert_eq!(range.next_back(), None);
706 }
707
708 #[test]
709 fn test_range_full() {
710 let mut pairs = all_pairs_full();
711 let map = ManagedMap::Borrowed(&mut pairs);
712 assert_eq!(map.len(), 4);
713
714 let mut range = map.range("0".."a");
715 assert_eq!(range.next(), None);
716 let mut range = map.range("0".."b");
717 assert_eq!(range.next(), Some((&"a", &1)));
718 assert_eq!(range.next(), None);
719 let mut range = map.range("0".."c");
720 assert_eq!(range.next(), Some((&"a", &1)));
721 assert_eq!(range.next(), Some((&"b", &2)));
722 assert_eq!(range.next(), None);
723 let mut range = map.range("0".."d");
724 assert_eq!(range.next(), Some((&"a", &1)));
725 assert_eq!(range.next(), Some((&"b", &2)));
726 assert_eq!(range.next(), Some((&"c", &3)));
727 assert_eq!(range.next(), None);
728 let mut range = map.range("0".."e");
729 assert_eq!(range.next(), Some((&"a", &1)));
730 assert_eq!(range.next(), Some((&"b", &2)));
731 assert_eq!(range.next(), Some((&"c", &3)));
732 assert_eq!(range.next(), Some((&"d", &4)));
733 assert_eq!(range.next(), None);
734
735 let mut range = map.range("a".."a");
736 assert_eq!(range.next(), None);
737 let mut range = map.range("a".."b");
738 assert_eq!(range.next(), Some((&"a", &1)));
739 assert_eq!(range.next(), None);
740 let mut range = map.range("a".."c");
741 assert_eq!(range.next(), Some((&"a", &1)));
742 assert_eq!(range.next(), Some((&"b", &2)));
743 assert_eq!(range.next(), None);
744 let mut range = map.range("a".."d");
745 assert_eq!(range.next(), Some((&"a", &1)));
746 assert_eq!(range.next(), Some((&"b", &2)));
747 assert_eq!(range.next(), Some((&"c", &3)));
748 assert_eq!(range.next(), None);
749 let mut range = map.range("a".."e");
750 assert_eq!(range.next(), Some((&"a", &1)));
751 assert_eq!(range.next(), Some((&"b", &2)));
752 assert_eq!(range.next(), Some((&"c", &3)));
753 assert_eq!(range.next(), Some((&"d", &4)));
754 assert_eq!(range.next(), None);
755
756 let mut range = map.range("b".."a");
757 assert_eq!(range.next(), None);
758 let mut range = map.range("b".."b");
759 assert_eq!(range.next(), None);
760 let mut range = map.range("b".."c");
761 assert_eq!(range.next(), Some((&"b", &2)));
762 assert_eq!(range.next(), None);
763 let mut range = map.range("b".."d");
764 assert_eq!(range.next(), Some((&"b", &2)));
765 assert_eq!(range.next(), Some((&"c", &3)));
766 assert_eq!(range.next(), None);
767 let mut range = map.range("b".."e");
768 assert_eq!(range.next(), Some((&"b", &2)));
769 assert_eq!(range.next(), Some((&"c", &3)));
770 assert_eq!(range.next(), Some((&"d", &4)));
771 assert_eq!(range.next(), None);
772
773 let mut range = map.range("c".."a");
774 assert_eq!(range.next(), None);
775 let mut range = map.range("c".."b");
776 assert_eq!(range.next(), None);
777 let mut range = map.range("c".."c");
778 assert_eq!(range.next(), None);
779 let mut range = map.range("c".."d");
780 assert_eq!(range.next(), Some((&"c", &3)));
781 assert_eq!(range.next(), None);
782 let mut range = map.range("c".."e");
783 assert_eq!(range.next(), Some((&"c", &3)));
784 assert_eq!(range.next(), Some((&"d", &4)));
785 assert_eq!(range.next(), None);
786
787 let mut range = map.range("d".."a");
788 assert_eq!(range.next(), None);
789 let mut range = map.range("d".."b");
790 assert_eq!(range.next(), None);
791 let mut range = map.range("d".."c");
792 assert_eq!(range.next(), None);
793 let mut range = map.range("d".."d");
794 assert_eq!(range.next(), None);
795 let mut range = map.range("d".."e");
796 assert_eq!(range.next(), Some((&"d", &4)));
797 assert_eq!(range.next(), None);
798
799 let mut range = map.range("e".."a");
800 assert_eq!(range.next(), None);
801 let mut range = map.range("e".."b");
802 assert_eq!(range.next(), None);
803 let mut range = map.range("e".."c");
804 assert_eq!(range.next(), None);
805 let mut range = map.range("e".."d");
806 assert_eq!(range.next(), None);
807 let mut range = map.range("e".."e");
808 assert_eq!(range.next(), None);
809 }
810
811 #[test]
812 fn test_range_one_pair() {
813 let mut pairs = one_pair_full();
814 let map = ManagedMap::Borrowed(&mut pairs);
815 assert_eq!(map.len(), 1);
816
817 let mut range = map.range("0".."a");
818 assert_eq!(range.next(), None);
819 let mut range = map.range("0".."b");
820 assert_eq!(range.next(), Some((&"a", &1)));
821 assert_eq!(range.next(), None);
822 let mut range = map.range("0".."c");
823 assert_eq!(range.next(), Some((&"a", &1)));
824 assert_eq!(range.next(), None);
825
826 let mut range = map.range("a".."a");
827 assert_eq!(range.next(), None);
828 let mut range = map.range("a".."b");
829 assert_eq!(range.next(), Some((&"a", &1)));
830 assert_eq!(range.next(), None);
831 let mut range = map.range("a".."c");
832 assert_eq!(range.next(), Some((&"a", &1)));
833 assert_eq!(range.next(), None);
834
835 let mut range = map.range("b".."a");
836 assert_eq!(range.next(), None);
837 let mut range = map.range("b".."b");
838 assert_eq!(range.next(), None);
839 let mut range = map.range("b".."c");
840 assert_eq!(range.next(), None);
841 }
842
843 #[test]
844 fn test_range_empty() {
845 let mut pairs = all_pairs_empty();
846 let map = ManagedMap::Borrowed(&mut pairs);
847 assert_eq!(map.len(), 0);
848
849 let mut range = map.range("b".."a");
850 assert_eq!(range.next(), None);
851 let mut range = map.range("b".."b");
852 assert_eq!(range.next(), None);
853 let mut range = map.range("b".."c");
854 assert_eq!(range.next(), None);
855 }
856
857 #[test]
858 fn test_get_mut_some() {
859 let mut pairs = all_pairs_full();
860 let mut map = ManagedMap::Borrowed(&mut pairs);
861 assert_eq!(map.len(), 4);
862 assert!(!map.is_empty());
863 assert_eq!(map.get_mut("a"), Some(&mut 1));
864 assert_eq!(map.get_mut("b"), Some(&mut 2));
865 assert_eq!(map.get_mut("c"), Some(&mut 3));
866 assert_eq!(map.get_mut("d"), Some(&mut 4));
867 }
868
869 #[test]
870 fn test_get_mut_none() {
871 let mut pairs = one_pair_full();
872 let mut map = ManagedMap::Borrowed(&mut pairs);
873 assert_eq!(map.get_mut("q"), None);
874 }
875
876 #[test]
877 fn test_insert_empty() {
878 let mut pairs = all_pairs_empty();
879 let mut map = ManagedMap::Borrowed(&mut pairs);
880 assert_eq!(map.len(), 0);
881 assert!(map.is_empty());
882
883 assert_eq!(map.insert("a", 1), Ok(None));
884 assert_eq!(map.len(), 1);
885 assert!(!map.is_empty());
886 assert_eq!(unwrap(&map), [Some(("a", 1)), None, None, None]);
887 }
888
889 #[test]
890 fn test_insert_replace() {
891 let mut pairs = all_pairs_empty();
892 let mut map = ManagedMap::Borrowed(&mut pairs);
893 assert_eq!(map.insert("a", 1), Ok(None));
894 assert_eq!(map.insert("a", 2), Ok(Some(1)));
895 assert_eq!(map.len(), 1);
896 assert!(!map.is_empty());
897 assert_eq!(unwrap(&map), [Some(("a", 2)), None, None, None]);
898 }
899
900 #[test]
901 fn test_insert_full() {
902 let mut pairs = all_pairs_full();
903 let mut map = ManagedMap::Borrowed(&mut pairs);
904 assert_eq!(map.insert("q", 1), Err(("q", 1)));
905 assert_eq!(map.len(), 4);
906 assert_eq!(unwrap(&map), all_pairs_full());
907 }
908
909 #[test]
910 fn test_insert_one() {
911 let mut pairs = one_pair_full();
912 let mut map = ManagedMap::Borrowed(&mut pairs);
913 assert_eq!(map.insert("b", 2), Ok(None));
914 assert_eq!(unwrap(&map), [Some(("a", 1)), Some(("b", 2)), None, None]);
915 }
916
917 #[test]
918 fn test_insert_shift() {
919 let mut pairs = one_pair_full();
920 let mut map = ManagedMap::Borrowed(&mut pairs);
921 assert_eq!(map.insert("c", 3), Ok(None));
922 assert_eq!(map.insert("b", 2), Ok(None));
923 assert_eq!(unwrap(&map), [Some(("a", 1)), Some(("b", 2)), Some(("c", 3)), None]);
924 }
925
926 #[test]
927 fn test_insert_no_space() {
928 let mut map = ManagedMap::Borrowed(&mut []);
930 assert_eq!(map.insert("a", 1), Err(("a", 1)));
931 }
932
933 #[test]
934 fn test_remove_nonexistent() {
935 let mut pairs = one_pair_full();
936 let mut map = ManagedMap::Borrowed(&mut pairs);
937 assert_eq!(map.remove("b"), None);
938 assert_eq!(map.len(), 1);
939 }
940
941 #[test]
942 fn test_remove_one() {
943 let mut pairs = all_pairs_full();
944 let mut map = ManagedMap::Borrowed(&mut pairs);
945 assert_eq!(map.remove("a"), Some(1));
946 assert_eq!(map.len(), 3);
947 assert_eq!(unwrap(&map), [Some(("b", 2)), Some(("c", 3)), Some(("d", 4)), None]);
948 }
949
950 #[test]
951 fn test_iter_none() {
952 let mut pairs = all_pairs_empty();
953 let map = ManagedMap::Borrowed(&mut pairs);
954 let mut iter = map.iter();
955 assert_eq!(iter.size_hint(), (0, Some(0)));
956 assert_eq!(iter.next(), None);
957 }
958
959 #[test]
960 fn test_iter_one() {
961 let mut pairs = one_pair_full();
962 let map = ManagedMap::Borrowed(&mut pairs);
963 let mut iter = map.iter();
964 assert_eq!(iter.size_hint(), (1, Some(1)));
965 assert_eq!(iter.next(), Some((&"a", &1)));
966 assert_eq!(iter.size_hint(), (0, Some(0)));
967 assert_eq!(iter.next(), None);
968 }
969
970 #[test]
971 fn test_iter_full() {
972 let mut pairs = all_pairs_full();
973 let map = ManagedMap::Borrowed(&mut pairs);
974 let mut iter = map.iter();
975 assert_eq!(iter.size_hint(), (4, Some(4)));
976 assert_eq!(iter.next(), Some((&"a", &1)));
977 assert_eq!(iter.next(), Some((&"b", &2)));
978 assert_eq!(iter.next(), Some((&"c", &3)));
979 assert_eq!(iter.next(), Some((&"d", &4)));
980 assert_eq!(iter.next(), None);
981 }
982
983 #[test]
984 fn test_iter_mut_full() {
985 let mut pairs = all_pairs_full();
986 let mut map = ManagedMap::Borrowed(&mut pairs);
987
988 {
989 let mut iter = map.iter_mut();
990 assert_eq!(iter.size_hint(), (0, Some(4)));
991 for (_k, mut v) in &mut iter {
992 *v += 1;
993 }
994 assert_eq!(iter.size_hint(), (0, Some(0)));
995 }
998 {
999 let mut iter = map.iter();
1000 assert_eq!(iter.next(), Some((&"a", &2)));
1001 assert_eq!(iter.next(), Some((&"b", &3)));
1002 assert_eq!(iter.next(), Some((&"c", &4)));
1003 assert_eq!(iter.next(), Some((&"d", &5)));
1004 assert_eq!(iter.next(), None);
1005 }
1006 }
1007}