Skip to content

Commit f2216ec

Browse files
committed
Move binarysort out of MergeState
1 parent 98c8a40 commit f2216ec

File tree

1 file changed

+36
-36
lines changed

1 file changed

+36
-36
lines changed

src/libstd/sort.rs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,16 @@ pub fn tim_sort<T: Copy Ord>(array: &[mut T]) {
172172
return;
173173
}
174174

175-
let ms = &MergeState();
176-
ms.array = array;
177-
let min_run = min_run_length(size);
178-
179175
if size < MIN_MERGE {
180176
let init_run_len = count_run_ascending(array);
181-
ms.binarysort(array, init_run_len);
177+
binarysort(array, init_run_len);
182178
return;
183179
}
184180

181+
let ms = &MergeState();
182+
ms.array = array;
183+
let min_run = min_run_length(size);
184+
185185
let mut idx = 0;
186186
let mut remaining = size;
187187
loop {
@@ -191,7 +191,7 @@ pub fn tim_sort<T: Copy Ord>(array: &[mut T]) {
191191
if run_len < min_run {
192192
let force = if remaining <= min_run {remaining} else {min_run};
193193
let slice = vec::mut_view(arr, 0, force);
194-
ms.binarysort(slice, run_len);
194+
binarysort(slice, run_len);
195195
run_len = force;
196196
}
197197

@@ -206,6 +206,36 @@ pub fn tim_sort<T: Copy Ord>(array: &[mut T]) {
206206
ms.merge_force_collapse(array);
207207
}
208208

209+
fn binarysort<T: Copy Ord>(array: &[mut T], start: uint) {
210+
let size = array.len();
211+
let mut start = start;
212+
assert start <= size;
213+
214+
if start == 0 { start += 1; }
215+
216+
while start < size {
217+
let pivot = array[start];
218+
let mut left = 0;
219+
let mut right = start;
220+
assert left <= right;
221+
222+
while left < right {
223+
let mid = (left + right) >> 1;
224+
if pivot < array[mid] {
225+
right = mid;
226+
} else {
227+
left = mid+1;
228+
}
229+
}
230+
assert left == right;
231+
let mut n = start-left;
232+
233+
copy_vec(array, left+1, array, left, n);
234+
array[left] = move pivot;
235+
start += 1;
236+
}
237+
}
238+
209239
// Reverse the order of elements in a slice, in place
210240
fn reverse_slice<T>(v: &[mut T], start: uint, end:uint) {
211241
let mut i = start;
@@ -366,36 +396,6 @@ fn MergeState<T>() -> MergeState<T> {
366396
}
367397

368398
impl<T: Copy Ord> MergeState<T> {
369-
fn binarysort(&self, array: &[mut T], start: uint) {
370-
let size = array.len();
371-
let mut start = start;
372-
assert start <= size;
373-
374-
if start == 0 { start += 1; }
375-
376-
while start < size {
377-
let pivot = array[start];
378-
let mut left = 0;
379-
let mut right = start;
380-
assert left <= right;
381-
382-
while left < right {
383-
let mid = (left + right) >> 1;
384-
if pivot < array[mid] {
385-
right = mid;
386-
} else {
387-
left = mid+1;
388-
}
389-
}
390-
assert left == right;
391-
let mut n = start-left;
392-
393-
copy_vec(array, left+1, array, left, n);
394-
array[left] = move pivot;
395-
start += 1;
396-
}
397-
}
398-
399399
fn push_run(&self, run_base: uint, run_len: uint) {
400400
let tmp = RunState{base: run_base, len: run_len};
401401
self.runs.push(tmp);

0 commit comments

Comments
 (0)