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
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// //! A simple but working vector.

// use std::alloc::{alloc, dealloc, realloc, Layout};

// const DEFAULT_CAPACITY: usize = 4;

// pub struct Vector<T> {
//     ptr: *mut T,
//     len: usize,
//     capacity: usize,
// }

// impl<T> Vector<T> {
//     pub fn new() -> Self {
//         let ptr = unsafe {
//             let layout = Self::layout(DEFAULT_CAPACITY);
//             alloc(layout) as *mut T
//         };
//         Self {
//             ptr,
//             len: 0,
//             capacity: DEFAULT_CAPACITY,
//         }
//     }
//     pub fn push(&mut self, v: T) {
//         unsafe {
//             *self.ptr.add(self.len) = v;
//             self.len += 1;
//             if self.len == self.capacity {
//                 self.ptr = realloc(
//                     self.ptr as *mut u8,
//                     Self::layout(self.capacity),
//                     self.capacity * 2,
//                 ) as *mut T;
//                 self.capacity *= 2;
//             }
//         }
//     }
//     pub fn get(&self, idx: usize) -> Option<&T> {
//         if idx < self.len {
//             unsafe { Some(&*(self.ptr.add(idx))) }
//         } else {
//             None
//         }
//     }
//     pub fn get_mut(&self, idx: usize) -> Option<&mut T> {
//         if idx < self.len {
//             unsafe { Some(&mut *(self.ptr.add(idx))) }
//         } else {
//             None
//         }
//     }
//     pub fn pop(&mut self) -> Option<T> {
//         if self.is_empty() {
//             None
//         } else {
//             self.len -= 1;
//             unsafe { Some(std::ptr::read(self.ptr.add(self.len))) }
//         }
//     }
//     pub fn len(&self) -> usize {
//         self.len
//     }
//     pub fn is_empty(&self) -> bool {
//         self.len() == 0
//     }
//     pub fn capacity(&self) -> usize {
//         self.capacity
//     }
//     unsafe fn layout(size: usize) -> Layout {
//         Layout::from_size_align_unchecked(size, std::mem::size_of::<T>())
//     }
// }

// impl<T> Drop for Vector<T> {
//     fn drop(&mut self) {
//         unsafe { dealloc(self.ptr as *mut u8, Self::layout(self.capacity)) };
//     }
// }

// impl<T> std::ops::Index<usize> for Vector<T> {
//     type Output = T;
//     fn index(&self, index: usize) -> &Self::Output {
//         self.get(index).unwrap()
//     }
// }
// impl<T> std::ops::IndexMut<usize> for Vector<T> {
//     fn index_mut(&mut self, index: usize) -> &mut Self::Output {
//         self.get_mut(index).unwrap()
//     }
// }

// // #[cfg(test)]
// // mod tests {
// //     use super::*;
// //     #[test]
// //     fn test_vector() {
// //         let mut v = Vector::<char>::new();
// //         assert_eq!(v.len(), 0);
// //         assert_eq!(v.capacity(), DEFAULT_CAPACITY);
// //         v.push('1');
// //         assert_eq!(v.len(), 1);
// //         assert_eq!(v.capacity(), DEFAULT_CAPACITY);
// //         assert_eq!(v[0], '1');
// //         v.push('2');
// //         v.push('3');
// //         v.push('4');
// //         v.push('5');
// //         v[4] = 'A';
// //         assert_eq!(v.len(), 5);
// //         assert_eq!(v.capacity(), DEFAULT_CAPACITY * 2);
// //         assert_eq!(v[4], 'A');
// //         let x = v.pop();
// //         assert_eq!(x, Some('A'));
// //         assert_eq!(v.len(), 4);
// //     }
// // }