agg_rust/
span_allocator.rs1pub struct SpanAllocator<C> {
18 span: Vec<C>,
19}
20
21impl<C: Default + Clone> SpanAllocator<C> {
22 pub fn new() -> Self {
23 Self { span: Vec::new() }
24 }
25
26 pub fn allocate(&mut self, span_len: usize) -> &mut [C] {
31 if span_len > self.span.len() {
32 let new_size = ((span_len + 255) >> 8) << 8;
34 self.span.resize(new_size, C::default());
35 }
36 &mut self.span[..span_len]
37 }
38
39 pub fn span(&mut self) -> &mut [C] {
40 &mut self.span
41 }
42
43 pub fn max_span_len(&self) -> usize {
44 self.span.len()
45 }
46}
47
48impl<C: Default + Clone> Default for SpanAllocator<C> {
49 fn default() -> Self {
50 Self::new()
51 }
52}
53
54#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn test_new_empty() {
64 let alloc = SpanAllocator::<u8>::new();
65 assert_eq!(alloc.max_span_len(), 0);
66 }
67
68 #[test]
69 fn test_allocate_grows() {
70 let mut alloc = SpanAllocator::<u32>::new();
71 let span = alloc.allocate(10);
72 assert_eq!(span.len(), 10);
73 assert_eq!(alloc.max_span_len(), 256);
75 }
76
77 #[test]
78 fn test_allocate_reuses() {
79 let mut alloc = SpanAllocator::<u32>::new();
80 alloc.allocate(100);
81 assert_eq!(alloc.max_span_len(), 256);
82 let span = alloc.allocate(50);
84 assert_eq!(span.len(), 50);
85 assert_eq!(alloc.max_span_len(), 256);
86 }
87
88 #[test]
89 fn test_allocate_alignment() {
90 let mut alloc = SpanAllocator::<u8>::new();
91 alloc.allocate(257);
92 assert_eq!(alloc.max_span_len(), 512);
93 }
94
95 #[test]
96 fn test_span_accessor() {
97 let mut alloc = SpanAllocator::<u32>::new();
98 alloc.allocate(10);
99 let span = alloc.span();
100 assert!(span.len() >= 10);
101 }
102}