about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-01-19 10:42:13 +0100
committerGitHub <noreply@github.com>2022-01-19 10:42:13 +0100
commit2a4381d8eaad4f9f0eb5a4e624e7b154640690f1 (patch)
treecd6e1a487e81f61a16e87f840e529d53d3631f43
parent5d2928f7b9eaea9c00ed7695143c0f71c5f53786 (diff)
parent06b17a21813c2869ee50cbc4c8a92a04e40d2959 (diff)
downloadrust-2a4381d8eaad4f9f0eb5a4e624e7b154640690f1.tar.gz
rust-2a4381d8eaad4f9f0eb5a4e624e7b154640690f1.zip
Rollup merge of #89621 - digama0:patch-2, r=yaahc
doc: guarantee call order for sort_by_cached_key

`slice::sort_by_cached_key` takes a caching function `f: impl FnMut(&T) -> K`, which means that the order that calls to the caching function are made is user-visible. This adds a clause to the documentation to promise the current behavior, which is that `f` is called on all elements of the slice from left to right, unless the slice has len < 2 in which case `f` is not called.

For example, this can be used to ensure that the following code is a correct way to involve the index of the element in the sort key:
```rust
let mut index = 0;
slice.sort_by_cached_key(|x| (my_key(index, x), index += 1).0);
```
-rw-r--r--library/alloc/src/slice.rs5
1 files changed, 4 insertions, 1 deletions
diff --git a/library/alloc/src/slice.rs b/library/alloc/src/slice.rs
index 8853577371a..a5c4140e313 100644
--- a/library/alloc/src/slice.rs
+++ b/library/alloc/src/slice.rs
@@ -375,7 +375,10 @@ impl<T> [T] {
 
     /// Sorts the slice with a key extraction function.
     ///
-    /// During sorting, the key function is called only once per element.
+    /// During sorting, the key function is called at most once per element, by using
+    /// temporary storage to remember the results of key evaluation.
+    /// The order of calls to the key function is unspecified and may change in future versions
+    /// of the standard library.
     ///
     /// This sort is stable (i.e., does not reorder equal elements) and *O*(*m* \* *n* + *n* \* log(*n*))
     /// worst-case, where the key function is *O*(*m*).