| //! Try with generics and references. |
| |
| use derive_getters::{Getters, Dissolve}; |
| |
| #[derive(Copy, Clone, PartialEq, Eq)] |
| struct ConcreteType { |
| a: u64, |
| b: i64, |
| } |
| |
| #[derive(Getters, Dissolve)] |
| struct MultiAnnotated<'a, 'b, 'c, T> { |
| v1: &'a str, |
| v2: &'b [u8], |
| v3: &'c T, |
| owned: String, |
| } |
| |
| impl<'a, 'b, 'c, T> MultiAnnotated<'a, 'b, 'c, T> { |
| pub fn new(v1: &'a str, v2: &'b [u8], v3: &'c T, owned: String) -> Self { |
| MultiAnnotated { v1, v2, v3, owned } |
| } |
| } |
| |
| #[derive(Getters, Dissolve)] |
| #[dissolve(rename = "unmake")] |
| struct PolyAnnotated<'a, 'b, 'c, T> { |
| v1: &'a str, |
| v2: &'b [u8], |
| v3: &'c T, |
| owned: String, |
| } |
| |
| impl<'a, 'b, 'c, T> PolyAnnotated<'a, 'b, 'c, T> { |
| pub fn new(v1: &'a str, v2: &'b [u8], v3: &'c T, owned: String) -> Self { |
| PolyAnnotated { v1, v2, v3, owned } |
| } |
| |
| pub fn dissolve(self) -> String { |
| self.owned |
| } |
| } |
| |
| fn main() { |
| let buffer: [u8; 12] = [88; 12]; |
| let gt = ConcreteType { a: 44, b: -100 }; |
| let ma = MultiAnnotated::new("Hi", &buffer, >, "Another".to_owned()); |
| |
| let (v1, v2, v3, owned) = ma.dissolve(); |
| assert!(v1 == "Hi"); |
| assert!(v2 == &buffer); |
| assert!(*v3 == gt); |
| assert!(owned == "Another"); |
| |
| let pa = PolyAnnotated::new("Hi", &buffer, >, "Another".to_owned()); |
| let (v1, v2, v3, owned) = pa.unmake(); |
| assert!(v1 == "Hi"); |
| assert!(v2 == &buffer); |
| assert!(*v3 == gt); |
| assert!(owned == "Another"); |
| } |
| |