orx_split_vec/new_split_vec/
into.rs

1use crate::{Growth, SplitVec};
2use alloc::vec::Vec;
3use orx_pinned_vec::PinnedVec;
4
5// std::vec::vec
6impl<T, G> From<SplitVec<T, G>> for Vec<T>
7where
8    G: Growth,
9{
10    /// Converts the `SplitVec` into a standard `Vec` with a contiguous memory layout.
11    ///
12    /// If the split vector is composed of only one fragment, it is immediately returned as a `Vec` without any cost.
13    ///
14    /// # Examples
15    ///
16    /// ```
17    /// use orx_split_vec::*;
18    ///
19    /// let mut split_vec = SplitVec::with_linear_growth(2);
20    /// split_vec.extend_from_slice(&['a', 'b', 'c']);
21    ///
22    /// assert_eq!(1, split_vec.fragments().len());
23    ///
24    /// let vec: Vec<_> = split_vec.into();
25    /// assert_eq!(vec, &['a', 'b', 'c']);
26    ///
27    /// let mut split_vec = SplitVec::with_linear_growth(2);
28    /// for i in 0..10 {
29    ///     split_vec.push(i);
30    /// }
31    /// assert_eq!(&[0, 1, 2, 3], split_vec.fragments()[0].as_slice());
32    /// assert_eq!(&[4, 5, 6, 7], split_vec.fragments()[1].as_slice());
33    /// assert_eq!(&[8, 9], split_vec.fragments()[2].as_slice());
34    ///
35    /// let vec: Vec<_> = split_vec.into();
36    /// assert_eq!(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], vec.as_slice());
37    /// ```
38    fn from(mut value: SplitVec<T, G>) -> Self {
39        if value.fragments().len() == 1 {
40            value
41                .fragments
42                .into_iter()
43                .map(|x| x.data)
44                .next()
45                .expect("There exists exactly one fragment")
46        } else {
47            let mut vec = Vec::with_capacity(value.len());
48            vec.reserve(value.len());
49            for f in &mut value.fragments {
50                vec.append(&mut f.data);
51            }
52            vec
53        }
54    }
55}
56
57impl<T, G> SplitVec<T, G>
58where
59    G: Growth,
60{
61    /// Converts the `SplitVec` into a standard `Vec` with a contiguous memory layout.
62    ///
63    /// # Examples
64    ///
65    /// ```
66    /// use orx_split_vec::*;
67    ///
68    /// let mut split_vec = SplitVec::with_linear_growth(2);
69    /// split_vec.extend_from_slice(&['a', 'b', 'c']);
70    ///
71    /// assert_eq!(1, split_vec.fragments().len());
72    ///
73    /// let vec = split_vec.to_vec();
74    /// assert_eq!(vec, &['a', 'b', 'c']);
75    ///
76    /// let mut split_vec = SplitVec::with_linear_growth(2);
77    /// for i in 0..10 {
78    ///     split_vec.push(i);
79    /// }
80    /// assert_eq!(&[0, 1, 2, 3], split_vec.fragments()[0].as_slice());
81    /// assert_eq!(&[4, 5, 6, 7], split_vec.fragments()[1].as_slice());
82    /// assert_eq!(&[8, 9], split_vec.fragments()[2].as_slice());
83    ///
84    /// let vec = split_vec.to_vec();
85    /// assert_eq!(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], vec.as_slice());
86    /// ```
87    pub fn to_vec(self) -> Vec<T> {
88        self.into()
89    }
90}
91
92#[cfg(test)]
93mod tests {
94    use crate::*;
95    use alloc::vec::Vec;
96
97    #[test]
98    fn single_fragment() {
99        let mut split_vec = SplitVec::with_linear_growth(2);
100        split_vec.extend_from_slice(&['a', 'b', 'c']);
101
102        assert_eq!(1, split_vec.fragments().len());
103        let vec: Vec<_> = split_vec.into();
104        assert_eq!(vec, &['a', 'b', 'c']);
105
106        let mut split_vec = SplitVec::with_doubling_growth();
107        split_vec.extend_from_slice(&['a', 'b', 'c']);
108
109        assert_eq!(1, split_vec.fragments().len());
110        let vec: Vec<_> = split_vec.into();
111        assert_eq!(vec, &['a', 'b', 'c']);
112
113        let vec: Vec<_> = (0..1574).collect();
114        let split_vec: SplitVec<_, Recursive> = vec.into();
115
116        assert_eq!(1, split_vec.fragments().len());
117        let vec: Vec<_> = split_vec.into();
118        assert_eq!(1574, vec.len());
119        for (i, val) in vec.iter().enumerate() {
120            assert_eq!(i, *val);
121        }
122    }
123}