1use core::{borrow::{Borrow, BorrowMut}, ops::{Deref, DerefMut}};
5
6pub enum Oob<'a, T: ?Sized + ToOwned> {
8 Borrowed(&'a mut T),
9 Owned(T::Owned),
10}
11
12impl<T: ?Sized + ToOwned> Deref for Oob<'_, T> {
13 type Target = T;
14
15 fn deref(&self) -> &Self::Target {
16 match self {
17 Self::Borrowed(value) => value,
18 Self::Owned(value) => value.borrow(),
19 }
20 }
21}
22
23impl<T: ?Sized + ToOwned<Owned: BorrowMut<T>>> DerefMut for Oob<'_, T> {
24 fn deref_mut(&mut self) -> &mut Self::Target {
25 match self {
26 Self::Borrowed(value) => value,
27 Self::Owned(value) => value.borrow_mut(),
28 }
29 }
30}