algae_graph/store/
table.rs

1/*
2    Appellation: atable <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4    Description: an adjacency table
5*/
6use 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}