pencil_box/array/fill_default.rs
1/// ๐งฑ Creates a new vector of the specified size, filled with default values for the type.
2///
3/// # Type Parameters
4/// - `T`: The type of elements in the vector. Must implement [`Default`] and [`Clone`].
5///
6/// # Arguments
7/// - `size`: The number of elements to generate.
8///
9/// # Returns
10/// A `Vec<T>` of length `size`, where each element is a clone of `T::default()`.
11///
12/// # Behavior
13/// - Produces an empty vector if `size == 0`.
14/// - Allocates space for `size` elements on the heap.
15/// - Each element is a clone of the typeโs default value, as returned by [`T::default()`].
16///
17/// # Performance
18/// - โ
Time complexity: **O(n)** where `n = size`.
19/// - โ
Space complexity: **O(n)** heap-allocated.
20/// - โ
Minimal overhead, efficient default initialization.
21/// - ๐ซ No in-place mutation; constructs a new vector.
22///
23/// # Examples
24///
25/// ## ๐ข Primitive Types
26/// ```
27/// use pencil_box::array::fill_default::fill_default;
28///
29/// let vec: Vec<i32> = fill_default(3);
30/// assert_eq!(vec, vec![0, 0, 0]);
31///
32/// let vec: Vec<bool> = fill_default(2);
33/// assert_eq!(vec, vec![false, false]);
34/// ```
35///
36/// ## ๐งต Complex Types
37/// ```
38/// let vec: Vec<String> = fill_default(2);
39/// assert_eq!(vec, vec![String::new(), String::new()]);
40///
41/// let vec: Vec<Vec<u8>> = fill_default(2);
42/// assert_eq!(vec, vec![vec![], vec![]]);
43/// ```
44///
45/// ## ๐ญ Enum with Default Variant
46/// ```
47/// #[derive(Debug, PartialEq, Clone, Default)]
48/// enum Status {
49/// #[default]
50/// Idle,
51/// Busy,
52/// }
53///
54/// let vec = fill_default::<Status>(3);
55/// assert_eq!(vec, vec![Status::Idle, Status::Idle, Status::Idle]);
56/// ```
57///
58/// # Panic Safety
59/// โ
This function is panic-free for all valid `size` inputs.
60///
61/// # Features
62/// - ๐ฆ No dependencies, pure safe Rust.
63/// - ๐งฑ Ideal for zero-initialized buffers or defaulted collections.
64/// - ๐ ๏ธ Composable with iterator pipelines and higher-level constructors.
65
66pub fn fill_default<T: Clone + Default>(size: usize) -> Vec<T> {
67 vec![T::default(); size]
68}