use bytesbuf::BytesView;
use bytesbuf::mem::{GlobalPool, HasMemory, MemoryShared};
fn main() {
let global_memory_pool = GlobalPool::new();
let mut checksum_calculator = ChecksumCalculator::new(global_memory_pool);
let memory = checksum_calculator.memory();
let message1 = BytesView::copied_from_slice(b"Hello, world!", &memory);
let message2 = BytesView::copied_from_slice(b"Goodbye, world!", &memory);
let message3 = BytesView::copied_from_slice(b"Goodbye, universe!", &memory);
checksum_calculator.add_bytes(message1);
checksum_calculator.add_bytes(message2);
checksum_calculator.add_bytes(message3);
println!("Checksum: {}", checksum_calculator.checksum());
}
#[derive(Debug)]
struct ChecksumCalculator {
memory: GlobalPool,
checksum: u64,
}
impl ChecksumCalculator {
pub const fn new(memory: GlobalPool) -> Self {
Self { memory, checksum: 0 }
}
pub fn add_bytes(&mut self, mut bytes: BytesView) {
while !bytes.is_empty() {
let b = bytes.get_byte();
self.checksum = self.checksum.wrapping_add(u64::from(b));
}
}
pub const fn checksum(&self) -> u64 {
self.checksum
}
}
impl HasMemory for ChecksumCalculator {
fn memory(&self) -> impl MemoryShared {
self.memory.clone()
}
}