1use crate::{Node, Weight};
7use serde::{Deserialize, Serialize};
8use std::collections::{hash_map, HashMap};
9use std::iter::Extend;
10
11#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
12pub struct AdjacencyTable<N, V>
13where
14 N: Node,
15 V: Weight,
16{
17 store: HashMap<N, Vec<(N, V)>>,
18}
19
20impl<N, V> AdjacencyTable<N, V>
21where
22 N: Node,
23 V: Weight,
24{
25 pub fn new() -> Self {
26 Self {
27 store: HashMap::new(),
28 }
29 }
30 pub fn capacity(&self) -> usize {
31 self.store.capacity()
32 }
33 pub fn clear(&mut self) {
34 self.store.clear()
35 }
36 pub fn contains_key(&self, key: &N) -> bool {
37 self.store.contains_key(key)
38 }
39 pub fn drain(&mut self) -> hash_map::Drain<'_, N, Vec<(N, V)>> {
40 self.store.drain()
41 }
42 pub fn entry(&mut self, key: N) -> hash_map::Entry<'_, N, Vec<(N, V)>> {
43 self.store.entry(key)
44 }
45 pub fn insert(&mut self, key: N, val: Vec<(N, V)>) -> Option<Vec<(N, V)>> {
46 self.store.insert(key, val)
47 }
48 pub fn get(&self, key: &N) -> Option<&Vec<(N, V)>> {
49 self.store.get(key)
50 }
51 pub fn get_key_value(&self, key: &N) -> Option<(&N, &Vec<(N, V)>)> {
52 self.store.get_key_value(key)
53 }
54 pub fn get_mut(&mut self, key: &N) -> Option<&mut Vec<(N, V)>> {
55 self.store.get_mut(key)
56 }
57 pub fn keys(&self) -> hash_map::Keys<N, Vec<(N, V)>> {
58 self.store.keys()
59 }
60 pub fn len(&self) -> usize {
61 self.store.len()
62 }
63 pub fn table(self) -> HashMap<N, Vec<(N, V)>> {
64 self.store
65 }
66 pub fn values(&self) -> hash_map::Values<N, Vec<(N, V)>> {
67 self.store.values()
68 }
69 pub fn values_mut(&mut self) -> hash_map::ValuesMut<N, Vec<(N, V)>> {
70 self.store.values_mut()
71 }
72 pub fn with_capacity(capacity: usize) -> Self {
73 Self {
74 store: HashMap::with_capacity(capacity),
75 }
76 }
77}
78
79impl<N, V> Extend<(N, Vec<(N, V)>)> for AdjacencyTable<N, V>
80where
81 N: Node,
82 V: Weight,
83{
84 fn extend<T: IntoIterator<Item = (N, Vec<(N, V)>)>>(&mut self, iter: T) {
85 self.store.extend(iter)
86 }
87}
88
89impl<N, V> From<HashMap<N, Vec<(N, V)>>> for AdjacencyTable<N, V>
90where
91 N: Node,
92 V: Weight,
93{
94 fn from(store: HashMap<N, Vec<(N, V)>>) -> Self {
95 Self { store }
96 }
97}
98
99impl<N, V> FromIterator<(N, Vec<(N, V)>)> for AdjacencyTable<N, V>
100where
101 N: Node,
102 V: Weight,
103{
104 fn from_iter<T: IntoIterator<Item = (N, Vec<(N, V)>)>>(iter: T) -> Self {
105 let mut map = HashMap::with_hasher(Default::default());
106 map.extend(iter);
107 AdjacencyTable::from(map)
108 }
109}
110
111impl<N, V> IntoIterator for AdjacencyTable<N, V>
112where
113 N: Node,
114 V: Weight,
115{
116 type Item = (N, Vec<(N, V)>);
117
118 type IntoIter = hash_map::IntoIter<N, Vec<(N, V)>>;
119
120 fn into_iter(self) -> Self::IntoIter {
121 self.store.into_iter()
122 }
123}
124
125impl<N, V> std::ops::Index<N> for AdjacencyTable<N, V>
126where
127 N: Node,
128 V: Weight,
129{
130 type Output = Vec<(N, V)>;
131
132 fn index(&self, index: N) -> &Self::Output {
133 &self.store[&index]
134 }
135}
136
137impl<N, V> std::ops::IndexMut<N> for AdjacencyTable<N, V>
138where
139 N: Node,
140 V: Weight,
141{
142 fn index_mut(&mut self, index: N) -> &mut Self::Output {
143 self.store.get_mut(&index).unwrap()
144 }
145}