1// SPDX-License-Identifier: Apache-2.0 OR MIT 2 3// Set the length of the vec when the `SetLenOnDrop` value goes out of scope. 4// 5// The idea is: The length field in SetLenOnDrop is a local variable 6// that the optimizer will see does not alias with any stores through the Vec's data 7// pointer. This is a workaround for alias analysis issue #32155 8pub(super) struct SetLenOnDrop<'a> { 9 len: &'a mut usize, 10 local_len: usize, 11} 12 13impl<'a> SetLenOnDrop<'a> { 14 #[inline] 15 pub(super) fn new(len: &'a mut usize) -> Self { 16 SetLenOnDrop { local_len: *len, len } 17 } 18 19 #[inline] 20 pub(super) fn increment_len(&mut self, increment: usize) { 21 self.local_len += increment; 22 } 23 24 #[inline] 25 pub(super) fn current_len(&self) -> usize { 26 self.local_len 27 } 28} 29 30impl Drop for SetLenOnDrop<'_> { 31 #[inline] 32 fn drop(&mut self) { 33 *self.len = self.local_len; 34 } 35} 36