Skip to content

Commit 46ef708

Browse files
author
bors-servo
authored
Auto merge of #48 - SergioBenitez:master, r=emilio
Add from_vec method for efficient creation from a Vec. I also bumped the version to 0.3.3 for easy publishing. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/rust-smallvec/48) <!-- Reviewable:end -->
2 parents e3e9cc9 + 0bf0141 commit 46ef708

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "smallvec"
3-
version = "0.3.2"
3+
version = "0.3.3"
44
authors = ["Simon Sapin <[email protected]>"]
55
license = "MPL-2.0"
66
repository = "https://github.com/servo/rust-smallvec"

lib.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,31 @@ impl<A: Array> SmallVec<A> {
207207
}
208208
}
209209

210+
/// Construct a new `SmallVec` from a `Vec<A::Item>` without copying
211+
/// elements.
212+
///
213+
/// ```rust
214+
/// use smallvec::SmallVec;
215+
///
216+
/// let vec = vec![1, 2, 3, 4, 5];
217+
/// let small_vec: SmallVec<[_; 3]> = SmallVec::from_vec(vec);
218+
///
219+
/// assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
220+
/// ```
221+
#[inline]
222+
pub fn from_vec(mut vec: Vec<A::Item>) -> SmallVec<A> {
223+
let (ptr, cap, len) = (vec.as_mut_ptr(), vec.capacity(), vec.len());
224+
mem::forget(vec);
225+
226+
SmallVec {
227+
len: len,
228+
data: SmallVecData::Heap {
229+
ptr: ptr,
230+
capacity: cap
231+
}
232+
}
233+
}
234+
210235
/// Sets the length of a vector.
211236
///
212237
/// This will explicitly set the size of the vector, without actually
@@ -1363,4 +1388,37 @@ pub mod tests {
13631388
let vec = SmallVec::<[u8; 2]>::from_iter(0..3);
13641389
assert_eq!(vec.into_vec(), vec![0, 1, 2]);
13651390
}
1391+
1392+
#[test]
1393+
fn test_from_vec() {
1394+
let vec = vec![];
1395+
let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
1396+
assert_eq!(&*small_vec, &[]);
1397+
drop(small_vec);
1398+
1399+
let vec = vec![];
1400+
let small_vec: SmallVec<[u8; 1]> = SmallVec::from_vec(vec);
1401+
assert_eq!(&*small_vec, &[]);
1402+
drop(small_vec);
1403+
1404+
let vec = vec![1];
1405+
let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
1406+
assert_eq!(&*small_vec, &[1]);
1407+
drop(small_vec);
1408+
1409+
let vec = vec![1, 2, 3];
1410+
let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
1411+
assert_eq!(&*small_vec, &[1, 2, 3]);
1412+
drop(small_vec);
1413+
1414+
let vec = vec![1, 2, 3, 4, 5];
1415+
let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
1416+
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
1417+
drop(small_vec);
1418+
1419+
let vec = vec![1, 2, 3, 4, 5];
1420+
let small_vec: SmallVec<[u8; 1]> = SmallVec::from_vec(vec);
1421+
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
1422+
drop(small_vec);
1423+
}
13661424
}

0 commit comments

Comments
 (0)