1use crate::oid::Oid;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
50pub struct OidTable<V> {
51 entries: Vec<(Oid, V)>,
53}
54
55impl<V> OidTable<V> {
56 pub fn new() -> Self {
58 Self {
59 entries: Vec::new(),
60 }
61 }
62
63 pub fn with_capacity(capacity: usize) -> Self {
65 Self {
66 entries: Vec::with_capacity(capacity),
67 }
68 }
69
70 pub fn insert(&mut self, oid: Oid, value: V) {
74 match self.entries.binary_search_by(|(o, _)| o.cmp(&oid)) {
75 Ok(idx) => self.entries[idx].1 = value,
76 Err(idx) => self.entries.insert(idx, (oid, value)),
77 }
78 }
79
80 pub fn remove(&mut self, oid: &Oid) -> Option<V> {
84 match self.entries.binary_search_by(|(o, _)| o.cmp(oid)) {
85 Ok(idx) => Some(self.entries.remove(idx).1),
86 Err(_) => None,
87 }
88 }
89
90 pub fn get(&self, oid: &Oid) -> Option<&V> {
92 match self.entries.binary_search_by(|(o, _)| o.cmp(oid)) {
93 Ok(idx) => Some(&self.entries[idx].1),
94 Err(_) => None,
95 }
96 }
97
98 pub fn get_next(&self, oid: &Oid) -> Option<(&Oid, &V)> {
102 match self.entries.binary_search_by(|(o, _)| o.cmp(oid)) {
103 Ok(idx) => {
104 self.entries.get(idx + 1).map(|(o, v)| (o, v))
106 }
107 Err(idx) => {
108 self.entries.get(idx).map(|(o, v)| (o, v))
110 }
111 }
112 }
113
114 pub fn len(&self) -> usize {
116 self.entries.len()
117 }
118
119 pub fn is_empty(&self) -> bool {
121 self.entries.is_empty()
122 }
123
124 pub fn clear(&mut self) {
126 self.entries.clear();
127 }
128
129 pub fn iter(&self) -> impl Iterator<Item = (&Oid, &V)> {
131 self.entries.iter().map(|(o, v)| (o, v))
132 }
133}
134
135impl<V> Default for OidTable<V> {
136 fn default() -> Self {
137 Self::new()
138 }
139}
140
141impl<'a, V> IntoIterator for &'a OidTable<V> {
142 type Item = (&'a Oid, &'a V);
143 type IntoIter =
144 std::iter::Map<std::slice::Iter<'a, (Oid, V)>, fn(&'a (Oid, V)) -> (&'a Oid, &'a V)>;
145
146 fn into_iter(self) -> Self::IntoIter {
147 self.entries.iter().map(|(o, v)| (o, v))
148 }
149}
150
151#[cfg(test)]
152mod tests {
153 use super::*;
154 use crate::oid;
155
156 #[test]
157 fn test_oid_table_insert_and_get() {
158 let mut table: OidTable<i32> = OidTable::new();
159
160 table.insert(oid!(1, 3, 6, 1, 2), 100);
161 table.insert(oid!(1, 3, 6, 1, 1), 50);
162 table.insert(oid!(1, 3, 6, 1, 3), 150);
163
164 assert_eq!(table.get(&oid!(1, 3, 6, 1, 1)), Some(&50));
166 assert_eq!(table.get(&oid!(1, 3, 6, 1, 2)), Some(&100));
167 assert_eq!(table.get(&oid!(1, 3, 6, 1, 3)), Some(&150));
168 assert_eq!(table.get(&oid!(1, 3, 6, 1, 4)), None);
169 }
170
171 #[test]
172 fn test_oid_table_update_existing() {
173 let mut table: OidTable<i32> = OidTable::new();
174
175 table.insert(oid!(1, 3, 6, 1, 1), 50);
176 table.insert(oid!(1, 3, 6, 1, 1), 100);
177
178 assert_eq!(table.get(&oid!(1, 3, 6, 1, 1)), Some(&100));
179 assert_eq!(table.len(), 1);
180 }
181
182 #[test]
183 fn test_oid_table_get_next() {
184 let mut table: OidTable<i32> = OidTable::new();
185
186 table.insert(oid!(1, 3, 6, 1, 1), 50);
187 table.insert(oid!(1, 3, 6, 1, 2), 100);
188 table.insert(oid!(1, 3, 6, 1, 3), 150);
189
190 let next = table.get_next(&oid!(1, 3, 6, 1, 0));
192 assert!(next.is_some());
193 assert_eq!(next.unwrap().0, &oid!(1, 3, 6, 1, 1));
194
195 let next = table.get_next(&oid!(1, 3, 6, 1, 1));
197 assert!(next.is_some());
198 assert_eq!(next.unwrap().0, &oid!(1, 3, 6, 1, 2));
199
200 let next = table.get_next(&oid!(1, 3, 6, 1, 1, 5));
202 assert!(next.is_some());
203 assert_eq!(next.unwrap().0, &oid!(1, 3, 6, 1, 2));
204
205 let next = table.get_next(&oid!(1, 3, 6, 1, 3));
207 assert!(next.is_none());
208
209 let next = table.get_next(&oid!(1, 3, 6, 1, 4));
210 assert!(next.is_none());
211 }
212
213 #[test]
214 fn test_oid_table_remove() {
215 let mut table: OidTable<i32> = OidTable::new();
216
217 table.insert(oid!(1, 3, 6, 1, 1), 50);
218 table.insert(oid!(1, 3, 6, 1, 2), 100);
219
220 assert_eq!(table.remove(&oid!(1, 3, 6, 1, 1)), Some(50));
221 assert_eq!(table.remove(&oid!(1, 3, 6, 1, 1)), None);
222 assert_eq!(table.len(), 1);
223 }
224
225 #[test]
226 fn test_oid_table_iter() {
227 let mut table: OidTable<i32> = OidTable::new();
228
229 table.insert(oid!(1, 3, 6, 1, 3), 150);
230 table.insert(oid!(1, 3, 6, 1, 1), 50);
231 table.insert(oid!(1, 3, 6, 1, 2), 100);
232
233 let entries: Vec<_> = table.iter().collect();
234 assert_eq!(entries.len(), 3);
235 assert_eq!(entries[0].0, &oid!(1, 3, 6, 1, 1));
236 assert_eq!(entries[1].0, &oid!(1, 3, 6, 1, 2));
237 assert_eq!(entries[2].0, &oid!(1, 3, 6, 1, 3));
238 }
239
240 #[test]
241 fn test_oid_table_empty() {
242 let table: OidTable<i32> = OidTable::new();
243 assert!(table.is_empty());
244 assert_eq!(table.len(), 0);
245 assert!(table.get_next(&oid!(1, 3, 6, 1)).is_none());
246 }
247}