1use core::ops::{Deref, DerefMut};
2use core::fmt;
3
4#[cfg(feature = "std")]
5use std::boxed::Box;
6#[cfg(all(feature = "alloc", not(feature = "std")))]
7use alloc::boxed::Box;
8#[cfg(feature = "std")]
9use std::vec::Vec;
10#[cfg(all(feature = "alloc", not(feature = "std")))]
11use alloc::vec::Vec;
12
13pub enum Managed<'a, T: 'a + ?Sized> {
32 Borrowed(&'a mut T),
34 #[cfg(any(feature = "std", feature = "alloc"))]
36 Owned(Box<T>)
37}
38
39impl<'a, T: 'a + ?Sized> fmt::Debug for Managed<'a, T>
40 where T: fmt::Debug {
41 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
42 match self {
43 &Managed::Borrowed(ref x) => write!(f, "Borrowed({:?})", x),
44 #[cfg(any(feature = "std", feature = "alloc"))]
45 &Managed::Owned(ref x) => write!(f, "Owned({:?})", x)
46 }
47 }
48}
49
50impl<'a, T: 'a + ?Sized> From<&'a mut T> for Managed<'a, T> {
51 fn from(value: &'a mut T) -> Self {
52 Managed::Borrowed(value)
53 }
54}
55
56#[cfg(any(feature = "std", feature = "alloc"))]
57impl<'a, T: ?Sized + 'a> From<Box<T>> for Managed<'a, T> {
58 fn from(value: Box<T>) -> Self {
59 Managed::Owned(value)
60 }
61}
62
63#[cfg(any(feature = "std", feature = "alloc"))]
64impl<'a, T: 'a> From<Vec<T>> for Managed<'a, [T]> {
65 fn from(value: Vec<T>) -> Self {
66 Managed::Owned(value.into_boxed_slice())
67 }
68}
69
70impl<'a, T: 'a + ?Sized> Deref for Managed<'a, T> {
71 type Target = T;
72
73 fn deref(&self) -> &Self::Target {
74 match self {
75 &Managed::Borrowed(ref value) => value,
76 #[cfg(any(feature = "std", feature = "alloc"))]
77 &Managed::Owned(ref value) => value
78 }
79 }
80}
81
82impl<'a, T: 'a + ?Sized> DerefMut for Managed<'a, T> {
83 fn deref_mut(&mut self) -> &mut Self::Target {
84 match self {
85 &mut Managed::Borrowed(ref mut value) => value,
86 #[cfg(any(feature = "std", feature = "alloc"))]
87 &mut Managed::Owned(ref mut value) => value
88 }
89 }
90}