Skip to content

Tracking Issue for clone_from_ref #149075

@zachs18

Description

@zachs18

Feature gate: #![feature(clone_from_ref)]

This is a tracking issue for Box::clone_from_ref, Arc::clone_from_ref, and Rc::clone_from_ref. try_* and *_in functions are under this tracking issue as well as allocator_api.

Allows creating a Box<T>/Rc<T>/Arc<T> by cloning from a &T where T: CloneToUninit. Notably, these work even when T is unsized (e.g. a slice).

Public API

// alloc::boxed

impl<T: ?Sized + CloneToUninit> Box<T> {
  pub fn clone_from_ref(val: &T) -> Box<T>;

  // also under feature(allocator_api)
  pub fn try_clone_from_ref(val: &T) -> Result<Box<T>, AllocError>;
}

impl<T: ?Sized + CloneToUninit, A: Allocator> Box<T, A> {
  // also under feature(allocator_api)
  pub fn clone_from_ref_in(val: &T, alloc: A) -> Box<T, A>;
  // also under feature(allocator_api)
  pub fn try_clone_from_ref_in(val: &T, alloc: A) -> Result<Box<T, A>, AllocError>;
}

// alloc::rc

impl<T: ?Sized + CloneToUninit> Rc<T> {
  pub fn clone_from_ref(val: &T) -> Rc<T>;

  // also under feature(allocator_api)
  pub fn try_clone_from_ref(val: &T) -> Result<Rc<T>, AllocError>;
}

impl<T: ?Sized + CloneToUninit, A: Allocator> Rc<T, A> {
  // also under feature(allocator_api)
  pub fn clone_from_ref_in(val: &T, alloc: A) -> Rc<T, A>;
  // also under feature(allocator_api)
  pub fn try_clone_from_ref_in(val: &T, alloc: A) -> Result<Rc<T, A>, AllocError>;
}

// alloc::sync

impl<T: ?Sized + CloneToUninit> Arc<T> {
  pub fn clone_from_ref(val: &T) -> Arc<T>;

  // also under feature(allocator_api)
  pub fn try_clone_from_ref(val: &T) -> Result<Arc<T>, AllocError>;
}

impl<T: ?Sized + CloneToUninit, A: Allocator> Arc<T, A> {
  // also under feature(allocator_api)
  pub fn clone_from_ref_in(val: &T, alloc: A) -> Arc<T, A>;
  // also under feature(allocator_api)
  pub fn try_clone_from_ref_in(val: &T, alloc: A) -> Result<Arc<T, A>, AllocError>;
}

Steps / History

(Remember to update the S-tracking-* label when checking boxes.)

Unresolved Questions

  • None yet.

Footnotes

  1. https://std-dev-guide.rust-lang.org/feature-lifecycle/stabilization.html

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCS-tracking-unimplementedStatus: The feature has not been implemented.T-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions