#![deny(missing_docs)]
extern crate clone_fields_derive;
pub use clone_fields_derive::*;
pub trait CloneInto<T> {
fn clone_into(&self) -> T;
}
pub trait CloneFrom<T> {
fn clone_from(other: &T) -> Self;
}
impl<T1, T2> CloneInto<T1> for T2
where
T1: CloneFrom<T2>,
{
fn clone_into(&self) -> T1 {
T1::clone_from(self)
}
}
impl<T: Clone> CloneFrom<T> for T {
fn clone_from(other: &T) -> T {
Clone::clone(other)
}
}
#[cfg(test)]
mod test {
use super::*;
#[derive(Debug, PartialEq, Clone, CloneFields, MoveFields)]
#[destinations("another::S2")]
struct S1<'a, T: Clone> {
field1: &'a i64,
field2: T,
field3: Inner1,
}
mod another {
use super::*;
#[derive(Debug)]
pub struct S2<'a, T: Clone> {
pub field1: &'a i64,
pub field2: T,
pub field3: Inner2,
}
}
impl<'a, T> PartialEq<another::S2<'a, T>> for S1<'a, T>
where
T: PartialEq + Clone,
{
fn eq(&self, other: &another::S2<'a, T>) -> bool {
self.field1 == other.field1
&& self.field2 == other.field2
&& self.field3 == other.field3
}
}
#[derive(Debug, PartialEq, Clone, CloneFields, MoveFields)]
#[destinations("Inner2")]
struct Inner1 {
x: i32,
}
#[derive(Debug, PartialEq)]
pub struct Inner2 {
x: i32,
}
impl PartialEq<Inner2> for Inner1 {
fn eq(&self, other: &Inner2) -> bool {
self.x == other.x
}
}
#[test]
fn check_clone() {
let original = S1 {
field1: &10,
field2: "lol".to_string(),
field3: Inner1 { x: 15 },
};
let cloned: another::S2<_> = CloneInto::clone_into(&original);
assert_eq!(original, cloned);
let double_cloned: S1<_> = CloneFrom::clone_from(&cloned);
assert_eq!(original, double_cloned)
}
#[test]
fn check_move() {
let reference = S1 {
field1: &10,
field2: "lol".to_string(),
field3: Inner1 { x: 15 },
};
let original: S1<_> = reference.clone(); let moved: another::S2<_> = Into::into(original);
assert_eq!(reference, moved);
let move_back: S1<_> = From::from(moved);
assert_eq!(reference, move_back);
}
}