Source code
Revision control
Copy as Markdown
Other Tools
// Set the length of the vec when the `SetLenOnDrop` value goes out of scope.↩
//↩
// The idea is: The length field in SetLenOnDrop is a local variable↩
// that the optimizer will see does not alias with any stores through the Vec's data↩
// pointer. This is a workaround for alias analysis issue #32155↩
pub(super) struct SetLenOnDrop<'a> {↩
len: &'a mut usize,↩
local_len: usize,↩
}↩
↩
impl<'a> SetLenOnDrop<'a> {↩
#[inline(always)]↩
pub(super) fn new(len: &'a mut usize) -> Self {↩
SetLenOnDrop {↩
local_len: *len,↩
len,↩
}↩
}↩
↩
#[inline(always)]↩
pub(super) fn increment_len(&mut self, increment: usize) {↩
self.local_len += increment;↩
}↩
}↩
↩
impl Drop for SetLenOnDrop<'_> {↩
#[inline(always)]↩
fn drop(&mut self) {↩
*self.len = self.local_len;↩
}↩
}↩