Skip to main content

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.into_inner())
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                // SAFETY: source will be used to provide elements and it
51                // will be left with zero-length; however, its capacity
52                // will not change.
53                let source = unsafe { f.as_mut_vec() };
54                vec.append(source);
55            }
56            vec
57        }
58    }
59}
60
61impl<T, G> SplitVec<T, G>
62where
63    G: Growth,
64{
65    /// Converts the `SplitVec` into a standard `Vec` with a contiguous memory layout.
66    ///
67    /// # Examples
68    ///
69    /// ```
70    /// use orx_split_vec::*;
71    ///
72    /// let mut split_vec = SplitVec::with_linear_growth(2);
73    /// split_vec.extend_from_slice(&['a', 'b', 'c']);
74    ///
75    /// assert_eq!(1, split_vec.fragments().len());
76    ///
77    /// let vec = split_vec.to_vec();
78    /// assert_eq!(vec, &['a', 'b', 'c']);
79    ///
80    /// let mut split_vec = SplitVec::with_linear_growth(2);
81    /// for i in 0..10 {
82    ///     split_vec.push(i);
83    /// }
84    /// assert_eq!(&[0, 1, 2, 3], split_vec.fragments()[0].as_slice());
85    /// assert_eq!(&[4, 5, 6, 7], split_vec.fragments()[1].as_slice());
86    /// assert_eq!(&[8, 9], split_vec.fragments()[2].as_slice());
87    ///
88    /// let vec = split_vec.to_vec();
89    /// assert_eq!(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], vec.as_slice());
90    /// ```
91    pub fn to_vec(self) -> Vec<T> {
92        self.into()
93    }
94}
95
96#[cfg(test)]
97mod tests {
98    use crate::*;
99    use alloc::vec::Vec;
100
101    #[test]
102    fn single_fragment() {
103        let mut split_vec = SplitVec::with_linear_growth(2);
104        split_vec.extend_from_slice(&['a', 'b', 'c']);
105
106        assert_eq!(1, split_vec.fragments().len());
107        let vec: Vec<_> = split_vec.into();
108        assert_eq!(vec, &['a', 'b', 'c']);
109
110        let mut split_vec = SplitVec::with_doubling_growth();
111        split_vec.extend_from_slice(&['a', 'b', 'c']);
112
113        assert_eq!(1, split_vec.fragments().len());
114        let vec: Vec<_> = split_vec.into();
115        assert_eq!(vec, &['a', 'b', 'c']);
116
117        let vec: Vec<_> = (0..1574).collect();
118        let split_vec: SplitVec<_, Recursive> = vec.into();
119
120        assert_eq!(1, split_vec.fragments().len());
121        let vec: Vec<_> = split_vec.into();
122        assert_eq!(1574, vec.len());
123        for (i, val) in vec.iter().enumerate() {
124            assert_eq!(i, *val);
125        }
126    }
127}