Auto merge of #96711 - emilio:inline-slice-clone, r=nikic

slice: #[inline] a couple iterator methods.

The one I care about and actually saw in the wild not getting inlined is
clone(). We ended up doing a whole function call for something that just
copies two pointers.

I ended up marking as_slice / as_ref as well because make_slice is
inline(always) itself, and is also the kind of think that can kill
performance in hot loops if you expect it to get inlined. But happy to
undo those.
This commit is contained in:
bors 2022-10-10 12:09:21 +00:00
commit 0265a3e93b

View File

@ -124,6 +124,7 @@ pub(super) fn new(slice: &'a [T]) -> Self {
/// ```
#[must_use]
#[stable(feature = "iter_to_slice", since = "1.4.0")]
#[inline]
pub fn as_slice(&self) -> &'a [T] {
self.make_slice()
}
@ -143,6 +144,7 @@ fn is_sorted_by<F>(self, mut compare: F) -> bool
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Clone for Iter<'_, T> {
#[inline]
fn clone(&self) -> Self {
Iter { ptr: self.ptr, end: self.end, _marker: self._marker }
}
@ -150,6 +152,7 @@ fn clone(&self) -> Self {
#[stable(feature = "slice_iter_as_ref", since = "1.13.0")]
impl<T> AsRef<[T]> for Iter<'_, T> {
#[inline]
fn as_ref(&self) -> &[T] {
self.as_slice()
}
@ -297,6 +300,7 @@ pub fn into_slice(self) -> &'a mut [T] {
/// ```
#[must_use]
#[stable(feature = "slice_iter_mut_as_slice", since = "1.53.0")]
#[inline]
pub fn as_slice(&self) -> &[T] {
self.make_slice()
}
@ -345,6 +349,7 @@ pub fn as_mut_slice(&mut self) -> &mut [T] {
#[stable(feature = "slice_iter_mut_as_slice", since = "1.53.0")]
impl<T> AsRef<[T]> for IterMut<'_, T> {
#[inline]
fn as_ref(&self) -> &[T] {
self.as_slice()
}