Skip to content

Commit 4961f6c

Browse files
committed
Specialize Vec::from_elem for other integer types
1 parent a457d67 commit 4961f6c

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/libcollections/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#![feature(fused)]
4343
#![feature(generic_param_attrs)]
4444
#![feature(heap_api)]
45+
#![feature(i128_type)]
4546
#![feature(inclusive_range)]
4647
#![feature(lang_items)]
4748
#![feature(nonzero)]

src/libcollections/vec.rs

+32
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,38 @@ impl SpecFromElem for u8 {
13991399
}
14001400
}
14011401

1402+
macro_rules! impl_spec_from_elem_int {
1403+
($t: ty) => {
1404+
impl SpecFromElem for $t {
1405+
#[inline]
1406+
fn from_elem(elem: $t, n: usize) -> Vec<$t> {
1407+
if elem == 0 {
1408+
return Vec {
1409+
buf: RawVec::with_capacity_zeroed(n),
1410+
len: n,
1411+
}
1412+
}
1413+
let mut v = Vec::with_capacity(n);
1414+
v.extend_with_element(n, elem);
1415+
v
1416+
}
1417+
}
1418+
}
1419+
}
1420+
1421+
impl_spec_from_elem_int!(i8);
1422+
impl_spec_from_elem_int!(i16);
1423+
impl_spec_from_elem_int!(i32);
1424+
impl_spec_from_elem_int!(i64);
1425+
impl_spec_from_elem_int!(i128);
1426+
impl_spec_from_elem_int!(isize);
1427+
1428+
impl_spec_from_elem_int!(u16);
1429+
impl_spec_from_elem_int!(u32);
1430+
impl_spec_from_elem_int!(u64);
1431+
impl_spec_from_elem_int!(u128);
1432+
impl_spec_from_elem_int!(usize);
1433+
14021434
////////////////////////////////////////////////////////////////////////////////
14031435
// Common trait implementations for Vec
14041436
////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)