Auto merge of #128927 - GuillaumeGomez:rollup-ei2lr0f, r=GuillaumeGomez · patricklam/verify-rust-std@b8b61e1 (original) (raw)
`@@ -178,15 +178,25 @@ impl [T] {
`
178
178
`/// This sort is stable (i.e., does not reorder equal elements) and O(n * log(n))
`
179
179
`/// worst-case.
`
180
180
`///
`
181
``
`` -
/// If T: Ord
does not implement a total order the resulting order is unspecified. All
``
182
``
`-
/// original elements will remain in the slice and any possible modifications via interior
`
183
``
`` -
/// mutability are observed in the input. Same is true if T: Ord
panics.
``
``
181
`` +
/// If the implementation of [Ord
] for T
does not implement a [total order] the resulting
``
``
182
`+
/// order of elements in the slice is unspecified. All original elements will remain in the
`
``
183
`+
/// slice and any possible modifications via interior mutability are observed in the input. Same
`
``
184
`` +
/// is true if the implementation of [Ord
] for T
panics.
``
184
185
`///
`
185
186
`/// When applicable, unstable sorting is preferred because it is generally faster than stable
`
186
187
`/// sorting and it doesn't allocate auxiliary memory. See
`
187
188
`` /// sort_unstable
. The exception are partially sorted slices, which
``
188
189
`` /// may be better served with slice::sort
.
``
189
190
`///
`
``
191
`` +
/// Sorting types that only implement [PartialOrd
] such as [f32
] and [f64
] require
``
``
192
`` +
/// additional precautions. For example, f32::NAN != f32::NAN
, which doesn't fulfill the
``
``
193
`` +
/// reflexivity requirement of [Ord
]. By using an alternative comparison function with
``
``
194
`` +
/// slice::sort_by
such as [f32::total_cmp
] or [f64::total_cmp
] that defines a [total
``
``
195
`+
/// order] users can sort slices containing floating-point values. Alternatively, if all values
`
``
196
`` +
/// in the slice are guaranteed to be in a subset for which [PartialOrd::partial_cmp
] forms a
``
``
197
`` +
/// [total order], it's possible to sort the slice with `sort_by(|a, b|
``
``
198
`` +
/// a.partial_cmp(b).unwrap())`.
``
``
199
`+
///
`
190
200
`/// # Current implementation
`
191
201
`///
`
192
202
`/// The current implementation is based on [driftsort] by Orson Peters and Lukas Bergdoll, which
`
`@@ -198,18 +208,21 @@ impl [T] {
`
198
208
`` /// handled without allocation, medium sized slices allocate self.len()
and beyond that it
``
199
209
`` /// clamps at self.len() / 2
.
``
200
210
`///
`
201
``
`` -
/// If T: Ord
does not implement a total order, the implementation may panic.
``
``
211
`+
/// # Panics
`
``
212
`+
///
`
``
213
`` +
/// May panic if the implementation of [Ord
] for T
does not implement a [total order].
``
202
214
`///
`
203
215
`/// # Examples
`
204
216
`///
`
205
217
```` /// ```
`206`
``
`-
/// let mut v = [-5, 4, 1, -3, 2];
`
``
`218`
`+
/// let mut v = [4, -5, 1, -3, 2];
`
`207`
`219`
`///
`
`208`
`220`
`/// v.sort();
`
`209`
``
`-
/// assert!(v == [-5, -3, 1, 2, 4]);
`
``
`221`
`+
/// assert_eq!(v, [-5, -3, 1, 2, 4]);
`
`210`
`222`
```` /// ```
211
223
`///
`
212
224
`/// [driftsort]: https://github.com/Voultapher/driftsort
`
``
225
`+
/// [total order]: https://en.wikipedia.org/wiki/Total_order
`
213
226
`#[cfg(not(no_global_oom_handling))]
`
214
227
`#[rustc_allow_incoherent_impl]
`
215
228
`#[stable(feature = "rust1", since = "1.0.0")]
`
`@@ -221,30 +234,19 @@ impl [T] {
`
221
234
`stable_sort(self, T::lt);
`
222
235
`}
`
223
236
``
224
``
`-
/// Sorts the slice with a comparator function, preserving initial order of equal elements.
`
``
237
`+
/// Sorts the slice with a comparison function, preserving initial order of equal elements.
`
225
238
`///
`
226
239
`/// This sort is stable (i.e., does not reorder equal elements) and O(n * log(n))
`
227
240
`/// worst-case.
`
228
241
`///
`
229
``
`-
/// The comparator function should define a total ordering for the elements in the slice. If the
`
230
``
`-
/// ordering is not total, the order of the elements is unspecified.
`
231
``
`-
///
`
232
``
`-
/// If the comparator function does not implement a total order the resulting order is
`
233
``
`-
/// unspecified. All original elements will remain in the slice and any possible modifications
`
234
``
`-
/// via interior mutability are observed in the input. Same is true if the comparator function
`
235
``
`` -
/// panics. A total order (for all a
, b
and c
):
``
``
242
`` +
/// If the comparison function compare
does not implement a [total order] the resulting order
``
``
243
`+
/// of elements in the slice is unspecified. All original elements will remain in the slice and
`
``
244
`+
/// any possible modifications via interior mutability are observed in the input. Same is true
`
``
245
`` +
/// if compare
panics.
``
236
246
`///
`
237
``
`` -
/// * total and antisymmetric: exactly one of a < b
, a == b
or a > b
is true, and
``
238
``
`` -
/// * transitive, a < b
and b < c
implies a < c
. The same must hold for both ==
and >
.
``
239
``
`-
///
`
240
``
`` -
/// For example, while [f64
] doesn't implement [Ord
] because NaN != NaN
, we can use
``
241
``
`` -
/// partial_cmp
as our sort function when we know the slice doesn't contain a NaN
.
``
242
``
`-
///
`
243
``
/// ```
244
``
`-
/// let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
`
245
``
`-
/// floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
`
246
``
`-
/// assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
`
247
``
/// ```
``
247
`` +
/// For example |a, b| (a - b).cmp(a)
is a comparison function that is neither transitive nor
``
``
248
`` +
/// reflexive nor total, a < b < c < a
with a = 1, b = 2, c = 3
. For more information and
``
``
249
`` +
/// examples see the [Ord
] documentation.
``
248
250
`///
`
249
251
`/// # Current implementation
`
250
252
`///
`
`@@ -257,21 +259,24 @@ impl [T] {
`
257
259
`` /// handled without allocation, medium sized slices allocate self.len()
and beyond that it
``
258
260
`` /// clamps at self.len() / 2
.
``
259
261
`///
`
260
``
`` -
/// If T: Ord
does not implement a total order, the implementation may panic.
``
``
262
`+
/// # Panics
`
``
263
`+
///
`
``
264
`` +
/// May panic if compare
does not implement a [total order].
``
261
265
`///
`
262
266
`/// # Examples
`
263
267
`///
`
264
268
```` /// ```
`265`
``
`-
/// let mut v = [5, 4, 1, 3, 2];
`
``
`269`
`+
/// let mut v = [4, -5, 1, -3, 2];
`
`266`
`270`
`/// v.sort_by(|a, b| a.cmp(b));
`
`267`
``
`-
/// assert!(v == [1, 2, 3, 4, 5]);
`
``
`271`
`+
/// assert_eq!(v, [-5, -3, 1, 2, 4]);
`
`268`
`272`
`///
`
`269`
`273`
`/// // reverse sorting
`
`270`
`274`
`/// v.sort_by(|a, b| b.cmp(a));
`
`271`
``
`-
/// assert!(v == [5, 4, 3, 2, 1]);
`
``
`275`
`+
/// assert_eq!(v, [4, 2, 1, -3, -5]);
`
`272`
`276`
```` /// ```
273
277
`///
`
274
278
`/// [driftsort]: https://github.com/Voultapher/driftsort
`
``
279
`+
/// [total order]: https://en.wikipedia.org/wiki/Total_order
`
275
280
`#[cfg(not(no_global_oom_handling))]
`
276
281
`#[rustc_allow_incoherent_impl]
`
277
282
`#[stable(feature = "rust1", since = "1.0.0")]
`
`@@ -288,9 +293,10 @@ impl [T] {
`
288
293
`/// This sort is stable (i.e., does not reorder equal elements) and O(m * n * log(n))
`
289
294
`/// worst-case, where the key function is O(m).
`
290
295
`///
`
291
``
`` -
/// If K: Ord
does not implement a total order the resulting order is unspecified.
``
292
``
`-
/// All original elements will remain in the slice and any possible modifications via interior
`
293
``
`` -
/// mutability are observed in the input. Same is true if K: Ord
panics.
``
``
296
`` +
/// If the implementation of [Ord
] for K
does not implement a [total order] the resulting
``
``
297
`+
/// order of elements in the slice is unspecified. All original elements will remain in the
`
``
298
`+
/// slice and any possible modifications via interior mutability are observed in the input. Same
`
``
299
`` +
/// is true if the implementation of [Ord
] for K
panics.
``
294
300
`///
`
295
301
`/// # Current implementation
`
296
302
`///
`
`@@ -303,18 +309,21 @@ impl [T] {
`
303
309
`` /// handled without allocation, medium sized slices allocate self.len()
and beyond that it
``
304
310
`` /// clamps at self.len() / 2
.
``
305
311
`///
`
306
``
`` -
/// If K: Ord
does not implement a total order, the implementation may panic.
``
``
312
`+
/// # Panics
`
``
313
`+
///
`
``
314
`` +
/// May panic if the implementation of [Ord
] for K
does not implement a [total order].
``
307
315
`///
`
308
316
`/// # Examples
`
309
317
`///
`
310
318
```` /// ```
`311`
``
`-
/// let mut v = [-5i32, 4, 1, -3, 2];
`
``
`319`
`+
/// let mut v = [4i32, -5, 1, -3, 2];
`
`312`
`320`
`///
`
`313`
`321`
`/// v.sort_by_key(|k| k.abs());
`
`314`
``
`-
/// assert!(v == [1, 2, -3, 4, -5]);
`
``
`322`
`+
/// assert_eq!(v, [1, 2, -3, 4, -5]);
`
`315`
`323`
```` /// ```
316
324
`///
`
317
325
`/// [driftsort]: https://github.com/Voultapher/driftsort
`
``
326
`+
/// [total order]: https://en.wikipedia.org/wiki/Total_order
`
318
327
`#[cfg(not(no_global_oom_handling))]
`
319
328
`#[rustc_allow_incoherent_impl]
`
320
329
`#[stable(feature = "slice_sort_by_key", since = "1.7.0")]
`
`@@ -336,9 +345,10 @@ impl [T] {
`
336
345
`/// storage to remember the results of key evaluation. The order of calls to the key function is
`
337
346
`/// unspecified and may change in future versions of the standard library.
`
338
347
`///
`
339
``
`` -
/// If K: Ord
does not implement a total order the resulting order is unspecified.
``
340
``
`-
/// All original elements will remain in the slice and any possible modifications via interior
`
341
``
`` -
/// mutability are observed in the input. Same is true if K: Ord
panics.
``
``
348
`` +
/// If the implementation of [Ord
] for K
does not implement a [total order] the resulting
``
``
349
`+
/// order of elements in the slice is unspecified. All original elements will remain in the
`
``
350
`+
/// slice and any possible modifications via interior mutability are observed in the input. Same
`
``
351
`` +
/// is true if the implementation of [Ord
] for K
panics.
``
342
352
`///
`
343
353
`/// For simple key functions (e.g., functions that are property accesses or basic operations),
`
344
354
`` /// sort_by_key
is likely to be faster.
``
`@@ -355,16 +365,22 @@ impl [T] {
`
355
365
`` /// In the worst case, the algorithm allocates temporary storage in a Vec<(K, usize)>
the
``
356
366
`/// length of the slice.
`
357
367
`///
`
``
368
`+
/// # Panics
`
``
369
`+
///
`
``
370
`` +
/// May panic if the implementation of [Ord
] for K
does not implement a [total order].
``
``
371
`+
///
`
358
372
`/// # Examples
`
359
373
`///
`
360
374
```` /// ```
`361`
``
`-
/// let mut v = [-5i32, 4, 32, -3, 2];
`
``
`375`
`+
/// let mut v = [4i32, -5, 1, -3, 2, 10];
`
`362`
`376`
`///
`
``
`377`
`+
/// // Strings are sorted by lexicographical order.
`
`363`
`378`
`/// v.sort_by_cached_key(|k| k.to_string());
`
`364`
``
`-
/// assert!(v == [-3, -5, 2, 32, 4]);
`
``
`379`
`+
/// assert_eq!(v, [-3, -5, 1, 10, 2, 4]);
`
`365`
`380`
```` /// ```
366
381
`///
`
367
382
`/// [ipnsort]: https://github.com/Voultapher/sort-research-rs/tree/main/ipnsort
`
``
383
`+
/// [total order]: https://en.wikipedia.org/wiki/Total_order
`
368
384
`#[cfg(not(no_global_oom_handling))]
`
369
385
`#[rustc_allow_incoherent_impl]
`
370
386
`#[stable(feature = "slice_sort_by_cached_key", since = "1.34.0")]
`