pub const DEFAULT_MAX_ITEM_NUM: usize = 1 << 18;
#[derive(Debug, Default)]
pub struct ArgSliceVector {
max_count: usize,
items: Vec<Vec<u8>>,
}
impl ArgSliceVector {
pub fn new() -> Self {
Self::with_max_items(DEFAULT_MAX_ITEM_NUM)
}
pub fn with_max_items(max_item_num: usize) -> Self {
Self {
max_count: max_item_num,
items: Vec::new(),
}
}
pub fn try_add_item(&mut self, item: &[u8]) -> bool {
if self.items.len() + 1 >= self.max_count {
return false;
}
self.items.push(item.to_vec());
true
}
pub fn count(&self) -> usize {
self.items.len()
}
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
pub fn items(&self) -> &[Vec<u8>] {
&self.items
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn try_add_item_collects_until_capacity() {
let mut v = ArgSliceVector::with_max_items(3);
assert!(v.try_add_item(b"k1"));
assert!(v.try_add_item(b"k2"));
assert!(!v.try_add_item(b"k3"));
assert_eq!(v.count(), 2);
assert_eq!(v.items(), &[b"k1".to_vec(), b"k2".to_vec()]);
}
#[test]
fn default_capacity_matches_csharp() {
let mut v = ArgSliceVector::new();
assert_eq!(DEFAULT_MAX_ITEM_NUM, 1 << 18);
assert!(v.is_empty());
assert!(v.try_add_item(&[0u8; 64]));
assert_eq!(v.count(), 1);
}
}