diff options
| author | bors <bors@rust-lang.org> | 2023-03-01 12:32:57 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-03-01 12:32:57 +0000 |
| commit | 5423745db8b434fcde54888b35f518f00cce00e4 (patch) | |
| tree | ba3c035908e0393161f335a5fb45f5800c801972 /compiler/rustc_parse/src | |
| parent | 64165aac68af780182ff89a6eb3982e3c262266e (diff) | |
| parent | 41da875faef58e618cafc7dfdc5f3985a58f1e98 (diff) | |
| download | rust-5423745db8b434fcde54888b35f518f00cce00e4.tar.gz rust-5423745db8b434fcde54888b35f518f00cce00e4.zip | |
Auto merge of #105871 - llogiq:option-as-slice, r=scottmcm
Add `Option::as_`(`mut_`)`slice` This adds the following functions: * `Option<T>::as_slice(&self) -> &[T]` * `Option<T>::as_mut_slice(&mut self) -> &[T]` The `as_slice` and `as_mut_slice_mut` functions benefit from an optimization that makes them completely branch-free. ~~Unfortunately, this optimization is not available on by-value Options, therefore the `into_slice` implementations use the plain `match` + `slice::from_ref` approach.~~ Note that the optimization's soundness hinges on the fact that either the niche optimization makes the offset of the `Some(_)` contents zero or the mempory layout of `Option<T>` is equal to that of `Option<MaybeUninit<T>>`. The idea has been discussed on [Zulip](https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/Option.3A.3Aas_slice). Notably the idea for the `as_slice_mut` and `into_slice“ methods came from `@cuviper` and `@Sp00ph` hardened the optimization against niche-optimized Options. The [rust playground](https://play.rust-lang.org/?version=nightly&mode=release&edition=2021&gist=74f8e4239a19f454c183aaf7b4a969e0) shows that the generated assembly of the optimized method is basically only a copy while the naive method generates code containing a `test dx, dx` on x86_64. --- EDIT from reviewer: ACP is https://github.com/rust-lang/libs-team/issues/150
Diffstat (limited to 'compiler/rustc_parse/src')
0 files changed, 0 insertions, 0 deletions
