der/
referenced.rs
1pub trait OwnedToRef {
5 type Borrowed<'a>
7 where
8 Self: 'a;
9
10 fn owned_to_ref(&self) -> Self::Borrowed<'_>;
12}
13
14pub trait RefToOwned<'a> {
18 type Owned: OwnedToRef<Borrowed<'a> = Self>
20 where
21 Self: 'a;
22
23 fn ref_to_owned(&self) -> Self::Owned;
25}
26
27impl<T> OwnedToRef for Option<T>
28where
29 T: OwnedToRef,
30{
31 type Borrowed<'a> = Option<T::Borrowed<'a>> where T: 'a;
32
33 fn owned_to_ref(&self) -> Self::Borrowed<'_> {
34 self.as_ref().map(|o| o.owned_to_ref())
35 }
36}
37
38impl<'a, T> RefToOwned<'a> for Option<T>
39where
40 T: RefToOwned<'a> + 'a,
41 T::Owned: OwnedToRef,
42{
43 type Owned = Option<T::Owned>;
44 fn ref_to_owned(&self) -> Self::Owned {
45 self.as_ref().map(|o| o.ref_to_owned())
46 }
47}
48
49#[cfg(feature = "alloc")]
50mod 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
57 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
65 fn owned_to_ref(&self) -> Self::Borrowed<'_> {
66 self.as_ref()
67 }
68 }
69}