1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
extern crate libc; use self::libc::c_void; use self::libc::memcpy; use containers::Vector; use memory::Page; use std::mem::align_of; use std::mem::size_of; use std::ops::Index; use std::ops::{Deref, DerefMut}; use std::ptr::null_mut; use std::ptr::write; #[derive(Copy, Clone)] pub struct Array<T: Copy> { vector: Vector<T>, length: usize, } impl<T: Copy> Array<T> { pub fn new() -> Array<T> { Array { vector: Vector { data: null_mut(), length: 0, }, length: 0, } } pub fn get_length(&self) -> usize { self.length } pub fn add(&mut self, item: T) { if self.length == self.vector.length { self.reallocate(); } unsafe { let location = self.vector.data.offset(self.length as isize); write(location, item); } self.length += 1; } fn reallocate(&mut self) { let _own_page = Page::own(self); let size = size_of::<T>(); unsafe { if self.vector.length == 0 { let exclusive_page = (*_own_page).allocate_exclusive_page(); let capacity = (*exclusive_page).get_capacity::<T>(); self.vector.length = capacity / size; self.vector.data = (*exclusive_page) .allocate_raw(self.vector.length * size, align_of::<T>()) as *mut T; } else { let old_length = self.vector.length; self.vector.length *= 2; let old_data = self.vector.data; self.vector.data = (*_own_page).allocate_raw(self.vector.length * size, align_of::<T>()) as *mut T; memcpy( self.vector.data as *mut c_void, old_data as *mut c_void, old_length * size, ); let old_exclusive_page = Page::get(old_data as usize); (*old_exclusive_page).forget(); } } } } impl<T: Copy> Index<usize> for Array<T> { type Output = T; fn index(&self, offset: usize) -> &Self::Output { unsafe { &*self.vector.data.offset(offset as isize) } } } impl<T: Copy> Deref for Array<T> { type Target = [T]; fn deref(&self) -> &[T] { unsafe { ::std::slice::from_raw_parts(self.vector.data, self.length) } } } impl<T: Copy> DerefMut for Array<T> { fn deref_mut(&mut self) -> &mut [T] { unsafe { ::std::slice::from_raw_parts_mut(self.vector.data, self.length) } } }