Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ACP: impl From<&mut {slice}> for Rc<{slice}> and Arc<{slice}> #424

Closed
eduardosm opened this issue Aug 10, 2024 · 3 comments
Closed

ACP: impl From<&mut {slice}> for Rc<{slice}> and Arc<{slice}> #424

eduardosm opened this issue Aug 10, 2024 · 3 comments
Labels
ACP-accepted API Change Proposal is accepted (seconded with no objections) api-change-proposal A proposal to add or alter unstable APIs in the standard libraries

Comments

@eduardosm
Copy link

Proposal

Problem statement

Sometimes, I need to build reference counted slice (e.g., Rc<str>, Rc<[u8]>, Rc<Path>... or their Arc counterparts) from a borrowed sliced. If it is an immutable borrow (e.g., &str), I can use From<&str> for Rc<str>. If it is a mutable borrow (e.g., &mut str), there is not a From<&mut str> for Rc<str>.

Motivating examples or use cases

let chr: char = ...;
let s: Rc<str> = chr.encode_utf8(&mut [0; 4]).into();

Since char::encode_utf8 returns a &mut str, it fails to compile with "the trait bound Rc<str>: From<&mut str> is not satisfied"

Solution sketch

The proposal is to add the following impls:

impl From<&mut CStr> for Rc<CStr>
impl From<&mut OsStr> for Rc<OsStr>
impl From<&mut Path> for Rc<Path>
impl From<&mut str> for Rc<str>

And their Arc counterparts.

An easy implementation would consist on coercing the mutable slice to an immutable one and leverage the existing impls, which take immutable slices, to perform the conversion.

Alternatives

The alternative right now is to manually coerce the &mut _ to &_ before creating the Rc.

let chr: char = ...;
let mut buf = [0; 4];
let s: &str = chr.encode_utf8(&mut buf);
let s: Rc<str> = s.into();

Links and related work

rust-lang/rust#128885

What happens now?

This issue contains an API change proposal (or ACP) and is part of the libs-api team feature lifecycle. Once this issue is filed, the libs-api team will review open proposals as capability becomes available. Current response times do not have a clear estimate, but may be up to several months.

Possible responses

