use crate::prelude::*;
use core::cell::RefCell;
pub struct ScopeVec<T> {
data: RefCell<Vec<Box<[T]>>>,
}
impl<T> ScopeVec<T> {
pub fn new() -> ScopeVec<T> {
ScopeVec {
data: Default::default(),
}
}
pub fn push(&self, data: Vec<T>) -> &mut [T] {
let data: Box<[T]> = data.into();
let len = data.len();
let mut storage = self.data.borrow_mut();
storage.push(data);
let ptr = storage.last_mut().unwrap().as_mut_ptr();
unsafe { core::slice::from_raw_parts_mut(ptr, len) }
}
}
#[cfg(test)]
mod tests {
use super::ScopeVec;
use crate::prelude::*;
#[test]
fn smoke() {
let scope = ScopeVec::new();
let a = scope.push(Vec::new());
let b = scope.push(vec![1, 2, 3]);
let c = scope.push(vec![4, 5, 6]);
assert_eq!(a.len(), 0);
b[0] = 4;
c[2] = 5;
assert_eq!(a, []);
assert_eq!(b, [4, 2, 3]);
assert_eq!(c, [4, 5, 5]);
}
}