Drop bubble_sort · qinheping/verify-rust-std@bea61da (original) (raw)

`@@ -9,7 +9,6 @@

`

9

9

`use crate::mem::{self, SizedTypeProperties};

`

10

10

`#[cfg(not(feature = "optimize_for_size"))]

`

11

11

`use crate::slice::sort::shared::pivot::choose_pivot;

`

12

``

`-

#[cfg(not(feature = "optimize_for_size"))]

`

13

12

`use crate::slice::sort::shared::smallsort::insertion_sort_shift_left;

`

14

13

`use crate::slice::sort::unstable::quicksort::partition;

`

15

14

``

`@@ -176,13 +175,7 @@ fn median_of_medians<T, F: FnMut(&T, &T) -> bool>(mut v: &mut [T], is_less: &mut

`

176

175

`loop {

`

177

176

`if v.len() <= INSERTION_SORT_THRESHOLD {

`

178

177

`if v.len() >= 2 {

`

179

``

`-

cfg_if! {

`

180

``

`-

if #[cfg(feature = "optimize_for_size")] {

`

181

``

`-

bubble_sort(v, is_less);

`

182

``

`-

} else {

`

183

``

`-

insertion_sort_shift_left(v, 1, is_less);

`

184

``

`-

}

`

185

``

`-

}

`

``

178

`+

insertion_sort_shift_left(v, 1, is_less);

`

186

179

`}

`

187

180

``

188

181

`return;

`

`@@ -314,35 +307,3 @@ fn median_idx<T, F: FnMut(&T, &T) -> bool>(

`

314

307

`}

`

315

308

` b

`

316

309

`}

`

317

``

-

318

``

`-

// It's possible to re-use the insertion sort in the smallsort module, but with optimize_for_size it

`

319

``

`-

// would clutter that module with cfg statements and make it generally harder to read and develop.

`

320

``

`-

// So to decouple things and simplify it, we use an even smaller bubble sort.

`

321

``

`-

#[cfg(feature = "optimize_for_size")]

`

322

``

`-

fn bubble_sort<T, F: FnMut(&T, &T) -> bool>(v: &mut [T], is_less: &mut F) {

`

323

``

`-

use crate::ptr;

`

324

``

-

325

``

`-

let mut n = v.len();

`

326

``

-

327

``

`-

let v_base = v.as_mut_ptr();

`

328

``

-

329

``

`-

while n > 1 {

`

330

``

`-

let loop_n = n;

`

331

``

`-

n = 0;

`

332

``

`-

for i in 1..loop_n {

`

333

``

`` -

// SAFETY: The loop construction implies that i and i - 1 will always be in-bounds.

``

334

``

`-

unsafe {

`

335

``

`` -

// Even if is_less erroneously always returns true, we are guaranteed that n

``

336

``

`` -

// reduces by one each out loop iteration, because 1..n is exclusive. This

``

337

``

`` -

// guarantees a bounded run-time should Ord be implemented incorrectly.

``

338

``

`-

let v_i = v_base.add(i);

`

339

``

`-

let v_i_minus_one = v_base.add(i - 1);

`

340

``

-

341

``

`-

if is_less(&*v_i, &*v_i_minus_one) {

`

342

``

`-

ptr::swap_nonoverlapping(v_i, v_i_minus_one, 1);

`

343

``

`-

n = i;

`

344

``

`-

}

`

345

``

`-

}

`

346

``

`-

}

`

347

``

`-

}

`

348

``

`-

}

`