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}