#![allow(dead_code)]
use std::collections::HashMap;
#[derive(Debug, Default, Clone)]
pub struct NamedBufferRegistry {
buffers: HashMap<String, Vec<u8>>,
}
impl NamedBufferRegistry {
pub fn new() -> Self {
NamedBufferRegistry { buffers: HashMap::new() }
}
pub fn store(&mut self, name: impl Into<String>, data: Vec<u8>) {
self.buffers.insert(name.into(), data);
}
pub fn get(&self, name: &str) -> Option<&[u8]> {
self.buffers.get(name).map(|v| v.as_slice())
}
pub fn get_mut(&mut self, name: &str) -> Option<&mut Vec<u8>> {
self.buffers.get_mut(name)
}
pub fn remove(&mut self, name: &str) -> Option<Vec<u8>> {
self.buffers.remove(name)
}
pub fn len(&self) -> usize {
self.buffers.len()
}
pub fn is_empty(&self) -> bool {
self.buffers.is_empty()
}
pub fn names(&self) -> impl Iterator<Item = &str> {
self.buffers.keys().map(|s| s.as_str())
}
pub fn total_bytes(&self) -> usize {
self.buffers.values().map(|v| v.len()).sum()
}
}
pub fn new_named_buffer_registry() -> NamedBufferRegistry {
NamedBufferRegistry::new()
}
pub fn nb_store(reg: &mut NamedBufferRegistry, name: &str, data: Vec<u8>) {
reg.store(name, data);
}
pub fn nb_get<'a>(reg: &'a NamedBufferRegistry, name: &str) -> Option<&'a [u8]> {
reg.get(name)
}
pub fn nb_remove(reg: &mut NamedBufferRegistry, name: &str) -> Option<Vec<u8>> {
reg.remove(name)
}
pub fn nb_total_bytes(reg: &NamedBufferRegistry) -> usize {
reg.total_bytes()
}
pub fn nb_len(reg: &NamedBufferRegistry) -> usize {
reg.len()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_store_and_get() {
let mut r = new_named_buffer_registry();
nb_store(&mut r, "buf1", vec![1, 2, 3]);
assert_eq!(nb_get(&r, "buf1"), Some([1u8, 2, 3].as_slice()) );
}
#[test]
fn test_get_missing() {
let r = new_named_buffer_registry();
assert_eq!(nb_get(&r, "nope"), None );
}
#[test]
fn test_remove() {
let mut r = new_named_buffer_registry();
nb_store(&mut r, "x", vec![42]);
let removed = nb_remove(&mut r, "x").expect("should succeed");
assert_eq!(removed, vec![42u8] );
assert!(r.is_empty());
}
#[test]
fn test_len() {
let mut r = new_named_buffer_registry();
nb_store(&mut r, "a", vec![]);
nb_store(&mut r, "b", vec![]);
assert_eq!(nb_len(&r), 2 );
}
#[test]
fn test_total_bytes() {
let mut r = new_named_buffer_registry();
nb_store(&mut r, "a", vec![1, 2, 3]);
nb_store(&mut r, "b", vec![4, 5]);
assert_eq!(nb_total_bytes(&r), 5 );
}
#[test]
fn test_overwrite() {
let mut r = new_named_buffer_registry();
nb_store(&mut r, "k", vec![0]);
nb_store(&mut r, "k", vec![7, 8]);
assert_eq!(nb_get(&r, "k"), Some([7u8, 8].as_slice()) );
assert_eq!(nb_len(&r), 1);
}
#[test]
fn test_names() {
let mut r = new_named_buffer_registry();
nb_store(&mut r, "alpha", vec![]);
let names: Vec<&str> = r.names().collect();
assert!(names.contains(&"alpha") );
}
#[test]
fn test_get_mut() {
let mut r = new_named_buffer_registry();
nb_store(&mut r, "m", vec![1, 2]);
if let Some(buf) = r.get_mut("m") {
buf.push(3);
}
assert_eq!(nb_get(&r, "m"), Some([1u8, 2, 3].as_slice()) );
}
#[test]
fn test_empty_registry() {
let r = new_named_buffer_registry();
assert!(r.is_empty() );
assert_eq!(nb_total_bytes(&r), 0);
}
#[test]
fn test_remove_missing() {
let mut r = new_named_buffer_registry();
assert_eq!(nb_remove(&mut r, "ghost"), None );
}
}