The libs team may respond in various different ways. First, the team will consider the problem (this doesn't require any concrete solution or alternatives to have been proposed):

  • We think this problem seems worth solving, and the standard library might be the right place to solve it.
  • We think that this probably doesn't belong in the standard library.

Second, if there's a concrete solution:

  • We think this specific solution looks roughly right, approved, you or someone else should implement this. (Further review will still happen on the subsequent implementation PR.)
  • We're not sure this is the right solution, and the alternatives or other materials don't give us enough information to be sure about that. Here are some questions we have that aren't answered, or rough ideas about alternatives we'd want to see discussed.
@eduardosm eduardosm added api-change-proposal A proposal to add or alter unstable APIs in the standard libraries T-libs-api labels Aug 10, 2024
@pitaj
Copy link

pitaj commented Aug 10, 2024

Can't you just reborrow?

let s: Rc<str> = (&*chr.encode_utf8(&mut [0; 4])).into();

@eduardosm
Copy link
Author

That should work too.

@Amanieu
Copy link
Member

Amanieu commented Aug 20, 2024

We discussed this in the libs-api meeting and are happy to add these. This should also include the implementation for &mut [T] which seems to be missing from the ACP.

Considering we've had recent breakage from new trait implementations, the PR for this should probably go through a crater run.

@Amanieu Amanieu closed this as completed Aug 20, 2024
@Amanieu Amanieu added ACP-accepted API Change Proposal is accepted (seconded with no objections) and removed T-libs-api labels Aug 20, 2024
bors added a commit to rust-lang-ci/rust that referenced this issue Aug 21, 2024
Implement `From<&mut {slice}>` for `Rc/Arc<{slice}>`

ACP: rust-lang/libs-team#424

New API:

```rust
impl<T: Clone> From<&mut [T]> for Rc<[T]>
impl From<&mut str> for Rc<str>
impl From<&mut CStr> for Rc<CStr>
impl From<&mut OsStr> for Rc<OsStr>
impl From<&mut Path> for Rc<Path>

impl<T: Clone> From<&mut [T]> for Arc<[T]>
impl From<&mut str> for Arc<str>
impl From<&mut CStr> for Arc<CStr>
impl From<&mut OsStr> for Arc<OsStr>
impl From<&mut Path> for Arc<Path>
```

Since they are trait implementations, I think these are insta-stable.

As mentioned in rust-lang/libs-team#424 (comment), a crater run might be needed.
workingjubilee added a commit to workingjubilee/rustc that referenced this issue Nov 3, 2024
…lnay

Implement `From<&mut {slice}>` for `Box/Rc/Arc<{slice}>`

ACP: rust-lang/libs-team#424

New API:

```rust
impl<T: Clone> From<&mut [T]> for Box<[T]>
impl From<&mut str> for Box<str>
impl From<&mut CStr> for Box<CStr>
impl From<&mut OsStr> for Box<OsStr>
impl From<&mut Path> for Box<Path>

impl<T: Clone> From<&mut [T]> for Rc<[T]>
impl From<&mut str> for Rc<str>
impl From<&mut CStr> for Rc<CStr>
impl From<&mut OsStr> for Rc<OsStr>
impl From<&mut Path> for Rc<Path>

impl<T: Clone> From<&mut [T]> for Arc<[T]>
impl From<&mut str> for Arc<str>
impl From<&mut CStr> for Arc<CStr>
impl From<&mut OsStr> for Arc<OsStr>
impl From<&mut Path> for Arc<Path>
```

Since they are trait implementations, I think these are insta-stable.

As mentioned in rust-lang/libs-team#424 (comment), a crater run might be needed.
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this issue Nov 3, 2024
…lnay

Implement `From<&mut {slice}>` for `Box/Rc/Arc<{slice}>`

ACP: rust-lang/libs-team#424

New API:

```rust
impl<T: Clone> From<&mut [T]> for Box<[T]>
impl From<&mut str> for Box<str>
impl From<&mut CStr> for Box<CStr>
impl From<&mut OsStr> for Box<OsStr>
impl From<&mut Path> for Box<Path>

impl<T: Clone> From<&mut [T]> for Rc<[T]>
impl From<&mut str> for Rc<str>
impl From<&mut CStr> for Rc<CStr>
impl From<&mut OsStr> for Rc<OsStr>
impl From<&mut Path> for Rc<Path>

impl<T: Clone> From<&mut [T]> for Arc<[T]>
impl From<&mut str> for Arc<str>
impl From<&mut CStr> for Arc<CStr>
impl From<&mut OsStr> for Arc<OsStr>
impl From<&mut Path> for Arc<Path>
```

Since they are trait implementations, I think these are insta-stable.

As mentioned in rust-lang/libs-team#424 (comment), a crater run might be needed.
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this issue Nov 3, 2024
…lnay

Implement `From<&mut {slice}>` for `Box/Rc/Arc<{slice}>`

ACP: rust-lang/libs-team#424

New API:

```rust
impl<T: Clone> From<&mut [T]> for Box<[T]>
impl From<&mut str> for Box<str>
impl From<&mut CStr> for Box<CStr>
impl From<&mut OsStr> for Box<OsStr>
impl From<&mut Path> for Box<Path>

impl<T: Clone> From<&mut [T]> for Rc<[T]>
impl From<&mut str> for Rc<str>
impl From<&mut CStr> for Rc<CStr>
impl From<&mut OsStr> for Rc<OsStr>
impl From<&mut Path> for Rc<Path>

impl<T: Clone> From<&mut [T]> for Arc<[T]>
impl From<&mut str> for Arc<str>
impl From<&mut CStr> for Arc<CStr>
impl From<&mut OsStr> for Arc<OsStr>
impl From<&mut Path> for Arc<Path>
```

Since they are trait implementations, I think these are insta-stable.

As mentioned in rust-lang/libs-team#424 (comment), a crater run might be needed.
rust-timer added a commit to rust-lang-ci/rust that referenced this issue Nov 3, 2024
Rollup merge of rust-lang#129329 - eduardosm:rc-from-mut-slice, r=dtolnay

Implement `From<&mut {slice}>` for `Box/Rc/Arc<{slice}>`

ACP: rust-lang/libs-team#424

New API:

```rust
impl<T: Clone> From<&mut [T]> for Box<[T]>
impl From<&mut str> for Box<str>
impl From<&mut CStr> for Box<CStr>
impl From<&mut OsStr> for Box<OsStr>
impl From<&mut Path> for Box<Path>

impl<T: Clone> From<&mut [T]> for Rc<[T]>
impl From<&mut str> for Rc<str>
impl From<&mut CStr> for Rc<CStr>
impl From<&mut OsStr> for Rc<OsStr>
impl From<&mut Path> for Rc<Path>

impl<T: Clone> From<&mut [T]> for Arc<[T]>
impl From<&mut str> for Arc<str>
impl From<&mut CStr> for Arc<CStr>
impl From<&mut OsStr> for Arc<OsStr>
impl From<&mut Path> for Arc<Path>
```

Since they are trait implementations, I think these are insta-stable.

As mentioned in rust-lang/libs-team#424 (comment), a crater run might be needed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ACP-accepted API Change Proposal is accepted (seconded with no objections) api-change-proposal A proposal to add or alter unstable APIs in the standard libraries
Projects
None yet
Development

No branches or pull requests

3 participants