unsafe fn merge<T, F>(v: &mut [T], mid: usize, buf: *mut T, is_less: &mut F)Examples found in repository?
crates/competitive/src/algorithm/sort.rs (lines 139-144)
118fn merge_sort<T, F>(v: &mut [T], mut is_less: F)
119where
120 F: FnMut(&T, &T) -> bool,
121{
122 let len = v.len();
123 if len <= 1 {
124 return;
125 }
126 let mut buf = Vec::with_capacity(len / 2);
127 let mut runs: Vec<Run> = vec![];
128 let mut end = len;
129 while end > 0 {
130 let start = end - 1;
131 let mut left = Run {
132 start,
133 len: end - start,
134 };
135 end = start;
136
137 while let Some(right) = runs.pop_if(|right| left.start == 0 || right.len <= left.len) {
138 unsafe {
139 merge(
140 &mut v[left.start..right.start + right.len],
141 left.len,
142 buf.as_mut_ptr(),
143 &mut is_less,
144 );
145 }
146 left = Run {
147 start: left.start,
148 len: left.len + right.len,
149 };
150 }
151 runs.push(left);
152 }
153
154 debug_assert!(runs.len() == 1 && runs[0].start == 0 && runs[0].len == len);
155
156 #[derive(Clone, Copy)]
157 struct Run {
158 start: usize,
159 len: usize,
160 }
161}