- [thread_local](thread-local.md)
- [thread_local_internals](thread-local-internals.md)
- [thread_local_state](thread-local-state.md)
+- [toowned_clone_into](toowned-clone-into.md)
- [trace_macros](trace-macros.md)
- [trusted_len](trusted-len.md)
- [try_from](try-from.md)
--- /dev/null
+# `toowned_clone_into`
+
+The tracking issue for this feature is: [#41263]
+
+[#41263]: https://github.com/rust-lang/rust/issues/41263
+
+------------------------
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
fn to_owned(&self) -> Self::Owned;
+
+ /// Uses borrowed data to replace owned data, usually by cloning.
+ ///
+ /// This is borrow-generalized version of `Clone::clone_from`.
+ ///
+ /// # Examples
+ ///
+ /// Basic usage:
+ ///
+ /// ```
+ /// # #![feature(toowned_clone_into)]
+ /// let mut s: String = String::new();
+ /// "hello".clone_into(&mut s);
+ ///
+ /// let mut v: Vec<i32> = Vec::new();
+ /// [1, 2][..].clone_into(&mut v);
+ /// ```
+ #[unstable(feature = "toowned_clone_into",
+ reason = "recently added",
+ issue = "41263")]
+ fn clone_into(&self, target: &mut Self::Owned) {
+ *target = self.to_owned();
+ }
}
#[stable(feature = "rust1", since = "1.0.0")]
fn to_owned(&self) -> T {
self.clone()
}
+
+ fn clone_into(&self, target: &mut T) {
+ target.clone_from(self);
+ }
}
/// A clone-on-write smart pointer.
}
}
}
+
+ fn clone_from(&mut self, source: &Cow<'a, B>) {
+ if let Owned(ref mut dest) = *self {
+ if let Owned(ref o) = *source {
+ o.borrow().clone_into(dest);
+ return;
+ }
+ }
+
+ *self = source.clone();
+ }
}
impl<'a, B: ?Sized> Cow<'a, B>
fn to_owned(&self) -> Vec<T> {
panic!("not available with cfg(test)")
}
+
+ fn clone_into(&self, target: &mut Vec<T>) {
+ // drop anything in target that will not be overwritten
+ target.truncate(self.len());
+ let len = target.len();
+
+ // reuse the contained values' allocations/resources.
+ target.clone_from_slice(&self[..len]);
+
+ // target.len <= self.len due to the truncate above, so the
+ // slice here is always in-bounds.
+ target.extend_from_slice(&self[len..]);
+ }
}
////////////////////////////////////////////////////////////////////////////////
fn to_owned(&self) -> String {
unsafe { String::from_utf8_unchecked(self.as_bytes().to_owned()) }
}
+
+ fn clone_into(&self, target: &mut String) {
+ let mut b = mem::replace(target, String::new()).into_bytes();
+ self.as_bytes().clone_into(&mut b);
+ *target = unsafe { String::from_utf8_unchecked(b) }
+ }
}
/// Methods for string slices.
assert_eq!("Hi, World!", owned);
assert_eq!("Hello, World!", borrowed);
}
+
+#[test]
+fn check_cow_clone_from() {
+ let mut c1: Cow<str> = Cow::Owned(String::with_capacity(25));
+ let s: String = "hi".to_string();
+ assert!(s.capacity() < 25);
+ let c2: Cow<str> = Cow::Owned(s);
+ c1.clone_from(&c2);
+ assert!(c1.into_owned().capacity() >= 25);
+}
\ No newline at end of file
}
fn clone_from(&mut self, other: &Vec<T>) {
- // drop anything in self that will not be overwritten
- self.truncate(other.len());
- let len = self.len();
-
- // reuse the contained values' allocations/resources.
- self.clone_from_slice(&other[..len]);
-
- // self.len <= other.len due to the truncate above, so the
- // slice here is always in-bounds.
- self.extend_from_slice(&other[len..]);
+ other.as_slice().clone_into(self);
}
}