Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 44eb023

Browse files
committedJun 5, 2025··
Rework specialization
1 parent 71c8abb commit 44eb023

File tree

4 files changed

+673
-259
lines changed

4 files changed

+673
-259
lines changed
 

‎benches/bench.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl<T: Copy> Vector<T> for SmallVec<T, VEC_SIZE> {
8080
}
8181

8282
fn from_elems(val: &[T]) -> Self {
83-
SmallVec::from_slice(val)
83+
SmallVec::from(val)
8484
}
8585

8686
fn extend_from_slice(&mut self, other: &[T]) {
@@ -278,17 +278,6 @@ fn gen_from_elem<V: Vector<u64>>(n: usize, b: &mut Bencher) {
278278
});
279279
}
280280

281-
#[bench]
282-
fn bench_insert_from_slice(b: &mut Bencher) {
283-
let v: Vec<u64> = (0..SPILLED_SIZE as _).collect();
284-
b.iter(|| {
285-
let mut vec = SmallVec::<u64, VEC_SIZE>::new();
286-
vec.insert_from_slice(0, &v);
287-
vec.insert_from_slice(0, &v);
288-
vec
289-
});
290-
}
291-
292281
#[bench]
293282
fn bench_macro_from_list(b: &mut Bencher) {
294283
b.iter(|| {

‎fuzz/fuzz_targets/smallvec_ops.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ fn do_test<const N: usize>(data: &[u8]) -> SmallVec<u8, N> {
139139
}
140140
}
141141
22 => {
142-
v = SmallVec::from_slice(data);
142+
v = SmallVec::from(data);
143143
}
144144

145145
23 => {
@@ -149,10 +149,10 @@ fn do_test<const N: usize>(data: &[u8]) -> SmallVec<u8, N> {
149149
}
150150

151151
24 => {
152-
if v.len() < CAP_GROWTH {
153-
let insert_pos = next_usize!(bytes) % (v.len() + 1);
154-
v.insert_from_slice(insert_pos, data);
155-
}
152+
let a = next_usize!(bytes) % (v.len() + 1);
153+
let b = next_usize!(bytes) % (v.len() + 1);
154+
let (start, end) = (a.min(b), a.max(b));
155+
v.extend_from_within(start..end);
156156
}
157157

158158
25 => {
@@ -161,7 +161,7 @@ fn do_test<const N: usize>(data: &[u8]) -> SmallVec<u8, N> {
161161
}
162162
}
163163
26 => {
164-
v = SmallVec::from_elem(next_u8!(bytes), next_usize!(bytes));
164+
v = smallvec::from_elem(next_u8!(bytes), next_usize!(bytes));
165165
}
166166
_ => panic!("booo"),
167167
}

‎src/lib.rs

Lines changed: 650 additions & 221 deletions
Large diffs are not rendered by default.

‎src/tests.rs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -374,30 +374,26 @@ fn drain_overflow() {
374374
}
375375

376376
#[test]
377-
fn test_insert_from_slice() {
377+
fn test_extend_from_slice() {
378378
let mut v: SmallVec<u8, 8> = SmallVec::new();
379379
for x in 0..4 {
380380
v.push(x);
381381
}
382382
assert_eq!(v.len(), 4);
383-
v.insert_from_slice(1, &[5, 6]);
383+
v.extend_from_slice(&[5, 6]);
384384
assert_eq!(
385385
&v.iter().map(|v| *v).collect::<Vec<_>>(),
386-
&[0, 5, 6, 1, 2, 3]
386+
&[0, 1, 2, 3, 5, 6]
387387
);
388388
}
389389

390390
#[test]
391-
fn test_extend_from_slice() {
392-
let mut v: SmallVec<u8, 8> = SmallVec::new();
393-
for x in 0..4 {
394-
v.push(x);
395-
}
396-
assert_eq!(v.len(), 4);
397-
v.extend_from_slice(&[5, 6]);
391+
fn test_extend_from_within() {
392+
let mut v: SmallVec<u8, 8> = smallvec![0, 1, 2, 3];
393+
v.extend_from_within(1..3);
398394
assert_eq!(
399395
&v.iter().map(|v| *v).collect::<Vec<_>>(),
400-
&[0, 1, 2, 3, 5, 6]
396+
&[0, 1, 2, 3, 1, 2],
401397
);
402398
}
403399

@@ -590,9 +586,9 @@ fn test_from() {
590586

591587
#[test]
592588
fn test_from_slice() {
593-
assert_eq!(&SmallVec::<u32, 2>::from_slice(&[1][..])[..], [1]);
589+
assert_eq!(&SmallVec::<u32, 2>::from(&[1][..])[..], [1]);
594590
assert_eq!(
595-
&SmallVec::<u32, 2>::from_slice(&[1, 2, 3][..])[..],
591+
&SmallVec::<u32, 2>::from(&[1, 2, 3][..])[..],
596592
[1, 2, 3]
597593
);
598594
}
@@ -723,15 +719,15 @@ fn test_from_vec() {
723719
#[test]
724720
fn test_retain() {
725721
// Test inline data storage
726-
let mut sv: SmallVec<i32, 5> = SmallVec::from_slice(&[1, 2, 3, 3, 4]);
722+
let mut sv: SmallVec<i32, 5> = SmallVec::from(&[1, 2, 3, 3, 4]);
727723
sv.retain(|&i| i != 3);
728724
assert_eq!(sv.pop(), Some(4));
729725
assert_eq!(sv.pop(), Some(2));
730726
assert_eq!(sv.pop(), Some(1));
731727
assert_eq!(sv.pop(), None);
732728

733729
// Test spilled data storage
734-
let mut sv: SmallVec<i32, 3> = SmallVec::from_slice(&[1, 2, 3, 3, 4]);
730+
let mut sv: SmallVec<i32, 3> = SmallVec::from(&[1, 2, 3, 3, 4]);
735731
sv.retain(|&i| i != 3);
736732
assert_eq!(sv.pop(), Some(4));
737733
assert_eq!(sv.pop(), Some(2));
@@ -757,19 +753,19 @@ fn test_retain() {
757753

758754
#[test]
759755
fn test_dedup() {
760-
let mut dupes: SmallVec<i32, 5> = SmallVec::from_slice(&[1, 1, 2, 3, 3]);
756+
let mut dupes: SmallVec<i32, 5> = SmallVec::from(&[1, 1, 2, 3, 3]);
761757
dupes.dedup();
762758
assert_eq!(&*dupes, &[1, 2, 3]);
763759

764760
let mut empty: SmallVec<i32, 5> = SmallVec::new();
765761
empty.dedup();
766762
assert!(empty.is_empty());
767763

768-
let mut all_ones: SmallVec<i32, 5> = SmallVec::from_slice(&[1, 1, 1, 1, 1]);
764+
let mut all_ones: SmallVec<i32, 5> = SmallVec::from(&[1, 1, 1, 1, 1]);
769765
all_ones.dedup();
770766
assert_eq!(all_ones.len(), 1);
771767

772-
let mut no_dupes: SmallVec<i32, 5> = SmallVec::from_slice(&[1, 2, 3, 4, 5]);
768+
let mut no_dupes: SmallVec<i32, 5> = SmallVec::from(&[1, 2, 3, 4, 5]);
773769
no_dupes.dedup();
774770
assert_eq!(no_dupes.len(), 5);
775771
}
@@ -940,8 +936,8 @@ fn test_extract_if() {
940936

941937
let b: SmallVec<u8, 2> = a.extract_if(1..9, |x| *x % 3 == 0).collect();
942938

943-
assert_eq!(a, SmallVec::<u8, 2>::from_slice(&[0, 1u8, 2, 4, 5, 7, 8, 0]));
944-
assert_eq!(b, SmallVec::<u8, 2>::from_slice(&[3u8, 6]));
939+
assert_eq!(a, SmallVec::<u8, 2>::from(&[0, 1u8, 2, 4, 5, 7, 8, 0]));
940+
assert_eq!(b, SmallVec::<u8, 2>::from(&[3u8, 6]));
945941
}
946942

947943
/// This assortment of tests, in combination with miri, verifies we handle UB on fishy arguments

0 commit comments

Comments
 (0)
Please sign in to comment.