diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-03-27 01:23:51 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-27 01:23:51 +0100 |
| commit | c0369c4523caecda8af40f4eb84509b42b673d85 (patch) | |
| tree | c2568402f662316d31a8d77fa2c651673190dc8f /src/libstd/sys/windows | |
| parent | f635c3757b61d1d8aefa86e1d3acdd7d4dea90f8 (diff) | |
| parent | 45416cd91a6bdc493ea62fb3f412713a0fd8e52e (diff) | |
| download | rust-c0369c4523caecda8af40f4eb84509b42b673d85.tar.gz rust-c0369c4523caecda8af40f4eb84509b42b673d85.zip | |
Rollup merge of #70048 - TyPR124:mutable_osstr, r=dtolnay
Allow obtaining &mut OsStr
```rust
impl DerefMut for OsString {...} // type Target = OsStr
impl IndexMut<RangeFull> for OsString {...} // type Output = OsStr
```
---
This change is pulled out of #69937 per @dtolnay
This implements `DerefMut for OsString` to allow obtaining a `&mut OsStr`. This also implements `IndexMut for OsString`, which is used by `DerefMut`. This pattern is the same as is used by `Deref`.
This is necessary to for methods like `make_ascii_lowercase` which need to mutate the underlying value.
Diffstat (limited to 'src/libstd/sys/windows')
| -rw-r--r-- | src/libstd/sys/windows/os_str.rs | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/libstd/sys/windows/os_str.rs b/src/libstd/sys/windows/os_str.rs index ef260f9c5d2..ff6885cb274 100644 --- a/src/libstd/sys/windows/os_str.rs +++ b/src/libstd/sys/windows/os_str.rs @@ -77,9 +77,21 @@ impl Buf { } pub fn as_slice(&self) -> &Slice { + // Safety: Slice is just a wrapper for Wtf8, + // and self.inner.as_slice() returns &Wtf8. + // Therefore, transmuting &Wtf8 to &Slice is safe. unsafe { mem::transmute(self.inner.as_slice()) } } + pub fn as_mut_slice(&mut self) -> &mut Slice { + // Safety: Slice is just a wrapper for Wtf8, + // and self.inner.as_mut_slice() returns &mut Wtf8. + // Therefore, transmuting &mut Wtf8 to &mut Slice is safe. + // Additionally, care should be taken to ensure the slice + // is always valid Wtf8. + unsafe { mem::transmute(self.inner.as_mut_slice()) } + } + pub fn into_string(self) -> Result<String, Buf> { self.inner.into_string().map_err(|buf| Buf { inner: buf }) } |
