123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- use core::mem::size_of;
- use core::{slice, ops, ptr, mem};
- use block::Block;
- use ptr::Pointer;
- pub struct Vec<T: NoDrop> {
-
- ptr: Pointer<T>,
-
-
-
- cap: usize,
-
-
-
- len: usize,
- }
- impl<T: NoDrop> Vec<T> {
-
-
-
- #[inline]
- pub const fn new() -> Vec<T> {
- Vec {
- ptr: Pointer::empty(),
- len: 0,
- cap: 0,
- }
- }
-
-
-
-
-
-
- #[inline]
- pub unsafe fn from_raw_parts(block: Block, len: usize) -> Vec<T> {
-
- debug_assert!(block.size() % size_of::<T>() == 0, "The size of T does not divide the \
- block's size.");
- Vec {
- cap: block.size() / size_of::<T>(),
- ptr: Pointer::new(*block.into_ptr() as *mut T),
- len: len,
- }
- }
-
-
-
-
-
-
-
-
-
- pub fn refill(&mut self, block: Block) -> Block {
-
- let new_cap = block.size() / size_of::<T>();
-
- assert!(self.len <= new_cap, "Block not large enough to cover the vector.");
- debug_assert!(new_cap * size_of::<T>() == block.size(), "The size of T does not divide the \
- block's size.");
- let old = mem::replace(self, Vec::new());
- unsafe {
- ptr::copy_nonoverlapping(*self.ptr, *old.ptr, self.len);
- }
-
- self.cap = new_cap;
- self.ptr = unsafe { Pointer::new(*block.into_ptr() as *mut T) };
- self.len = old.len;
- Block::from(old)
- }
-
-
-
-
- #[inline]
- pub fn ptr(&self) -> &Pointer<T> {
- &self.ptr
- }
-
- #[inline]
- pub fn capacity(&self) -> usize {
- self.cap
- }
-
-
-
- #[inline]
- pub fn push(&mut self, elem: T) -> Result<(), ()> {
- if self.len == self.cap {
- Err(())
- } else {
-
- unsafe {
- ptr::write((*self.ptr).offset(self.len as isize), elem);
- }
-
- self.len += 1;
- Ok(())
- }
- }
- }
- impl<T: NoDrop> From<Vec<T>> for Block {
- fn from(from: Vec<T>) -> Block {
- unsafe { Block::from_raw_parts(from.ptr.cast(), from.cap * size_of::<T>()) }
- }
- }
- impl<T: NoDrop> ops::Deref for Vec<T> {
- #[inline]
- type Target = [T];
- fn deref(&self) -> &[T] {
- unsafe {
- slice::from_raw_parts(*self.ptr as *const _, self.len)
- }
- }
- }
- impl<T: NoDrop> ops::DerefMut for Vec<T> {
- #[inline]
- fn deref_mut(&mut self) -> &mut [T] {
- unsafe {
- slice::from_raw_parts_mut(*self.ptr as *mut _, self.len)
- }
- }
- }
- pub trait NoDrop {}
- impl NoDrop for Block {}
- impl NoDrop for u8 {}
- #[cfg(test)]
- mod test {
- use super::*;
- use block::Block;
- use ptr::Pointer;
- #[test]
- fn test_vec() {
- let mut buffer = [b'a'; 32];
- let mut vec = unsafe {
- Vec::from_raw_parts(
- Block::from_raw_parts(Pointer::new(&mut buffer[0] as *mut u8), 32),
- 16
- )
- };
- assert_eq!(&*vec, b"aaaaaaaaaaaaaaaa");
- vec.push(b'b').unwrap();
- assert_eq!(&*vec, b"aaaaaaaaaaaaaaaab");
- vec.push(b'c').unwrap();
- assert_eq!(&*vec, b"aaaaaaaaaaaaaaaabc");
- vec[0] = b'.';
- assert_eq!(&*vec, b".aaaaaaaaaaaaaaabc");
- unsafe {
- assert_eq!(vec.refill(
- Block::from_raw_parts(Pointer::new(&mut buffer[0] as *mut u8), 32)).size(),
- 32
- );
- }
- assert_eq!(&*vec, b".aaaaaaaaaaaaaaabc");
- for _ in 0..14 {
- vec.push(b'_').unwrap();
- }
- vec.push(b'!').unwrap_err();
- assert_eq!(&*vec, b".aaaaaaaaaaaaaaabc______________");
- assert_eq!(vec.capacity(), 32);
- }
- }
|