rust/library/alloc/src
Mara 232caad395
Rollup merge of #82764 - m-ou-se:map-try-insert, r=Amanieu
Add {BTreeMap,HashMap}::try_insert

`{BTreeMap,HashMap}::insert(key, new_val)` returns `Some(old_val)` if the key was already in the map. It's often useful to assert no duplicate values are inserted.

We experimented with `map.insert(key, val).unwrap_none()` (https://github.com/rust-lang/rust/issues/62633), but decided that that's not the kind of method we'd like to have on `Option`s.

`insert` always succeeds because it replaces the old value if it exists. One could argue that `insert()` is never the right method for panicking on duplicates, since already handles that case by replacing the value, only allowing you to panic after that already happened.

This PR adds a `try_insert` method that instead returns a `Result::Err` when the key already exists. This error contains both the `OccupiedEntry` and the value that was supposed to be inserted. This means that unwrapping that result gives more context:
```rust
    map.insert(10, "world").unwrap_none();
    // thread 'main' panicked at 'called `Option::unwrap_none()` on a `Some` value: "hello"', src/main.rs:8:29
```

```rust
    map.try_insert(10, "world").unwrap();
    // thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value:
    // OccupiedError { key: 10, old_value: "hello", new_value: "world" }', src/main.rs:6:33
```

It also allows handling the failure in any other way, as you have full access to the `OccupiedEntry` and the value.

`try_insert` returns a reference to the value in case of success, making it an alternative to `.entry(key).or_insert(value)`.

r? ```@Amanieu```

Fixes https://github.com/rust-lang/rfcs/issues/3092
2021-03-05 10:57:22 +01:00
..
alloc Rename AllocRef to Allocator and (de)alloc to (de)allocate 2020-12-04 14:47:15 +01:00
collections Rollup merge of #82764 - m-ou-se:map-try-insert, r=Amanieu 2021-03-05 10:57:22 +01:00
prelude mv std libs to library/ 2020-07-27 19:51:13 -05:00
raw_vec Rename AllocRef to Allocator and (de)alloc to (de)allocate 2020-12-04 14:47:15 +01:00
rc Re-stabilize Weak::as_ptr &friends for unsized T 2021-01-06 19:30:22 -05:00
sync Rollup merge of #80764 - CAD97:weak-unsized-as-ptr-again, r=RalfJung 2021-01-16 17:29:56 +00:00
vec Rollup merge of #82564 - WaffleLapkin:revert_spare_mut, r=RalfJung 2021-03-04 20:01:06 +09:00
alloc.rs move WriteCloneIntoRaw into alloc::alloc 2021-01-12 12:24:28 -08:00
borrow.rs a few more diagnostic items 2021-02-16 02:32:21 +00:00
boxed.rs Remove unnecessary lint allow attrs on example 2021-02-12 12:46:02 +03:00
fmt.rs Improve grammar in documentation of format strings 2021-01-01 23:07:35 +01:00
lib.rs Rollup merge of #80189 - jyn514:convert-primitives, r=poliorcetics 2021-03-02 21:23:12 +09:00
macros.rs Only define rustc_diagnostic_item format_macro in not(test). 2021-02-14 20:03:13 +01:00
raw_vec.rs Auto merge of #79113 - andjo403:raw_vec_ptr, r=m-ou-se 2021-01-26 02:56:37 +00:00
rc.rs Add docs for shared_from_slice From impls 2021-02-12 14:02:23 -07:00
slice.rs Convert primitives to use intra-doc links 2021-02-25 20:31:53 -05:00
str.rs Convert primitives to use intra-doc links 2021-02-25 20:31:53 -05:00
string.rs Convert primitives to use intra-doc links 2021-02-25 20:31:53 -05:00
sync.rs Add docs for shared_from_slice From impls 2021-02-12 14:02:23 -07:00
task.rs Update the bootstrap compiler 2021-02-20 17:19:30 -05:00
tests.rs mv std libs to library/ 2020-07-27 19:51:13 -05:00