blob: 860837a7223cef9f1142f597904ae35802d8ab23 [file] [log] [blame]
Maurice Lam9c88cff2023-02-09 21:55:02 +00001//! Try with generics and references.
2
3use derive_getters::{Getters, Dissolve};
4
5#[derive(Copy, Clone, PartialEq, Eq)]
6struct ConcreteType {
7 a: u64,
8 b: i64,
9}
10
11#[derive(Getters, Dissolve)]
12struct MultiAnnotated<'a, 'b, 'c, T> {
13 v1: &'a str,
14 v2: &'b [u8],
15 v3: &'c T,
16 owned: String,
17}
18
19impl<'a, 'b, 'c, T> MultiAnnotated<'a, 'b, 'c, T> {
20 pub fn new(v1: &'a str, v2: &'b [u8], v3: &'c T, owned: String) -> Self {
21 MultiAnnotated { v1, v2, v3, owned }
22 }
23}
24
25#[derive(Getters, Dissolve)]
26#[dissolve(rename = "unmake")]
27struct PolyAnnotated<'a, 'b, 'c, T> {
28 v1: &'a str,
29 v2: &'b [u8],
30 v3: &'c T,
31 owned: String,
32}
33
34impl<'a, 'b, 'c, T> PolyAnnotated<'a, 'b, 'c, T> {
35 pub fn new(v1: &'a str, v2: &'b [u8], v3: &'c T, owned: String) -> Self {
36 PolyAnnotated { v1, v2, v3, owned }
37 }
38
39 pub fn dissolve(self) -> String {
40 self.owned
41 }
42}
43
44fn main() {
45 let buffer: [u8; 12] = [88; 12];
46 let gt = ConcreteType { a: 44, b: -100 };
47 let ma = MultiAnnotated::new("Hi", &buffer, &gt, "Another".to_owned());
48
49 let (v1, v2, v3, owned) = ma.dissolve();
50 assert!(v1 == "Hi");
51 assert!(v2 == &buffer);
52 assert!(*v3 == gt);
53 assert!(owned == "Another");
54
55 let pa = PolyAnnotated::new("Hi", &buffer, &gt, "Another".to_owned());
56 let (v1, v2, v3, owned) = pa.unmake();
57 assert!(v1 == "Hi");
58 assert!(v2 == &buffer);
59 assert!(*v3 == gt);
60 assert!(owned == "Another");
61}
62