enum_map_internals/
enum_map_impls.rs

1use {Enum, EnumMap};
2
3use core::fmt::{self, Debug, Formatter};
4use core::hash::{Hash, Hasher};
5use core::iter::Extend;
6use core::ops::{Index, IndexMut};
7
8impl<K: Enum<V> + Debug, V: Debug> Debug for EnumMap<K, V> {
9    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
10        f.debug_map().entries(self).finish()
11    }
12}
13
14impl<K: Enum<V>, V> Extend<(K, V)> for EnumMap<K, V> {
15    fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iter: I) {
16        for (key, value) in iter {
17            self[key] = value;
18        }
19    }
20}
21
22impl<'a, K, V> Extend<(&'a K, &'a V)> for EnumMap<K, V>
23where
24    K: Enum<V> + Copy,
25    V: Copy,
26{
27    fn extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: I) {
28        self.extend(iter.into_iter().map(|(&key, &value)| (key, value)));
29    }
30}
31
32impl<K: Enum<V>, V> Index<K> for EnumMap<K, V> {
33    type Output = V;
34
35    #[inline]
36    fn index(&self, key: K) -> &V {
37        &self.as_slice()[key.to_usize()]
38    }
39}
40
41impl<K: Enum<V>, V> IndexMut<K> for EnumMap<K, V> {
42    #[inline]
43    fn index_mut(&mut self, key: K) -> &mut V {
44        &mut self.as_mut_slice()[key.to_usize()]
45    }
46}
47
48// Implementations provided by derive attribute are too specific, and put requirements on K.
49// This is caused by rust-lang/rust#26925.
50impl<K: Enum<V>, V> Clone for EnumMap<K, V>
51where
52    K::Array: Clone,
53{
54    #[inline]
55    fn clone(&self) -> Self {
56        EnumMap {
57            array: self.array.clone(),
58        }
59    }
60}
61
62impl<K: Enum<V>, V> Copy for EnumMap<K, V> where K::Array: Copy {}
63
64impl<K: Enum<V>, V: PartialEq> PartialEq for EnumMap<K, V> {
65    #[inline]
66    fn eq(&self, other: &Self) -> bool {
67        self.as_slice() == other.as_slice()
68    }
69}
70
71impl<K: Enum<V>, V: Eq> Eq for EnumMap<K, V> {}
72
73impl<K: Enum<V>, V: Hash> Hash for EnumMap<K, V> {
74    #[inline]
75    fn hash<H: Hasher>(&self, state: &mut H) {
76        self.as_slice().hash(state);
77    }
78}
79
80impl<K: Enum<V>, V: Default> Default for EnumMap<K, V> {
81    #[inline]
82    fn default() -> Self {
83        enum_map! { _ => V::default() }
84    }
85}