Skip to content

Commit 62ea3a6

Browse files
authored
Added TinyVec::with_initial_len() function and associated tests. (#224)
1 parent 347ddc6 commit 62ea3a6

3 files changed

Lines changed: 47 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## Next (Unreleased)
4+
5+
* Adds `TinyVec::with_initial_len`
6+
37
## 1.12
48

59
* Add `schemars` support.

src/tinyvec.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,33 @@ impl<A: Array> TinyVec<A> {
684684
}
685685
}
686686

687+
/// Makes a default-initialized TinyVec with the given initial length.
688+
///
689+
/// If the requested length is less than or equal to the array capacity you
690+
/// get an inline vec. If it's greater than you get a heap vec.
691+
/// ```
692+
/// # use tinyvec::*;
693+
/// let t = TinyVec::<[u8; 10]>::with_initial_len(5);
694+
/// assert!(t.is_inline());
695+
/// assert_eq!(t.len(), 5);
696+
///
697+
/// let t = TinyVec::<[u8; 10]>::with_initial_len(20);
698+
/// assert!(t.is_heap());
699+
/// assert_eq!(t.len(), 20);
700+
/// ```
701+
#[inline]
702+
#[must_use]
703+
pub fn with_initial_len(len: usize) -> Self
704+
where
705+
A::Item: Clone,
706+
{
707+
if len <= A::CAPACITY {
708+
TinyVec::Inline(ArrayVec::from_array_len(A::default(), len))
709+
} else {
710+
TinyVec::Heap(vec![A::Item::default(); len])
711+
}
712+
}
713+
687714
/// Converts a `TinyVec<[T; N]>` into a `Box<[T]>`.
688715
///
689716
/// - For `TinyVec::Heap(Vec<T>)`, it takes the `Vec<T>` and converts it into

tests/tinyvec.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,22 @@ fn TinyVec_capacity() {
3333
tv.move_to_the_heap();
3434
tv.extend_from_slice(&[1, 2, 3, 4]);
3535
assert_eq!(tv.capacity(), 4);
36+
37+
let tv = TinyVec::<[i32; 10]>::with_capacity(5);
38+
assert!(tv.is_inline());
39+
assert!(tv.capacity() >= 5);
40+
41+
let tv = TinyVec::<[i32; 10]>::with_capacity(20);
42+
assert!(tv.is_heap());
43+
assert!(tv.capacity() >= 20);
44+
45+
let tv = TinyVec::<[i32; 10]>::with_initial_len(5);
46+
assert!(tv.is_inline());
47+
assert_eq!(tv.len(), 5);
48+
49+
let tv = TinyVec::<[i32; 10]>::with_initial_len(20);
50+
assert!(tv.is_heap());
51+
assert_eq!(tv.len(), 20);
3652
}
3753

3854
#[test]

0 commit comments

Comments
 (0)