enum_map_internals/
enum_map_impls.rs1use {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
48impl<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}