Skip to main content

rustidy_util/
oob.rs

1//! Owned or Borrowed
2
3// Imports
4use core::{borrow::{Borrow, BorrowMut}, ops::{Deref, DerefMut}};
5
6/// Owned or Borrowed
7pub 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}