1use core::fmt;
4use std::borrow::Borrow;
5use std::collections::HashMap;
6use std::hash::BuildHasher;
7use std::hash::Hash;
8use std::num::NonZeroUsize;
9
10#[cfg(feature = "serde")]
11use serde::Deserialize;
12#[cfg(feature = "serde")]
13use serde::Serialize;
14
15use crate::FromNonEmptyIterator;
16use crate::IntoIteratorExt;
17use crate::IntoNonEmptyIterator;
18use crate::NonEmptyIterator;
19
20#[macro_export]
30macro_rules! nem {
31 ($hk:expr => $hv:expr, $( $xk:expr => $xv:expr ),* $(,)?) => {{
32 let mut map = $crate::NEMap::new($hk, $hv);
33 $( map.insert($xk, $xv); )*
34 map
35 }};
36 ($hk:expr => $hv:expr) => {
37 $crate::NEMap::new($hk, $hv)
38 }
39}
40
41#[allow(clippy::unsafe_derive_deserialize)]
50#[cfg_attr(
51 feature = "serde",
52 derive(Deserialize, Serialize),
53 serde(bound(
54 serialize = "K: Eq + Hash + Clone + Serialize, V: Clone + Serialize, S: Clone + BuildHasher",
55 deserialize = "K: Eq + Hash + Clone + Deserialize<'de>, V: Deserialize<'de>, S: Default + BuildHasher"
56 )),
57 serde(into = "HashMap<K, V, S>", try_from = "HashMap<K, V, S>")
58)]
59#[derive(Clone)]
60pub struct NEMap<K, V, S = std::collections::hash_map::RandomState> {
61 inner: HashMap<K, V, S>,
62}
63
64impl<K, V> NEMap<K, V>
65where
66 K: Eq + Hash,
67{
68 #[must_use]
70 pub fn new(k: K, v: V) -> NEMap<K, V> {
71 let mut inner = HashMap::new();
72 inner.insert(k, v);
73 NEMap { inner }
74 }
75
76 #[must_use]
86 pub fn with_capacity(capacity: NonZeroUsize, k: K, v: V) -> NEMap<K, V> {
87 let mut inner = HashMap::with_capacity(capacity.get());
88 inner.insert(k, v);
89 NEMap { inner }
90 }
91}
92
93impl<K, V, S> NEMap<K, V, S> {
94 #[must_use]
109 pub fn try_from_map(map: HashMap<K, V, S>) -> Option<Self> {
110 if map.is_empty() {
111 None
112 } else {
113 Some(Self { inner: map })
114 }
115 }
116
117 #[must_use]
119 pub fn capacity(&self) -> NonZeroUsize {
120 unsafe { NonZeroUsize::new_unchecked(self.inner.capacity()) }
121 }
122
123 #[must_use]
125 pub fn hasher(&self) -> &S {
126 self.inner.hasher()
127 }
128
129 pub fn iter(&self) -> std::collections::hash_map::Iter<'_, K, V> {
133 self.inner.iter()
134 }
135
136 pub fn iter_mut(&mut self) -> std::collections::hash_map::IterMut<'_, K, V> {
141 self.inner.iter_mut()
142 }
143
144 pub fn nonempty_iter(&self) -> Iter<'_, K, V> {
147 Iter {
148 iter: self.inner.iter(),
149 }
150 }
151
152 pub fn nonempty_iter_mut(&mut self) -> IterMut<'_, K, V> {
160 IterMut {
161 iter: self.inner.iter_mut(),
162 }
163 }
164
165 pub fn keys(&self) -> Keys<'_, K, V> {
177 Keys {
178 inner: self.inner.keys(),
179 }
180 }
181
182 #[must_use]
191 pub fn len(&self) -> NonZeroUsize {
192 unsafe { NonZeroUsize::new_unchecked(self.inner.len()) }
193 }
194
195 #[deprecated(since = "0.1.0", note = "A NEMap is never empty.")]
197 #[must_use]
198 pub const fn is_empty(&self) -> bool {
199 false
200 }
201
202 pub fn values(&self) -> Values<'_, K, V> {
214 Values {
215 inner: self.inner.values(),
216 }
217 }
218
219 }
238
239impl<K, V, S> NEMap<K, V, S>
240where
241 K: Eq + Hash,
242 S: BuildHasher,
243{
244 #[must_use]
254 pub fn contains_key<Q>(&self, k: &Q) -> bool
255 where
256 K: Borrow<Q>,
257 Q: Eq + Hash + ?Sized,
258 {
259 self.inner.contains_key(k)
260 }
261
262 #[must_use]
275 pub fn get<Q>(&self, k: &Q) -> Option<&V>
276 where
277 K: Borrow<Q>,
278 Q: Eq + Hash + ?Sized,
279 {
280 self.inner.get(k)
281 }
282
283 #[must_use]
296 pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
297 where
298 K: Borrow<Q>,
299 Q: Eq + Hash + ?Sized,
300 {
301 self.inner.get_key_value(k)
302 }
303
304 #[must_use]
323 pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
324 where
325 K: Borrow<Q>,
326 Q: Eq + Hash + ?Sized,
327 {
328 self.inner.get_mut(k)
329 }
330
331 pub fn insert(&mut self, k: K, v: V) -> Option<V> {
350 self.inner.insert(k, v)
351 }
352
353 pub fn shrink_to_fit(&mut self) {
357 self.inner.shrink_to_fit();
358 }
359
360 #[must_use]
362 pub fn with_capacity_and_hasher(
363 capacity: NonZeroUsize,
364 hasher: S,
365 k: K,
366 v: V,
367 ) -> NEMap<K, V, S> {
368 let mut inner = HashMap::with_capacity_and_hasher(capacity.get(), hasher);
369 inner.insert(k, v);
370 NEMap { inner }
371 }
372
373 #[must_use]
375 pub fn with_hasher(hasher: S, k: K, v: V) -> NEMap<K, V, S> {
376 let mut inner = HashMap::with_hasher(hasher);
377 inner.insert(k, v);
378 NEMap { inner }
379 }
380}
381
382impl<K, V, S> AsRef<HashMap<K, V, S>> for NEMap<K, V, S> {
383 fn as_ref(&self) -> &HashMap<K, V, S> {
384 &self.inner
385 }
386}
387
388impl<K, V, S> AsMut<HashMap<K, V, S>> for NEMap<K, V, S> {
389 fn as_mut(&mut self) -> &mut HashMap<K, V, S> {
390 &mut self.inner
391 }
392}
393
394impl<K, V, S> PartialEq for NEMap<K, V, S>
395where
396 K: Eq + Hash,
397 V: PartialEq,
398 S: BuildHasher,
399{
400 fn eq(&self, other: &Self) -> bool {
411 self.inner.eq(&other.inner)
412 }
413}
414
415impl<K, V, S> Eq for NEMap<K, V, S>
416where
417 K: Eq + Hash,
418 V: Eq,
419 S: BuildHasher,
420{
421}
422
423impl<K, V, S> From<NEMap<K, V, S>> for HashMap<K, V, S>
424where
425 K: Eq + Hash,
426 S: BuildHasher,
427{
428 fn from(m: NEMap<K, V, S>) -> Self {
436 m.inner
437 }
438}
439
440impl<K, V, S> TryFrom<HashMap<K, V, S>> for NEMap<K, V, S>
441where
442 K: Eq + Hash,
443 S: BuildHasher + Default,
444{
445 type Error = crate::Error;
446
447 fn try_from(map: HashMap<K, V, S>) -> Result<Self, Self::Error> {
448 map.try_into_nonempty_iter()
449 .map(NonEmptyIterator::collect)
450 .ok_or(crate::Error::Empty)
451 }
452}
453
454impl<K, V, S> IntoNonEmptyIterator for NEMap<K, V, S> {
455 type IntoNEIter = IntoIter<K, V>;
456
457 fn into_nonempty_iter(self) -> Self::IntoNEIter {
458 IntoIter {
459 iter: self.inner.into_iter(),
460 }
461 }
462}
463
464impl<'a, K, V, S> IntoNonEmptyIterator for &'a NEMap<K, V, S> {
465 type IntoNEIter = Iter<'a, K, V>;
466
467 fn into_nonempty_iter(self) -> Self::IntoNEIter {
468 self.nonempty_iter()
469 }
470}
471
472impl<K, V, S> IntoIterator for NEMap<K, V, S> {
473 type Item = (K, V);
474
475 type IntoIter = std::collections::hash_map::IntoIter<K, V>;
476
477 fn into_iter(self) -> Self::IntoIter {
478 self.inner.into_iter()
479 }
480}
481
482impl<'a, K, V, S> IntoIterator for &'a NEMap<K, V, S> {
483 type Item = (&'a K, &'a V);
484
485 type IntoIter = std::collections::hash_map::Iter<'a, K, V>;
486
487 fn into_iter(self) -> Self::IntoIter {
488 self.iter()
489 }
490}
491
492impl<'a, K, V, S> IntoIterator for &'a mut NEMap<K, V, S> {
493 type Item = (&'a K, &'a mut V);
494
495 type IntoIter = std::collections::hash_map::IterMut<'a, K, V>;
496
497 fn into_iter(self) -> Self::IntoIter {
498 self.iter_mut()
499 }
500}
501
502impl<K, V, S> FromNonEmptyIterator<(K, V)> for NEMap<K, V, S>
511where
512 K: Eq + Hash,
513 S: BuildHasher + Default,
514{
515 fn from_nonempty_iter<I>(iter: I) -> Self
516 where
517 I: IntoNonEmptyIterator<Item = (K, V)>,
518 {
519 NEMap {
520 inner: iter.into_nonempty_iter().into_iter().collect(),
521 }
522 }
523}
524
525#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
527pub struct Iter<'a, K: 'a, V: 'a> {
528 iter: std::collections::hash_map::Iter<'a, K, V>,
529}
530
531impl<K, V> NonEmptyIterator for Iter<'_, K, V> {}
532
533impl<'a, K, V> IntoIterator for Iter<'a, K, V> {
534 type Item = (&'a K, &'a V);
535
536 type IntoIter = std::collections::hash_map::Iter<'a, K, V>;
537
538 fn into_iter(self) -> Self::IntoIter {
539 self.iter
540 }
541}
542
543impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> {
544 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
545 self.iter.fmt(f)
546 }
547}
548
549#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
551pub struct IterMut<'a, K: 'a, V: 'a> {
552 iter: std::collections::hash_map::IterMut<'a, K, V>,
553}
554
555impl<K, V> NonEmptyIterator for IterMut<'_, K, V> {}
556
557impl<'a, K, V> IntoIterator for IterMut<'a, K, V> {
558 type Item = (&'a K, &'a mut V);
559
560 type IntoIter = std::collections::hash_map::IterMut<'a, K, V>;
561
562 fn into_iter(self) -> Self::IntoIter {
563 self.iter
564 }
565}
566
567impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut<'_, K, V> {
568 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
569 self.iter.fmt(f)
570 }
571}
572
573pub struct IntoIter<K, V> {
575 iter: std::collections::hash_map::IntoIter<K, V>,
576}
577
578impl<K, V> NonEmptyIterator for IntoIter<K, V> {}
579
580impl<K, V> IntoIterator for IntoIter<K, V> {
581 type Item = (K, V);
582
583 type IntoIter = std::collections::hash_map::IntoIter<K, V>;
584
585 fn into_iter(self) -> Self::IntoIter {
586 self.iter
587 }
588}
589
590impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IntoIter<K, V> {
591 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
592 self.iter.fmt(f)
593 }
594}
595
596#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
598pub struct Keys<'a, K: 'a, V: 'a> {
599 inner: std::collections::hash_map::Keys<'a, K, V>,
600}
601
602impl<K, V> NonEmptyIterator for Keys<'_, K, V> {}
603
604impl<'a, K, V> IntoIterator for Keys<'a, K, V> {
605 type Item = &'a K;
606
607 type IntoIter = std::collections::hash_map::Keys<'a, K, V>;
608
609 fn into_iter(self) -> Self::IntoIter {
610 self.inner
611 }
612}
613
614impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Keys<'_, K, V> {
615 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
616 self.inner.fmt(f)
617 }
618}
619
620#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
622pub struct Values<'a, K: 'a, V: 'a> {
623 inner: std::collections::hash_map::Values<'a, K, V>,
624}
625
626impl<K, V> NonEmptyIterator for Values<'_, K, V> {}
627
628impl<'a, K, V> IntoIterator for Values<'a, K, V> {
629 type Item = &'a V;
630
631 type IntoIter = std::collections::hash_map::Values<'a, K, V>;
632
633 fn into_iter(self) -> Self::IntoIter {
634 self.inner
635 }
636}
637
638impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Values<'_, K, V> {
639 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
640 self.inner.fmt(f)
641 }
642}
643
644impl<K: fmt::Debug, V: fmt::Debug, S> fmt::Debug for NEMap<K, V, S> {
645 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
646 self.inner.fmt(f)
647 }
648}
649
650#[cfg(test)]
671mod test {
672 use std::num::NonZeroUsize;
673
674 use maplit::hashmap;
675
676 use crate::nem;
677
678 struct Foo {
679 user: String,
680 }
681
682 #[test]
683 fn debug_impl() {
684 let expected = format!("{:?}", hashmap! {0 => 10});
685 let actual = format!("{:?}", nem! {0 => 10});
686 assert_eq!(expected, actual);
687 }
688
689 #[test]
690 fn macro_usage() {
691 let a = Foo {
692 user: "a".to_string(),
693 };
694 let b = Foo {
695 user: "b".to_string(),
696 };
697
698 let map = nem![1 => a, 2 => b];
699 assert_eq!("a", map.get(&1).unwrap().user);
700 assert_eq!("b", map.get(&2).unwrap().user);
701 }
702
703 #[test]
704 fn macro_length() {
705 let map = nem![1 => 'a', 2 => 'b', 1 => 'c'];
706 assert_eq!(unsafe { NonZeroUsize::new_unchecked(2) }, map.len());
707 assert_eq!('c', *map.get(&1).unwrap());
708 assert_eq!('b', *map.get(&2).unwrap());
709 }
710
711 #[test]
712 fn iter_mut() {
713 let mut v = nem! {"a" => 0, "b" => 1, "c" => 2};
714
715 v.iter_mut().for_each(|(_k, v)| {
716 *v += 1;
717 });
718 assert_eq!(nem! {"a" => 1, "b" => 2, "c" => 3}, v);
719
720 for (_k, v) in &mut v {
721 *v -= 1;
722 }
723 assert_eq!(nem! {"a" => 0, "b" => 1, "c" => 2}, v);
724 }
725}
726
727#[cfg(feature = "serde")]
728#[cfg(test)]
729mod serde_tests {
730 use std::collections::HashMap;
731
732 use crate::nem;
733 use crate::NEMap;
734
735 #[test]
736 fn json() {
737 let map0 = nem![1 => 'a', 2 => 'b', 1 => 'c'];
738 let j = serde_json::to_string(&map0).unwrap();
739 let map1 = serde_json::from_str(&j).unwrap();
740 assert_eq!(map0, map1);
741
742 let empty: HashMap<usize, char> = HashMap::new();
743 let j = serde_json::to_string(&empty).unwrap();
744 let bad = serde_json::from_str::<NEMap<usize, char>>(&j);
745 assert!(bad.is_err());
746 }
747}