core: implement array::repeat
· model-checking/verify-rust-std@387fd1f (original) (raw)
`@@ -10,6 +10,7 @@ use crate::convert::Infallible;
`
10
10
`use crate::error::Error;
`
11
11
`use crate::fmt;
`
12
12
`use crate::hash::{self, Hash};
`
``
13
`+
use crate::intrinsics::transmute_unchecked;
`
13
14
`use crate::iter::UncheckedIterator;
`
14
15
`use crate::mem::{self, MaybeUninit};
`
15
16
`use crate::ops::{
`
`@@ -27,6 +28,41 @@ pub(crate) use drain::drain_array_with;
`
27
28
`#[stable(feature = "array_value_iter", since = "1.51.0")]
`
28
29
`pub use iter::IntoIter;
`
29
30
``
``
31
`` +
/// Creates an array of type [T; N]
by repeatedly cloning a value.
``
``
32
`+
///
`
``
33
`+
/// The value will be used as the last element of the resulting array, so it
`
``
34
`+
/// will be cloned N - 1 times. If N is zero, the value will be dropped.
`
``
35
`+
///
`
``
36
`+
/// # Example
`
``
37
`+
///
`
``
38
`+
/// Creating muliple copies of a string:
`
``
39
/// ```rust
``
40
`+
/// #![feature(array_repeat)]
`
``
41
`+
///
`
``
42
`+
/// use std::array;
`
``
43
`+
///
`
``
44
`+
/// let string = "Hello there!".to_string();
`
``
45
`+
/// let strings = array::repeat(string);
`
``
46
`+
/// assert_eq!(strings, ["Hello there!", "Hello there!"]);
`
``
47
/// ```
``
48
`+
#[inline]
`
``
49
`+
#[unstable(feature = "array_repeat", issue = "none")]
`
``
50
`+
pub fn repeat<T: Clone, const N: usize>(val: T) -> [T; N] {
`
``
51
`+
match N {
`
``
52
`+
// SAFETY: we know N to be 0 at this point.
`
``
53
`+
0 => unsafe { transmute_unchecked::<[T; 0], [T; N]>([]) },
`
``
54
`+
// SAFETY: we know N to be 1 at this point.
`
``
55
`+
1 => unsafe { transmute_unchecked::<[T; 1], [T; N]>([val]) },
`
``
56
`+
_ => {
`
``
57
`+
let mut array = MaybeUninit::uninit_array::();
`
``
58
`+
try_from_fn_erased(&mut array[..N - 1], NeverShortCircuit::wrap_mut_1(|_| val.clone()));
`
``
59
`+
array[N - 1].write(val);
`
``
60
`+
// SAFETY: all elements were initialized.
`
``
61
`+
unsafe { MaybeUninit::array_assume_init(array) }
`
``
62
`+
}
`
``
63
`+
}
`
``
64
`+
}
`
``
65
+
30
66
`` /// Creates an array of type [T; N], where each element T
is the returned value from cb
``
31
67
`/// using that element's index.
`
32
68
`///
`