1use core::fmt;
4use std::borrow::Borrow;
5use std::collections::BTreeMap;
6use std::num::NonZeroUsize;
7
8#[cfg(feature = "serde")]
9use serde::Deserialize;
10#[cfg(feature = "serde")]
11use serde::Serialize;
12
13use crate::FromNonEmptyIterator;
14use crate::IntoIteratorExt;
15use crate::IntoNonEmptyIterator;
16use crate::NonEmptyIterator;
17use crate::Singleton;
18
19#[macro_export]
28macro_rules! nebtm {
29 ($hk:expr => $hv:expr, $( $xk:expr => $xv:expr ),* $(,)?) => {{
30 let mut map = $crate::NEBTreeMap::new($hk, $hv);
31 $( map.insert($xk, $xv); )*
32 map
33 }};
34 ($hk:expr => $hv:expr) => {
35 $crate::NEBTreeMap::new($hk, $hv)
36 }
37}
38
39#[allow(clippy::unsafe_derive_deserialize)]
48#[cfg_attr(
49 feature = "serde",
50 derive(Deserialize, Serialize),
51 serde(bound(
52 serialize = "K: Ord + Clone + Serialize, V: Clone + Serialize",
53 deserialize = "K: Ord + Clone + Deserialize<'de>, V: Deserialize<'de>"
54 )),
55 serde(into = "BTreeMap<K, V>", try_from = "BTreeMap<K, V>")
56)]
57#[derive(Clone)]
58pub struct NEBTreeMap<K, V> {
59 inner: BTreeMap<K, V>,
60}
61
62impl<K, V> NEBTreeMap<K, V>
63where
64 K: Ord,
65{
66 #[must_use]
68 pub fn new(k: K, v: V) -> NEBTreeMap<K, V> {
69 let mut inner = BTreeMap::new();
70 inner.insert(k, v);
71 NEBTreeMap { inner }
72 }
73}
74
75impl<K, V> NEBTreeMap<K, V> {
76 #[must_use]
91 pub fn try_from_map(map: BTreeMap<K, V>) -> Option<Self> {
92 if map.is_empty() {
93 None
94 } else {
95 Some(Self { inner: map })
96 }
97 }
98
99 pub fn iter(&self) -> std::collections::btree_map::Iter<'_, K, V> {
103 self.inner.iter()
104 }
105
106 pub fn iter_mut(&mut self) -> std::collections::btree_map::IterMut<'_, K, V> {
111 self.inner.iter_mut()
112 }
113
114 pub fn nonempty_iter(&self) -> Iter<'_, K, V> {
117 Iter {
118 iter: self.inner.iter(),
119 }
120 }
121
122 pub fn nonempty_iter_mut(&mut self) -> IterMut<'_, K, V> {
130 IterMut {
131 iter: self.inner.iter_mut(),
132 }
133 }
134
135 pub fn keys(&self) -> Keys<'_, K, V> {
147 Keys {
148 inner: self.inner.keys(),
149 }
150 }
151
152 #[must_use]
161 pub fn len(&self) -> NonZeroUsize {
162 unsafe { NonZeroUsize::new_unchecked(self.inner.len()) }
163 }
164
165 pub fn values(&self) -> Values<'_, K, V> {
177 Values {
178 inner: self.inner.values(),
179 }
180 }
181
182 }
201
202impl<K, V> NEBTreeMap<K, V>
203where
204 K: Ord,
205{
206 #[must_use]
216 pub fn contains_key<Q>(&self, k: &Q) -> bool
217 where
218 K: Borrow<Q>,
219 Q: Ord + ?Sized,
220 {
221 self.inner.contains_key(k)
222 }
223
224 #[must_use]
237 pub fn get<Q>(&self, k: &Q) -> Option<&V>
238 where
239 K: Borrow<Q>,
240 Q: Ord + ?Sized,
241 {
242 self.inner.get(k)
243 }
244
245 #[must_use]
258 pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
259 where
260 K: Borrow<Q>,
261 Q: Ord + ?Sized,
262 {
263 self.inner.get_key_value(k)
264 }
265
266 #[must_use]
285 pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
286 where
287 K: Borrow<Q>,
288 Q: Ord + ?Sized,
289 {
290 self.inner.get_mut(k)
291 }
292
293 pub fn insert(&mut self, k: K, v: V) -> Option<V> {
312 self.inner.insert(k, v)
313 }
314}
315
316impl<K, V> AsRef<BTreeMap<K, V>> for NEBTreeMap<K, V> {
317 fn as_ref(&self) -> &BTreeMap<K, V> {
318 &self.inner
319 }
320}
321
322impl<K, V> AsMut<BTreeMap<K, V>> for NEBTreeMap<K, V> {
323 fn as_mut(&mut self) -> &mut BTreeMap<K, V> {
324 &mut self.inner
325 }
326}
327
328impl<K, V> PartialEq for NEBTreeMap<K, V>
329where
330 K: Ord,
331 V: PartialEq,
332{
333 fn eq(&self, other: &Self) -> bool {
344 self.inner.eq(&other.inner)
345 }
346}
347
348impl<K, V> Eq for NEBTreeMap<K, V>
349where
350 K: Ord,
351 V: Eq,
352{
353}
354
355impl<K, V> From<NEBTreeMap<K, V>> for BTreeMap<K, V>
356where
357 K: Ord,
358{
359 fn from(m: NEBTreeMap<K, V>) -> Self {
367 m.inner
368 }
369}
370
371impl<K, V> TryFrom<BTreeMap<K, V>> for NEBTreeMap<K, V>
372where
373 K: Ord,
374{
375 type Error = crate::Error;
376
377 fn try_from(map: BTreeMap<K, V>) -> Result<Self, Self::Error> {
378 map.try_into_nonempty_iter()
379 .map(NonEmptyIterator::collect)
380 .ok_or(crate::Error::Empty)
381 }
382}
383
384impl<K, V> IntoNonEmptyIterator for NEBTreeMap<K, V> {
385 type IntoNEIter = IntoIter<K, V>;
386
387 fn into_nonempty_iter(self) -> Self::IntoNEIter {
388 IntoIter {
389 iter: self.inner.into_iter(),
390 }
391 }
392}
393
394impl<'a, K, V> IntoNonEmptyIterator for &'a NEBTreeMap<K, V> {
395 type IntoNEIter = Iter<'a, K, V>;
396
397 fn into_nonempty_iter(self) -> Self::IntoNEIter {
398 self.nonempty_iter()
399 }
400}
401
402impl<K, V> IntoIterator for NEBTreeMap<K, V> {
403 type Item = (K, V);
404
405 type IntoIter = std::collections::btree_map::IntoIter<K, V>;
406
407 fn into_iter(self) -> Self::IntoIter {
408 self.inner.into_iter()
409 }
410}
411
412impl<'a, K, V> IntoIterator for &'a NEBTreeMap<K, V> {
413 type Item = (&'a K, &'a V);
414
415 type IntoIter = std::collections::btree_map::Iter<'a, K, V>;
416
417 fn into_iter(self) -> Self::IntoIter {
418 self.iter()
419 }
420}
421
422impl<'a, K, V> IntoIterator for &'a mut NEBTreeMap<K, V> {
423 type Item = (&'a K, &'a mut V);
424
425 type IntoIter = std::collections::btree_map::IterMut<'a, K, V>;
426
427 fn into_iter(self) -> Self::IntoIter {
428 self.iter_mut()
429 }
430}
431
432impl<K, V> FromNonEmptyIterator<(K, V)> for NEBTreeMap<K, V>
441where
442 K: Ord,
443{
444 fn from_nonempty_iter<I>(iter: I) -> Self
445 where
446 I: IntoNonEmptyIterator<Item = (K, V)>,
447 {
448 NEBTreeMap {
449 inner: iter.into_nonempty_iter().into_iter().collect(),
450 }
451 }
452}
453
454#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
456pub struct Iter<'a, K: 'a, V: 'a> {
457 iter: std::collections::btree_map::Iter<'a, K, V>,
458}
459
460impl<K, V> NonEmptyIterator for Iter<'_, K, V> {}
461
462impl<'a, K, V> IntoIterator for Iter<'a, K, V> {
463 type Item = (&'a K, &'a V);
464
465 type IntoIter = std::collections::btree_map::Iter<'a, K, V>;
466
467 fn into_iter(self) -> Self::IntoIter {
468 self.iter
469 }
470}
471
472impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> {
473 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
474 self.iter.fmt(f)
475 }
476}
477
478#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
480pub struct IterMut<'a, K: 'a, V: 'a> {
481 iter: std::collections::btree_map::IterMut<'a, K, V>,
482}
483
484impl<K, V> NonEmptyIterator for IterMut<'_, K, V> {}
485
486impl<'a, K, V> IntoIterator for IterMut<'a, K, V> {
487 type Item = (&'a K, &'a mut V);
488
489 type IntoIter = std::collections::btree_map::IterMut<'a, K, V>;
490
491 fn into_iter(self) -> Self::IntoIter {
492 self.iter
493 }
494}
495
496impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut<'_, K, V> {
497 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
498 self.iter.fmt(f)
499 }
500}
501
502pub struct IntoIter<K, V> {
504 iter: std::collections::btree_map::IntoIter<K, V>,
505}
506
507impl<K, V> NonEmptyIterator for IntoIter<K, V> {}
508
509impl<K, V> IntoIterator for IntoIter<K, V> {
510 type Item = (K, V);
511
512 type IntoIter = std::collections::btree_map::IntoIter<K, V>;
513
514 fn into_iter(self) -> Self::IntoIter {
515 self.iter
516 }
517}
518
519impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IntoIter<K, V> {
520 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
521 self.iter.fmt(f)
522 }
523}
524
525#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
527pub struct Keys<'a, K: 'a, V: 'a> {
528 inner: std::collections::btree_map::Keys<'a, K, V>,
529}
530
531impl<K, V> NonEmptyIterator for Keys<'_, K, V> {}
532
533impl<'a, K, V> IntoIterator for Keys<'a, K, V> {
534 type Item = &'a K;
535
536 type IntoIter = std::collections::btree_map::Keys<'a, K, V>;
537
538 fn into_iter(self) -> Self::IntoIter {
539 self.inner
540 }
541}
542
543impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Keys<'_, K, V> {
544 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
545 self.inner.fmt(f)
546 }
547}
548
549#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
551pub struct Values<'a, K: 'a, V: 'a> {
552 inner: std::collections::btree_map::Values<'a, K, V>,
553}
554
555impl<K, V> NonEmptyIterator for Values<'_, K, V> {}
556
557impl<'a, K, V> IntoIterator for Values<'a, K, V> {
558 type Item = &'a V;
559
560 type IntoIter = std::collections::btree_map::Values<'a, K, V>;
561
562 fn into_iter(self) -> Self::IntoIter {
563 self.inner
564 }
565}
566
567impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Values<'_, K, V> {
568 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
569 self.inner.fmt(f)
570 }
571}
572
573impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for NEBTreeMap<K, V> {
574 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
575 self.inner.fmt(f)
576 }
577}
578
579impl<K, V> Singleton for NEBTreeMap<K, V>
600where
601 K: Ord,
602{
603 type Item = (K, V);
604
605 fn singleton((k, v): Self::Item) -> Self {
612 NEBTreeMap::new(k, v)
613 }
614}
615
616impl<K, V> Extend<(K, V)> for NEBTreeMap<K, V>
617where
618 K: Ord,
619{
620 fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iter: I) {
621 self.inner.extend(iter);
622 }
623}
624
625#[cfg(test)]
626mod test {
627 use maplit::hashmap;
628 use std::num::NonZeroUsize;
629
630 struct Foo {
631 user: String,
632 }
633
634 #[test]
635 fn debug_impl() {
636 let expected = format!("{:?}", hashmap! {0 => 10});
637 let actual = format!("{:?}", nebtm! {0 => 10});
638 assert_eq!(expected, actual);
639 }
640
641 #[test]
642 fn macro_usage() {
643 let a = Foo {
644 user: "a".to_string(),
645 };
646 let b = Foo {
647 user: "b".to_string(),
648 };
649
650 let map = nebtm![1 => a, 2 => b];
651 assert_eq!("a", map.get(&1).unwrap().user);
652 assert_eq!("b", map.get(&2).unwrap().user);
653 }
654
655 #[test]
656 fn macro_length() {
657 let map = nebtm![1 => 'a', 2 => 'b', 1 => 'c'];
658 assert_eq!(unsafe { NonZeroUsize::new_unchecked(2) }, map.len());
659 assert_eq!('c', *map.get(&1).unwrap());
660 assert_eq!('b', *map.get(&2).unwrap());
661 }
662
663 #[test]
664 fn iter_mut() {
665 let mut v = nebtm! {"a" => 0, "b" => 1, "c" => 2};
666
667 v.iter_mut().for_each(|(_k, v)| {
668 *v += 1;
669 });
670 assert_eq!(nebtm! {"a" => 1, "b" => 2, "c" => 3}, v);
671
672 for (_k, v) in &mut v {
673 *v -= 1;
674 }
675 assert_eq!(nebtm! {"a" => 0, "b" => 1, "c" => 2}, v);
676 }
677}
678
679#[cfg(feature = "serde")]
680#[cfg(test)]
681mod serde_tests {
682 use crate::NEBTreeMap;
683 use std::collections::BTreeMap;
684
685 #[test]
686 fn json() {
687 let map0 = nebtm![1 => 'a', 2 => 'b', 1 => 'c'];
688 let j = serde_json::to_string(&map0).unwrap();
689 let map1 = serde_json::from_str(&j).unwrap();
690 assert_eq!(map0, map1);
691
692 let empty: BTreeMap<usize, char> = BTreeMap::new();
693 let j = serde_json::to_string(&empty).unwrap();
694 let bad = serde_json::from_str::<NEBTreeMap<usize, char>>(&j);
695 assert!(bad.is_err());
696 }
697}