use std::collections::{HashMap, VecDeque};
use std::sync::{Mutex};
use md5::{Md5, Digest};
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Debug)]
pub struct LimitedHashMap<K, V> {
map: HashMap<K, V>,
order: VecDeque<K>,
max_size: usize,
}
impl<K, V> LimitedHashMap<K, V>
where
K: std::hash::Hash + Eq + Clone,
{
pub fn new(max_size: usize) -> Self {
Self {
map: HashMap::with_capacity(max_size),
order: VecDeque::with_capacity(max_size),
max_size,
}
}
pub fn void() -> Self {
Self {
map: HashMap::new(),
order: VecDeque::new(),
max_size: 1
}
}
pub fn is_void(& self) -> bool {
self.map.capacity()== 0 && self.max_size==1
}
pub fn insert(&mut self, key: K, value: V) {
if self.map.contains_key(&key) {
self.order.retain(|k| k != &key);
}
self.map.insert(key.clone(), value);
self.order.push_back(key.clone());
if self.map.len() > self.max_size {
if let Some(oldest_key) = self.order.pop_front() {
self.map.remove(&oldest_key);
}
}
}
pub fn get(&self, key: &K) -> Option<&V> {
self.map.get(key)
}
pub fn len(&self) -> usize {
self.map.len()
}
pub fn remove(& mut self, key: &K) -> Option<V> {
if self.map.contains_key(&key) {
self.order.retain(|k| k != key);
}
self.map.remove(key)
}
pub fn keys(&self) -> Vec<K>{
Vec::from(self.order.clone())
}
}
pub struct FifoQueue<K> {
queue: Mutex<VecDeque<K>>, dropped_count: Mutex<u32>, max_size: usize, }
impl<K> FifoQueue<K> {
pub fn new(max_size: usize) -> Self {
Self {
queue: Mutex::new(VecDeque::new()),
dropped_count: Mutex::new(0),
max_size,
}
}
pub fn add(&self, message: K) {
let mut queue = self.queue.lock().unwrap();
let mut dropped_count = self.dropped_count.lock().unwrap();
if queue.len() >= self.max_size {
queue.pop_front(); *dropped_count += 1; }
queue.push_back(message);
}
pub fn get(&self) -> Option<K> {
let mut queue = self.queue.lock().unwrap();
queue.pop_front()
}
pub fn get_dropped_count(&self) -> u32 {
*self.dropped_count.lock().unwrap()
}
pub fn get_available_count(&self) -> usize {
self.queue.lock().unwrap().len()
}
}
pub fn get_hash(bytes: &[u8]) -> String{
let mut hasher = Md5::new();
hasher.update(bytes);
let result = hasher.finalize();
let hash_hex = format!("{:x}", result);
hash_hex
}
pub fn get_cur_timestamp() -> (u64, u64){
let now = SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards");
( now.as_secs(), now.subsec_nanos() as u64)
}