1 //! A module for working with referenced data.
2 
3 /// A trait for borrowing data from an owned struct
4 pub trait OwnedToRef {
5     /// The resulting type referencing back to Self
6     type Borrowed<'a>
7     where
8         Self: 'a;
9 
10     /// Creates a new object referencing back to the self for storage
owned_to_ref(&self) -> Self::Borrowed<'_>11     fn owned_to_ref(&self) -> Self::Borrowed<'_>;
12 }
13 
14 /// A trait for cloning a referenced structure and getting owned objects
15 ///
16 /// This is the pendant to [`OwnedToRef`]
17 pub trait RefToOwned<'a> {
18     /// The resulting type after obtaining ownership.
19     type Owned: OwnedToRef<Borrowed<'a> = Self>
20     where
21         Self: 'a;
22 
23     /// Creates a new object taking ownership of the data
ref_to_owned(&self) -> Self::Owned24     fn ref_to_owned(&self) -> Self::Owned;
25 }
26 
27 impl<T> OwnedToRef for Option<T>
28 where
29     T: OwnedToRef,
30 {
31     type Borrowed<'a> = Option<T::Borrowed<'a>> where T: 'a;
32 
owned_to_ref(&self) -> Self::Borrowed<'_>33     fn owned_to_ref(&self) -> Self::Borrowed<'_> {
34         self.as_ref().map(|o| o.owned_to_ref())
35     }
36 }
37 
38 impl<'a, T> RefToOwned<'a> for Option<T>
39 where
40     T: RefToOwned<'a> + 'a,
41     T::Owned: OwnedToRef,
42 {
43     type Owned = Option<T::Owned>;
ref_to_owned(&self) -> Self::Owned44     fn ref_to_owned(&self) -> Self::Owned {
45         self.as_ref().map(|o| o.ref_to_owned())
46     }
47 }
48 
49 #[cfg(feature = "alloc")]
50 mod allocating {
51     use super::{OwnedToRef, RefToOwned};
52     use alloc::boxed::Box;
53 
54     impl<'a> RefToOwned<'a> for &'a [u8] {
55         type Owned = Box<[u8]>;
56 
ref_to_owned(&self) -> Self::Owned57         fn ref_to_owned(&self) -> Self::Owned {
58             Box::from(*self)
59         }
60     }
61 
62     impl OwnedToRef for Box<[u8]> {
63         type Borrowed<'a> = &'a [u8];
64 
owned_to_ref(&self) -> Self::Borrowed<'_>65         fn owned_to_ref(&self) -> Self::Borrowed<'_> {
66             self.as_ref()
67         }
68     }
69 }
70