c_vec.rs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. use crate::{
  2. io::{self, Write},
  3. platform::{self, types::*, WriteByte},
  4. };
  5. use core::{
  6. cmp, fmt,
  7. iter::IntoIterator,
  8. mem,
  9. ops::{Deref, DerefMut},
  10. ptr::{self, NonNull},
  11. slice,
  12. };
  13. /// Error that occurs when an allocation fails
  14. #[derive(Debug, Default, Hash, PartialEq, Eq, Clone, Copy)]
  15. pub struct AllocError;
  16. /// A normal vector allocated in Rust needs to be dropped from Rust
  17. /// too, in order to avoid UB. This CVec is an abstraction that works
  18. /// using only C allocations functions and can therefore be dropped
  19. /// from C. Just like the Rust Vec, this does bounds checks to assure
  20. /// you never reach isize::MAX. Unless you need to drop something from
  21. /// C, prefer Rust's builtin Vec.
  22. pub struct CVec<T> {
  23. ptr: NonNull<T>,
  24. len: usize,
  25. cap: usize,
  26. }
  27. impl<T> CVec<T> {
  28. pub fn new() -> Self {
  29. Self {
  30. ptr: NonNull::dangling(),
  31. len: 0,
  32. cap: 0,
  33. }
  34. }
  35. fn check_bounds(i: usize) -> Result<usize, AllocError> {
  36. if i > core::isize::MAX as usize {
  37. Err(AllocError)
  38. } else {
  39. Ok(i)
  40. }
  41. }
  42. fn check_mul(x: usize, y: usize) -> Result<usize, AllocError> {
  43. x.checked_mul(y)
  44. .ok_or(AllocError)
  45. .and_then(Self::check_bounds)
  46. }
  47. pub fn with_capacity(cap: usize) -> Result<Self, AllocError> {
  48. if cap == 0 {
  49. return Ok(Self::new());
  50. }
  51. let size = Self::check_mul(cap, mem::size_of::<T>())?;
  52. let ptr = NonNull::new(unsafe { platform::alloc(size) as *mut T }).ok_or(AllocError)?;
  53. Ok(Self { ptr, len: 0, cap })
  54. }
  55. unsafe fn resize(&mut self, cap: usize) -> Result<(), AllocError> {
  56. let size = Self::check_mul(cap, mem::size_of::<T>())?;
  57. let ptr = if cap == 0 {
  58. NonNull::dangling()
  59. } else if self.cap > 0 {
  60. NonNull::new(platform::realloc(self.ptr.as_ptr() as *mut c_void, size) as *mut T)
  61. .ok_or(AllocError)?
  62. } else {
  63. NonNull::new((platform::alloc(size)) as *mut T).ok_or(AllocError)?
  64. };
  65. self.ptr = ptr;
  66. self.cap = cap;
  67. Ok(())
  68. }
  69. unsafe fn drop_range(&mut self, start: usize, end: usize) {
  70. let mut start = self.ptr.as_ptr().add(start);
  71. let end = self.ptr.as_ptr().add(end);
  72. while start < end {
  73. ptr::drop_in_place(start);
  74. start = start.add(1);
  75. }
  76. }
  77. // Push stuff
  78. pub fn reserve(&mut self, required: usize) -> Result<(), AllocError> {
  79. let required_len = self
  80. .len
  81. .checked_add(required)
  82. .ok_or(AllocError)
  83. .and_then(Self::check_bounds)?;
  84. if required_len > self.cap {
  85. let new_cap = cmp::min(required_len.next_power_of_two(), core::isize::MAX as usize);
  86. unsafe {
  87. self.resize(new_cap)?;
  88. }
  89. }
  90. Ok(())
  91. }
  92. pub fn push(&mut self, elem: T) -> Result<(), AllocError> {
  93. self.reserve(1)?;
  94. unsafe {
  95. ptr::write(self.ptr.as_ptr().add(self.len), elem);
  96. }
  97. self.len += 1; // no need to bounds check, as new len <= cap
  98. Ok(())
  99. }
  100. pub fn extend_from_slice(&mut self, elems: &[T]) -> Result<(), AllocError>
  101. where
  102. T: Copy,
  103. {
  104. self.reserve(elems.len())?;
  105. unsafe {
  106. ptr::copy_nonoverlapping(elems.as_ptr(), self.ptr.as_ptr().add(self.len), elems.len());
  107. }
  108. self.len += elems.len(); // no need to bounds check, as new len <= cap
  109. Ok(())
  110. }
  111. pub fn append(&mut self, other: &mut Self) -> Result<(), AllocError> {
  112. let len = other.len;
  113. other.len = 0; // move
  114. self.reserve(len)?;
  115. unsafe {
  116. ptr::copy_nonoverlapping(other.as_ptr(), self.ptr.as_ptr().add(self.len), len);
  117. }
  118. self.len += other.len(); // no need to bounds check, as new len <= cap
  119. Ok(())
  120. }
  121. // Pop stuff
  122. pub fn truncate(&mut self, len: usize) {
  123. if len < self.len {
  124. unsafe {
  125. let old_len = self.len;
  126. self.drop_range(len, old_len);
  127. }
  128. self.len = len;
  129. }
  130. }
  131. pub fn shrink_to_fit(&mut self) -> Result<(), AllocError> {
  132. if self.len < self.cap {
  133. unsafe {
  134. let new_cap = self.len;
  135. self.resize(new_cap)?;
  136. }
  137. }
  138. Ok(())
  139. }
  140. pub fn pop(&mut self) -> Option<T> {
  141. if self.is_empty() {
  142. None
  143. } else {
  144. let elem = unsafe { ptr::read(self.as_ptr().add(self.len - 1)) };
  145. self.len -= 1;
  146. Some(elem)
  147. }
  148. }
  149. // Misc stuff
  150. pub fn capacity(&self) -> usize {
  151. self.cap
  152. }
  153. pub fn as_ptr(&self) -> *const T {
  154. self.ptr.as_ptr()
  155. }
  156. pub fn as_mut_ptr(&mut self) -> *mut T {
  157. self.ptr.as_ptr()
  158. }
  159. /// Leaks the inner data. This is safe to drop from C!
  160. pub fn leak(mut self) -> *mut T {
  161. let ptr = self.as_mut_ptr();
  162. mem::forget(self);
  163. ptr
  164. }
  165. }
  166. impl<T> Deref for CVec<T> {
  167. type Target = [T];
  168. fn deref(&self) -> &Self::Target {
  169. unsafe { slice::from_raw_parts(self.ptr.as_ptr(), self.len) }
  170. }
  171. }
  172. impl<T> DerefMut for CVec<T> {
  173. fn deref_mut(&mut self) -> &mut Self::Target {
  174. unsafe { slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len) }
  175. }
  176. }
  177. impl<T> Drop for CVec<T> {
  178. fn drop(&mut self) {
  179. unsafe {
  180. let len = self.len;
  181. self.drop_range(0, len);
  182. }
  183. }
  184. }
  185. impl<'a, T> IntoIterator for &'a CVec<T> {
  186. type Item = <&'a [T] as IntoIterator>::Item;
  187. type IntoIter = <&'a [T] as IntoIterator>::IntoIter;
  188. fn into_iter(self) -> Self::IntoIter {
  189. <&[T]>::into_iter(&*self)
  190. }
  191. }
  192. impl<'a, T> IntoIterator for &'a mut CVec<T> {
  193. type Item = <&'a mut [T] as IntoIterator>::Item;
  194. type IntoIter = <&'a mut [T] as IntoIterator>::IntoIter;
  195. fn into_iter(self) -> Self::IntoIter {
  196. <&mut [T]>::into_iter(&mut *self)
  197. }
  198. }
  199. impl Write for CVec<u8> {
  200. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  201. self.extend_from_slice(buf).map_err(|err| {
  202. io::Error::new(
  203. io::ErrorKind::Other,
  204. "AllocStringWriter::write failed to allocate",
  205. )
  206. })?;
  207. Ok(buf.len())
  208. }
  209. fn flush(&mut self) -> io::Result<()> {
  210. Ok(())
  211. }
  212. }
  213. impl fmt::Write for CVec<u8> {
  214. fn write_str(&mut self, s: &str) -> fmt::Result {
  215. self.write(s.as_bytes()).map_err(|_| fmt::Error)?;
  216. Ok(())
  217. }
  218. }
  219. impl WriteByte for CVec<u8> {
  220. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  221. self.write(&[byte]).map_err(|_| fmt::Error)?;
  222. Ok(())
  223. }
  224. }
  225. #[cfg(test)]
  226. mod tests {
  227. use super::CVec;
  228. #[test]
  229. fn push_pop() {
  230. let mut vec = CVec::new();
  231. vec.push(1).unwrap();
  232. vec.push(2).unwrap();
  233. vec.push(3).unwrap();
  234. assert_eq!(&vec[..], &[1, 2, 3]);
  235. assert_eq!(vec.pop().unwrap(), 3);
  236. assert_eq!(&vec[..], &[1, 2]);
  237. }
  238. #[test]
  239. fn extend_from_slice() {
  240. use core_io::Write;
  241. let mut vec = CVec::new();
  242. vec.extend_from_slice(&[1, 2, 3]).unwrap();
  243. vec.extend_from_slice(&[4, 5, 6]).unwrap();
  244. assert_eq!(&vec[..], &[1, 2, 3, 4, 5, 6]);
  245. assert_eq!(vec.write(&[7, 8, 9]).unwrap(), 3);
  246. assert_eq!(&vec[..], &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
  247. }
  248. #[test]
  249. fn dropped() {
  250. use alloc::rc::Rc;
  251. let counter = Rc::new(());
  252. let mut vec = CVec::with_capacity(3).unwrap();
  253. vec.push(Rc::clone(&counter)).unwrap();
  254. vec.push(Rc::clone(&counter)).unwrap();
  255. vec.push(Rc::clone(&counter)).unwrap();
  256. assert_eq!(Rc::strong_count(&counter), 4);
  257. let popped = vec.pop().unwrap();
  258. assert_eq!(Rc::strong_count(&counter), 4);
  259. drop(popped);
  260. assert_eq!(Rc::strong_count(&counter), 3);
  261. vec.push(Rc::clone(&counter)).unwrap();
  262. vec.push(Rc::clone(&counter)).unwrap();
  263. vec.push(Rc::clone(&counter)).unwrap();
  264. assert_eq!(vec.len(), 5);
  265. assert_eq!(Rc::strong_count(&counter), 6);
  266. vec.truncate(1);
  267. assert_eq!(Rc::strong_count(&counter), 2);
  268. drop(vec);
  269. assert_eq!(Rc::strong_count(&counter), 1);
  270. }
  271. }