Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.49 KB | None | 0 0
  1. #![allow(dead_code)]
  2.  
  3. extern crate libc; // 0.2.62
  4.  
  5. use std::mem::size_of;
  6.  
  7. struct Vector<T> {
  8. length: usize,
  9. capacity: usize,
  10. ptr: Option<*mut T>
  11. }
  12.  
  13. impl<T> Vector<T> {
  14. pub fn new()->Self{
  15. Vector {
  16. length: 0,
  17. capacity: 0,
  18. ptr: None //null ptr
  19. }
  20. }
  21. fn grow(&mut self, n:usize){
  22. self.capacity += n;
  23. let new_ptr = unsafe { libc::malloc(size_of::<T>()*self.capacity) as *mut T };
  24. unsafe {
  25. if let Some(ptr) = self.ptr {
  26. std::ptr::copy(ptr, new_ptr, self.length);
  27. libc::free(ptr as *mut libc::c_void);
  28. }
  29. }
  30. std::mem::swap(&mut self.ptr, &mut Some(new_ptr));
  31. }
  32.  
  33. unsafe fn grow_to(&mut self, new_capacity: usize) {
  34. self.grow(new_capacity - self.capacity);
  35. }
  36.  
  37. pub fn push(&mut self, item:T){
  38. if self.capacity <= self.length {
  39. unsafe {
  40. self.grow_to(self.capacity + 1);
  41. }
  42. }
  43. let ptr = self.ptr.unwrap();
  44. let slice = unsafe { std::slice::from_raw_parts_mut(ptr, self.capacity) };
  45. slice[self.length] = item;
  46. self.length+=1;
  47. }
  48.  
  49. pub fn get(&self, i:usize)->&T {
  50. let slice = unsafe {
  51. std::slice::from_raw_parts(self.ptr.unwrap(), self.length)
  52. };
  53. &slice[i]
  54. }
  55. }
  56.  
  57. fn main() {
  58. let mut vector = Vector::new();
  59. for i in 0..1000 {
  60. vector.push(i*5);
  61. }
  62. println!("{}", vector.get(50));
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement