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
use containers::{Array, Ref}; use memory::page::Page; use std::mem::{align_of, size_of}; use std::ops::Index; use std::ops::{Deref, DerefMut}; use std::ptr::write; #[derive(Copy, Clone)] pub struct Vector<T: Copy> { pub data: *mut T, pub length: usize, } impl<T: Copy> Vector<T> { fn new(_rp: *mut Page, length: usize) -> Vector<T> { unsafe { Vector { data: (*_rp).allocate_raw(length * size_of::<T>(), align_of::<T>()) as *mut T, length: length, } } } pub fn from_raw_array(_rp: *mut Page, array: &[T]) -> Vector<T> { let vector = Vector::new(_rp, array.len()); let mut address = vector.data; for item in array { unsafe { write(address, *item); address = address.offset(1); } } vector } pub fn from_array(_rp: *mut Page, array: Ref<Array<T>>) -> Vector<T> { let vector = Vector::new(_rp, array.get_length()); let mut address = vector.data; for item in array.iter() { unsafe { write(address, *item); address = address.offset(1); } } vector } } impl<T: Copy> Index<usize> for Vector<T> { type Output = T; fn index(&self, offset: usize) -> &Self::Output { unsafe { &*self.data.offset(offset as isize) } } } impl<T: Copy> Deref for Vector<T> { type Target = [T]; fn deref(&self) -> &[T] { unsafe { ::std::slice::from_raw_parts(self.data, self.length) } } } impl<T: Copy> DerefMut for Vector<T> { fn deref_mut(&mut self) -> &mut [T] { unsafe { ::std::slice::from_raw_parts_mut(self.data, self.length) } } } #[test] fn test_vector() { use containers::{Ref, String}; use io::Console; use memory::{Heap, Page, Region, StackBucket}; let mut heap = Heap::create(); let root_stack_bucket = StackBucket::create(&mut heap); let root_page = Page::get(root_stack_bucket as usize); let r = Region::create_from_page(root_page); let _r_1 = Region::create(&r); let vector = Ref::new( _r_1.page, Vector::from_raw_array( _r_1.page, &[ String::from_string_slice(_r_1.page, "using"), String::from_string_slice(_r_1.page, "namespace"), String::from_string_slice(_r_1.page, "typedef"), ], ), ); Console::write(&_r_1, vector[0]); Console::write(&_r_1, vector[1]); Console::write(&_r_1, vector[2]); }