refactor: moved SetLenOnDrop to set_len_on_drop

This commit is contained in:
C 2020-12-05 01:21:51 +00:00
parent a2f4bc0d18
commit a3f3fc5aed
2 changed files with 32 additions and 29 deletions

View File

@ -109,6 +109,10 @@ use self::spec_from_elem::SpecFromElem;
mod spec_from_elem; mod spec_from_elem;
use self::set_len_on_drop::SetLenOnDrop;
mod set_len_on_drop;
/// A contiguous growable array type, written `Vec<T>` but pronounced 'vector'. /// A contiguous growable array type, written `Vec<T>` but pronounced 'vector'.
/// ///
/// # Examples /// # Examples
@ -1911,35 +1915,6 @@ impl<T, A: Allocator> Vec<T, A> {
} }
} }
// 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
struct SetLenOnDrop<'a> {
len: &'a mut usize,
local_len: usize,
}
impl<'a> SetLenOnDrop<'a> {
#[inline]
fn new(len: &'a mut usize) -> Self {
SetLenOnDrop { local_len: *len, len }
}
#[inline]
fn increment_len(&mut self, increment: usize) {
self.local_len += increment;
}
}
impl Drop for SetLenOnDrop<'_> {
#[inline]
fn drop(&mut self) {
*self.len = self.local_len;
}
}
impl<T: PartialEq, A: Allocator> Vec<T, A> { impl<T: PartialEq, A: Allocator> Vec<T, A> {
/// Removes consecutive repeated elements in the vector according to the /// Removes consecutive repeated elements in the vector according to the
/// [`PartialEq`] trait implementation. /// [`PartialEq`] trait implementation.

View File

@ -0,0 +1,28 @@
// 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]
pub(super) fn new(len: &'a mut usize) -> Self {
SetLenOnDrop { local_len: *len, len }
}
#[inline]
pub(super) fn increment_len(&mut self, increment: usize) {
self.local_len += increment;
}
}
impl Drop for SetLenOnDrop<'_> {
#[inline]
fn drop(&mut self) {
*self.len = self.local_len;
}
}