最终的代码

  1. use std::alloc::{self, Layout};
  2. use std::marker::PhantomData;
  3. use std::mem;
  4. use std::ops::{Deref, DerefMut};
  5. use std::ptr::{self, NonNull};
  6. struct RawVec<T> {
  7. ptr: NonNull<T>,
  8. cap: usize,
  9. _marker: PhantomData<T>,
  10. }
  11. unsafe impl<T: Send> Send for RawVec<T> {}
  12. unsafe impl<T: Sync> Sync for RawVec<T> {}
  13. impl<T> RawVec<T> {
  14. fn new() -> Self {
  15. // !0 等价于 usize::MAX, 这一段分支代码在编译期间就可以计算出结果返回的结果,返回给 cap
  16. let cap = if mem::size_of::<T>() == 0 { !0 } else { 0 };
  17. // `NonNull::dangling()` 有双重含义:
  18. // `未分配内存 (unallocated)`, `零尺寸 (zero-sized allocation)`
  19. RawVec {
  20. ptr: NonNull::dangling(),
  21. cap: cap,
  22. _marker: PhantomData,
  23. }
  24. }
  25. fn grow(&mut self) {
  26. // 因为当 T 的尺寸为 0 时,我们设置了 cap 为 usize::MAX,
  27. // 这一步成立便意味着 Vec 溢出了.
  28. assert!(mem::size_of::<T>() != 0, "capacity overflow");
  29. let (new_cap, new_layout) = if self.cap == 0 {
  30. (1, Layout::array::<T>(1).unwrap())
  31. } else {
  32. // 保证新申请的内存没有超出 `isize::MAX` 字节
  33. let new_cap = 2 * self.cap;
  34. // `Layout::array` 会检查申请的空间是否小于等于 usize::MAX,
  35. // 但是因为 old_layout.size() <= isize::MAX,
  36. // 所以这里的 unwrap 永远不可能失败
  37. let new_layout = Layout::array::<T>(new_cap).unwrap();
  38. (new_cap, new_layout)
  39. };
  40. // 保证新申请的内存没有超出 `isize::MAX` 字节
  41. assert!(
  42. new_layout.size() <= isize::MAX as usize,
  43. "Allocation too large"
  44. );
  45. let new_ptr = if self.cap == 0 {
  46. unsafe { alloc::alloc(new_layout) }
  47. } else {
  48. let old_layout = Layout::array::<T>(self.cap).unwrap();
  49. let old_ptr = self.ptr.as_ptr() as *mut u8;
  50. unsafe { alloc::realloc(old_ptr, old_layout, new_layout.size()) }
  51. };
  52. // 如果分配失败,`new_ptr` 就会成为空指针,我们需要处理该意外情况
  53. self.ptr = match NonNull::new(new_ptr as *mut T) {
  54. Some(p) => p,
  55. None => alloc::handle_alloc_error(new_layout),
  56. };
  57. self.cap = new_cap;
  58. }
  59. }
  60. impl<T> Drop for RawVec<T> {
  61. fn drop(&mut self) {
  62. let elem_size = mem::size_of::<T>();
  63. if self.cap != 0 && elem_size != 0 {
  64. unsafe {
  65. alloc::dealloc(
  66. self.ptr.as_ptr() as *mut u8,
  67. Layout::array::<T>(self.cap).unwrap(),
  68. );
  69. }
  70. }
  71. }
  72. }
  73. pub struct Vec<T> {
  74. buf: RawVec<T>,
  75. len: usize,
  76. }
  77. impl<T> Vec<T> {
  78. fn ptr(&self) -> *mut T {
  79. self.buf.ptr.as_ptr()
  80. }
  81. fn cap(&self) -> usize {
  82. self.buf.cap
  83. }
  84. pub fn new() -> Self {
  85. Vec {
  86. buf: RawVec::new(),
  87. len: 0,
  88. }
  89. }
  90. pub fn push(&mut self, elem: T) {
  91. if self.len == self.cap() {
  92. self.buf.grow();
  93. }
  94. unsafe {
  95. ptr::write(self.ptr().add(self.len), elem);
  96. }
  97. // 不会溢出,会先 OOM
  98. self.len += 1;
  99. }
  100. pub fn pop(&mut self) -> Option<T> {
  101. if self.len == 0 {
  102. None
  103. } else {
  104. self.len -= 1;
  105. unsafe { Some(ptr::read(self.ptr().add(self.len))) }
  106. }
  107. }
  108. pub fn insert(&mut self, index: usize, elem: T) {
  109. assert!(index <= self.len, "index out of bounds");
  110. if self.cap() == self.len {
  111. self.buf.grow();
  112. }
  113. unsafe {
  114. ptr::copy(
  115. self.ptr().add(index),
  116. self.ptr().add(index + 1),
  117. self.len - index,
  118. );
  119. ptr::write(self.ptr().add(index), elem);
  120. self.len += 1;
  121. }
  122. }
  123. pub fn remove(&mut self, index: usize) -> T {
  124. assert!(index < self.len, "index out of bounds");
  125. unsafe {
  126. self.len -= 1;
  127. let result = ptr::read(self.ptr().add(index));
  128. ptr::copy(
  129. self.ptr().add(index + 1),
  130. self.ptr().add(index),
  131. self.len - index,
  132. );
  133. result
  134. }
  135. }
  136. pub fn drain(&mut self) -> Drain<T> {
  137. unsafe {
  138. let iter = RawValIter::new(&self);
  139. // 这里事关 mem::forget 的安全。
  140. // 如果 Drain 被 forget,我们就会泄露整个 Vec 的内存
  141. // 既然我们始终要做这一步,为何不在这里完成呢?
  142. self.len = 0;
  143. Drain {
  144. iter: iter,
  145. vec: PhantomData,
  146. }
  147. }
  148. }
  149. }
  150. impl<T> Drop for Vec<T> {
  151. fn drop(&mut self) {
  152. while let Some(_) = self.pop() {}
  153. // RawVec 来负责释放内存
  154. }
  155. }
  156. impl<T> Deref for Vec<T> {
  157. type Target = [T];
  158. fn deref(&self) -> &[T] {
  159. unsafe { std::slice::from_raw_parts(self.ptr(), self.len) }
  160. }
  161. }
  162. impl<T> DerefMut for Vec<T> {
  163. fn deref_mut(&mut self) -> &mut [T] {
  164. unsafe { std::slice::from_raw_parts_mut(self.ptr(), self.len) }
  165. }
  166. }
  167. impl<T> IntoIterator for Vec<T> {
  168. type Item = T;
  169. type IntoIter = IntoIter<T>;
  170. fn into_iter(self) -> IntoIter<T> {
  171. unsafe {
  172. let iter = RawValIter::new(&self);
  173. let buf = ptr::read(&self.buf);
  174. mem::forget(self);
  175. IntoIter {
  176. iter: iter,
  177. _buf: buf,
  178. }
  179. }
  180. }
  181. }
  182. struct RawValIter<T> {
  183. start: *const T,
  184. end: *const T,
  185. }
  186. impl<T> RawValIter<T> {
  187. unsafe fn new(slice: &[T]) -> Self {
  188. RawValIter {
  189. start: slice.as_ptr(),
  190. end: if mem::size_of::<T>() == 0 {
  191. ((slice.as_ptr() as usize) + slice.len()) as *const _
  192. } else if slice.len() == 0 {
  193. slice.as_ptr()
  194. } else {
  195. slice.as_ptr().add(slice.len())
  196. },
  197. }
  198. }
  199. }
  200. impl<T> Iterator for RawValIter<T> {
  201. type Item = T;
  202. fn next(&mut self) -> Option<T> {
  203. if self.start == self.end {
  204. None
  205. } else {
  206. unsafe {
  207. if mem::size_of::<T>() == 0 {
  208. self.start = (self.start as usize + 1) as *const _;
  209. Some(ptr::read(NonNull::<T>::dangling().as_ptr()))
  210. } else {
  211. let old_ptr = self.start;
  212. self.start = self.start.offset(1);
  213. Some(ptr::read(old_ptr))
  214. }
  215. }
  216. }
  217. }
  218. fn size_hint(&self) -> (usize, Option<usize>) {
  219. let elem_size = mem::size_of::<T>();
  220. let len = (self.end as usize - self.start as usize)
  221. / if elem_size == 0 { 1 } else { elem_size };
  222. (len, Some(len))
  223. }
  224. }
  225. impl<T> DoubleEndedIterator for RawValIter<T> {
  226. fn next_back(&mut self) -> Option<T> {
  227. if self.start == self.end {
  228. None
  229. } else {
  230. unsafe {
  231. if mem::size_of::<T>() == 0 {
  232. self.end = (self.end as usize - 1) as *const _;
  233. Some(ptr::read(NonNull::<T>::dangling().as_ptr()))
  234. } else {
  235. self.end = self.end.offset(-1);
  236. Some(ptr::read(self.end))
  237. }
  238. }
  239. }
  240. }
  241. }
  242. pub struct IntoIter<T> {
  243. _buf: RawVec<T>, // 我们实际上并不关心这个,只需要他们保证分配的空间不被释放
  244. iter: RawValIter<T>,
  245. }
  246. impl<T> Iterator for IntoIter<T> {
  247. type Item = T;
  248. fn next(&mut self) -> Option<T> {
  249. self.iter.next()
  250. }
  251. fn size_hint(&self) -> (usize, Option<usize>) {
  252. self.iter.size_hint()
  253. }
  254. }
  255. impl<T> DoubleEndedIterator for IntoIter<T> {
  256. fn next_back(&mut self) -> Option<T> {
  257. self.iter.next_back()
  258. }
  259. }
  260. impl<T> Drop for IntoIter<T> {
  261. fn drop(&mut self) {
  262. for _ in &mut *self {}
  263. }
  264. }
  265. pub struct Drain<'a, T: 'a> {
  266. vec: PhantomData<&'a mut Vec<T>>,
  267. iter: RawValIter<T>,
  268. }
  269. impl<'a, T> Iterator for Drain<'a, T> {
  270. type Item = T;
  271. fn next(&mut self) -> Option<T> {
  272. self.iter.next()
  273. }
  274. fn size_hint(&self) -> (usize, Option<usize>) {
  275. self.iter.size_hint()
  276. }
  277. }
  278. impl<'a, T> DoubleEndedIterator for Drain<'a, T> {
  279. fn next_back(&mut self) -> Option<T> {
  280. self.iter.next_back()
  281. }
  282. }
  283. impl<'a, T> Drop for Drain<'a, T> {
  284. fn drop(&mut self) {
  285. // 消耗drain
  286. for _ in &mut *self {}
  287. }
  288. }
  289. #
  290. # fn main() {
  291. # tests::create_push_pop();
  292. # tests::iter_test();
  293. # tests::test_drain();
  294. # tests::test_zst();
  295. # println!("All tests finished OK");
  296. # }
  297. #
  298. # mod tests {
  299. # use super::*;
  300. #
  301. # pub fn create_push_pop() {
  302. # let mut v = Vec::new();
  303. # v.push(1);
  304. # assert_eq!(1, v.len());
  305. # assert_eq!(1, v[0]);
  306. # for i in v.iter_mut() {
  307. # *i += 1;
  308. # }
  309. # v.insert(0, 5);
  310. # let x = v.pop();
  311. # assert_eq!(Some(2), x);
  312. # assert_eq!(1, v.len());
  313. # v.push(10);
  314. # let x = v.remove(0);
  315. # assert_eq!(5, x);
  316. # assert_eq!(1, v.len());
  317. # }
  318. #
  319. # pub fn iter_test() {
  320. # let mut v = Vec::new();
  321. # for i in 0..10 {
  322. # v.push(Box::new(i))
  323. # }
  324. # let mut iter = v.into_iter();
  325. # let first = iter.next().unwrap();
  326. # let last = iter.next_back().unwrap();
  327. # drop(iter);
  328. # assert_eq!(0, *first);
  329. # assert_eq!(9, *last);
  330. # }
  331. #
  332. # pub fn test_drain() {
  333. # let mut v = Vec::new();
  334. # for i in 0..10 {
  335. # v.push(Box::new(i))
  336. # }
  337. # {
  338. # let mut drain = v.drain();
  339. # let first = drain.next().unwrap();
  340. # let last = drain.next_back().unwrap();
  341. # assert_eq!(0, *first);
  342. # assert_eq!(9, *last);
  343. # }
  344. # assert_eq!(0, v.len());
  345. # v.push(Box::new(1));
  346. # assert_eq!(1, *v.pop().unwrap());
  347. # }
  348. #
  349. # pub fn test_zst() {
  350. # let mut v = Vec::new();
  351. # for _i in 0..10 {
  352. # v.push(())
  353. # }
  354. #
  355. # let mut count = 0;
  356. #
  357. # for _ in v.into_iter() {
  358. # count += 1
  359. # }
  360. #
  361. # assert_eq!(10, count);
  362. # }
  363. # }