From ea8fd35c8ab5b2e8ed3ce8f9fc4ef3ffdf26fc76 Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Sun, 21 Sep 2025 21:33:50 +0800 Subject: [PATCH] feat: 3508_implement_router --- 3508_implement_router/Cargo.lock | 7 +++ 3508_implement_router/Cargo.toml | 6 +++ 3508_implement_router/src/lib.rs | 79 ++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 3508_implement_router/Cargo.lock create mode 100644 3508_implement_router/Cargo.toml create mode 100644 3508_implement_router/src/lib.rs diff --git a/3508_implement_router/Cargo.lock b/3508_implement_router/Cargo.lock new file mode 100644 index 0000000..e81ff3b --- /dev/null +++ b/3508_implement_router/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "implement_router" +version = "0.1.0" diff --git a/3508_implement_router/Cargo.toml b/3508_implement_router/Cargo.toml new file mode 100644 index 0000000..1fc462d --- /dev/null +++ b/3508_implement_router/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "implement_router" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/3508_implement_router/src/lib.rs b/3508_implement_router/src/lib.rs new file mode 100644 index 0000000..7b12fcd --- /dev/null +++ b/3508_implement_router/src/lib.rs @@ -0,0 +1,79 @@ +use std::collections::{HashMap, HashSet, VecDeque}; + +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +pub struct Packet { + source: i32, + destination: i32, + timestamp: i32, +} + +pub struct Router { + limit: usize, + set: HashSet, + queue: VecDeque, + dest_map: HashMap>, +} + +impl Router { + pub fn new(memory_limit: i32) -> Self { + Self { + limit: memory_limit as usize, + set: HashSet::with_capacity(memory_limit as usize), + queue: VecDeque::with_capacity(memory_limit as usize), + dest_map: HashMap::new(), + } + } + + pub fn add_packet(&mut self, source: i32, destination: i32, timestamp: i32) -> bool { + let packet = Packet { + source, + destination, + timestamp, + }; + + if self.set.contains(&packet) { + return false; + } + + if self.limit <= self.queue.len() { + let popped_packet = self.queue.pop_front().unwrap(); + self.set.remove(&popped_packet); + self.dest_map + .get_mut(&popped_packet.destination) + .unwrap() + .pop_front(); + } + + self.set.insert(packet); + self.queue.push_back(packet); + self.dest_map + .entry(packet.destination) + .or_insert(VecDeque::new()) + .push_back(packet); + + true + } + + pub fn forward_packet(&mut self) -> Vec { + if let Some(packet) = self.queue.pop_front() { + self.set.remove(&packet); + self.dest_map + .get_mut(&packet.destination) + .unwrap() + .pop_front(); + vec![packet.source, packet.destination, packet.timestamp] + } else { + vec![] + } + } + + pub fn get_count(&self, destination: i32, start_time: i32, end_time: i32) -> i32 { + if let Some(packets) = self.dest_map.get(&destination) { + let start_index = packets.partition_point(|packet| packet.timestamp < start_time); + let end_index = packets.partition_point(|packet| packet.timestamp <= end_time); + (end_index - start_index) as i32 + } else { + 0 + } + } +}