Skip to content

Instantly share code, notes, and snippets.

@jasonish
Created May 28, 2020 20:55
Show Gist options
  • Save jasonish/0d62ff12392605fd39bb9177eff3ec5f to your computer and use it in GitHub Desktop.
Save jasonish/0d62ff12392605fd39bb9177eff3ec5f to your computer and use it in GitHub Desktop.
Config Tracking for DNS
const CONFIG_TRACKER_SIZE: usize = 500;
struct ConfigTracker {
tx_id_set: std::collections::HashSet<u16>,
tx_id_list: std::collections::VecDeque<u16>,
}
impl Default for ConfigTracker {
fn default() -> Self {
Self {
tx_id_set: std::collections::HashSet::with_capacity(CONFIG_TRACKER_SIZE),
tx_id_list: std::collections::VecDeque::with_capacity(CONFIG_TRACKER_SIZE),
}
}
}
impl ConfigTracker {
fn with_capacity(capacity: usize) -> ConfigTracker {
ConfigTracker {
tx_id_set: std::collections::HashSet::with_capacity(capacity),
tx_id_list: std::collections::VecDeque::with_capacity(capacity),
}
}
fn add(&mut self, tx_id: u16) {
if self.tx_id_list.len() == self.tx_id_list.capacity() {
let old_tx_id = self.tx_id_list.pop_front().unwrap();
self.tx_id_set.remove(&old_tx_id);
}
self.tx_id_list.push_back(tx_id);
self.tx_id_set.insert(tx_id);
}
fn contains(&self, tx_id: u16) -> bool {
self.tx_id_set.contains(&tx_id)
}
}
#[cfg(test)]
mod config_tracker_tests {
use super::*;
#[test]
fn test_config_tracker() {
let mut tracker = ConfigTracker::with_capacity(3);
assert_eq!(tracker.tx_id_list.len(), 0);
assert_eq!(tracker.tx_id_set.len(), 0);
assert_eq!(tracker.tx_id_list.capacity(), 3);
assert_eq!(tracker.tx_id_set.capacity(), 3);
tracker.add(9);
assert_eq!(tracker.tx_id_list.len(), 1);
assert_eq!(tracker.tx_id_set.len(), 1);
assert_eq!(tracker.tx_id_list.capacity(), 3);
assert_eq!(tracker.tx_id_set.capacity(), 3);
assert!(tracker.contains(9));
tracker.add(8);
assert_eq!(tracker.tx_id_list.len(), 2);
assert_eq!(tracker.tx_id_set.len(), 2);
assert_eq!(tracker.tx_id_list.capacity(), 3);
assert_eq!(tracker.tx_id_set.capacity(), 3);
assert!(tracker.contains(8));
assert!(tracker.contains(9));
tracker.add(7);
assert_eq!(tracker.tx_id_list.len(), 3);
assert_eq!(tracker.tx_id_set.len(), 3);
assert_eq!(tracker.tx_id_list.capacity(), 3);
assert_eq!(tracker.tx_id_set.capacity(), 3);
assert!(tracker.contains(7));
assert!(tracker.contains(8));
assert!(tracker.contains(9));
tracker.add(6);
assert_eq!(tracker.tx_id_list.len(), 3);
assert_eq!(tracker.tx_id_set.len(), 3);
assert_eq!(tracker.tx_id_list.capacity(), 3);
assert_eq!(tracker.tx_id_set.capacity(), 3);
assert!(tracker.contains(6));
assert!(tracker.contains(7));
assert!(tracker.contains(8));
assert!(!tracker.contains(9));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment