]> git.lizzy.rs Git - rust.git/blob - library/alloc/src/vec/cow.rs
Auto merge of #107843 - bjorn3:sync_cg_clif-2023-02-09, r=bjorn3
[rust.git] / library / alloc / src / vec / cow.rs
1 use crate::borrow::Cow;
2 use core::iter::FromIterator;
3
4 use super::Vec;
5
6 #[stable(feature = "cow_from_vec", since = "1.8.0")]
7 impl<'a, T: Clone> From<&'a [T]> for Cow<'a, [T]> {
8     /// Creates a [`Borrowed`] variant of [`Cow`]
9     /// from a slice.
10     ///
11     /// This conversion does not allocate or clone the data.
12     ///
13     /// [`Borrowed`]: crate::borrow::Cow::Borrowed
14     fn from(s: &'a [T]) -> Cow<'a, [T]> {
15         Cow::Borrowed(s)
16     }
17 }
18
19 #[stable(feature = "cow_from_vec", since = "1.8.0")]
20 impl<'a, T: Clone> From<Vec<T>> for Cow<'a, [T]> {
21     /// Creates an [`Owned`] variant of [`Cow`]
22     /// from an owned instance of [`Vec`].
23     ///
24     /// This conversion does not allocate or clone the data.
25     ///
26     /// [`Owned`]: crate::borrow::Cow::Owned
27     fn from(v: Vec<T>) -> Cow<'a, [T]> {
28         Cow::Owned(v)
29     }
30 }
31
32 #[stable(feature = "cow_from_vec_ref", since = "1.28.0")]
33 impl<'a, T: Clone> From<&'a Vec<T>> for Cow<'a, [T]> {
34     /// Creates a [`Borrowed`] variant of [`Cow`]
35     /// from a reference to [`Vec`].
36     ///
37     /// This conversion does not allocate or clone the data.
38     ///
39     /// [`Borrowed`]: crate::borrow::Cow::Borrowed
40     fn from(v: &'a Vec<T>) -> Cow<'a, [T]> {
41         Cow::Borrowed(v.as_slice())
42     }
43 }
44
45 #[stable(feature = "rust1", since = "1.0.0")]
46 impl<'a, T> FromIterator<T> for Cow<'a, [T]>
47 where
48     T: Clone,
49 {
50     fn from_iter<I: IntoIterator<Item = T>>(it: I) -> Cow<'a, [T]> {
51         Cow::Owned(FromIterator::from_iter(it))
52     }
53 }