Skip to content

Commit 9878a61

Browse files
committed
polyfill: Remove unneeded type parameters from slice polyfills.
1 parent fdf5271 commit 9878a61

File tree

1 file changed

+41
-24
lines changed

1 file changed

+41
-24
lines changed

src/polyfill/slice.rs

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,35 +25,43 @@
2525
use crate::polyfill::{StartMutPtr, StartPtr};
2626

2727
#[allow(dead_code)]
28-
pub(crate) trait SlicePolyfills<T> {
29-
fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T]);
30-
fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T]);
31-
fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])>;
32-
fn split_at_mut_checked(&mut self, mid: usize) -> Option<(&mut [T], &mut [T])>;
33-
fn split_first_chunk_mut<const N: usize>(&mut self) -> Option<(&mut [T; N], &mut [T])>;
28+
pub(crate) trait SlicePolyfills {
29+
type Elem;
30+
fn as_chunks<const N: usize>(&self) -> (&[[Self::Elem; N]], &[Self::Elem]);
31+
fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[Self::Elem; N]], &mut [Self::Elem]);
32+
fn split_at_checked(&self, mid: usize) -> Option<(&[Self::Elem], &[Self::Elem])>;
33+
fn split_at_mut_checked(
34+
&mut self,
35+
mid: usize,
36+
) -> Option<(&mut [Self::Elem], &mut [Self::Elem])>;
37+
fn split_first_chunk_mut<const N: usize>(
38+
&mut self,
39+
) -> Option<(&mut [Self::Elem; N], &mut [Self::Elem])>;
3440
}
3541

36-
impl<T> SlicePolyfills<T> for [T] {
42+
impl<T> SlicePolyfills for [T] {
43+
type Elem = T;
44+
3745
// TODO(MSRV-1.88): Use `slice::as_chunks`.
3846
#[inline]
39-
fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T]) {
47+
fn as_chunks<const N: usize>(&self) -> (&[[Self::Elem; N]], &[Self::Elem]) {
4048
assert!(N != 0);
4149
let len = self.len();
4250
let remainder_len = len % N;
4351
let (chunks, remainder) = self.split_at(len - remainder_len);
44-
let chunks = <*const T>::cast::<[T; N]>(chunks.as_ptr());
52+
let chunks = <*const Self::Elem>::cast::<[Self::Elem; N]>(chunks.as_ptr());
4553
let chunks = unsafe { core::slice::from_raw_parts(chunks, len / N) };
4654
(chunks, remainder)
4755
}
4856

4957
// TODO(MSRV-1.88): Use `slice::as_chunks_mut`.
5058
#[inline]
51-
fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T]) {
59+
fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[Self::Elem; N]], &mut [Self::Elem]) {
5260
assert!(N != 0);
5361
let len = self.len();
5462
let remainder_len = len % N;
5563
let (chunks, remainder) = self.split_at_mut(len - remainder_len);
56-
let chunks = <*mut T>::cast::<[T; N]>(chunks.as_mut_ptr());
64+
let chunks = <*mut Self::Elem>::cast::<[Self::Elem; N]>(chunks.as_mut_ptr());
5765
let chunks = unsafe { core::slice::from_raw_parts_mut(chunks, len / N) };
5866
(chunks, remainder)
5967
}
@@ -64,7 +72,7 @@ impl<T> SlicePolyfills<T> for [T] {
6472
// terms of `split_at` and rely on the optimizer to eliminate the panic.
6573
// TODO(MSRV-1.80): Use `slice::split_at_checked`.
6674
#[inline]
67-
fn split_at_checked(&self, mid: usize) -> Option<(&[T], &[T])> {
75+
fn split_at_checked(&self, mid: usize) -> Option<(&[Self::Elem], &[Self::Elem])> {
6876
if self.len() >= mid {
6977
Some(self.split_at(mid))
7078
} else {
@@ -74,7 +82,10 @@ impl<T> SlicePolyfills<T> for [T] {
7482

7583
// TODO(MSRV-1.80): Use `slice::split_at_checked`.
7684
#[inline]
77-
fn split_at_mut_checked(&mut self, mid: usize) -> Option<(&mut [T], &mut [T])> {
85+
fn split_at_mut_checked(
86+
&mut self,
87+
mid: usize,
88+
) -> Option<(&mut [Self::Elem], &mut [Self::Elem])> {
7889
if self.len() >= mid {
7990
Some(self.split_at_mut(mid))
8091
} else {
@@ -84,32 +95,38 @@ impl<T> SlicePolyfills<T> for [T] {
8495

8596
// TODO(MSRV-1.77): Use `slice::split_first_chunk_mut`.
8697
#[inline]
87-
fn split_first_chunk_mut<const N: usize>(&mut self) -> Option<(&mut [T; N], &mut [T])> {
98+
fn split_first_chunk_mut<const N: usize>(
99+
&mut self,
100+
) -> Option<(&mut [Self::Elem; N], &mut [Self::Elem])> {
88101
let (head, tail) = self.split_at_mut_checked(N)?;
89102
head.try_into().ok().map(|head| (head, tail))
90103
}
91104
}
92105

93106
#[allow(dead_code)]
94-
pub(crate) trait SliceOfArraysPolyfills<T> {
95-
fn as_flattened(&self) -> &[T];
96-
fn as_flattened_mut(&mut self) -> &mut [T];
107+
pub(crate) trait SliceOfArraysPolyfills: SlicePolyfills {
108+
type ElemElem;
109+
110+
fn as_flattened(&self) -> &[Self::ElemElem];
111+
fn as_flattened_mut(&mut self) -> &mut [Self::ElemElem];
97112
}
98113

99-
impl<T, const N: usize> SliceOfArraysPolyfills<T> for [[T; N]] {
114+
impl<T, const N: usize> SliceOfArraysPolyfills for [[T; N]] {
115+
type ElemElem = T;
116+
100117
#[inline]
101-
fn as_flattened(&self) -> &[T] {
118+
fn as_flattened(&self) -> &[Self::ElemElem] {
102119
let total_len = self.len() * N;
103-
let p: *const [T; N] = self.as_ptr();
104-
let p: *const T = StartPtr::start_ptr(p);
120+
let p: *const [Self::ElemElem; N] = self.as_ptr();
121+
let p: *const Self::ElemElem = StartPtr::start_ptr(p);
105122
unsafe { core::slice::from_raw_parts(p, total_len) }
106123
}
107124

108125
#[inline]
109-
fn as_flattened_mut(&mut self) -> &mut [T] {
126+
fn as_flattened_mut(&mut self) -> &mut [Self::ElemElem] {
110127
let total_len = self.len() * N;
111-
let p: *mut [T; N] = self.as_mut_ptr();
112-
let p: *mut T = StartMutPtr::start_mut_ptr(p);
128+
let p: *mut [Self::ElemElem; N] = self.as_mut_ptr();
129+
let p: *mut Self::ElemElem = StartMutPtr::start_mut_ptr(p);
113130
unsafe { core::slice::from_raw_parts_mut(p, total_len) }
114131
}
115132
}

0 commit comments

Comments
 (0)