#[derive(Debug, Default)]
pub struct BufferBuilder {
data: Vec<u8>,
}
impl BufferBuilder {
pub fn new() -> Self {
Self { data: Vec::new() }
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn append(&mut self, data: &[u8], alignment: usize) -> (usize, usize) {
let padding = (alignment - (self.data.len() % alignment)) % alignment;
self.data.extend(std::iter::repeat_n(0u8, padding));
let offset = self.data.len();
let length = data.len();
self.data.extend_from_slice(data);
(offset, length)
}
pub fn finish(self) -> Vec<u8> {
self.data
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_append() {
let mut builder = BufferBuilder::new();
let (offset1, len1) = builder.append(b"hello", 4);
assert_eq!(offset1, 0);
assert_eq!(len1, 5);
let (offset2, len2) = builder.append(b"world", 4);
assert_eq!(offset2, 8); assert_eq!(len2, 5);
}
#[test]
fn test_already_aligned() {
let mut builder = BufferBuilder::new();
let (offset1, _) = builder.append(b"1234", 4);
assert_eq!(offset1, 0);
let (offset2, _) = builder.append(b"5678", 4);
assert_eq!(offset2, 4);
}
}