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}