add mut version

This commit is contained in:
Rowan 2025-07-06 20:12:06 -04:00
parent 7c9bd9c81a
commit 7cbcd78645
3 changed files with 97 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
target/

7
Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "maybe_owned"
version = "0.1.0"

View file

@ -1,22 +1,110 @@
use std::{
borrow::Cow,
ops::{Deref, DerefMut},
};
#[derive(Clone, Copy, Debug)]
pub enum MaybeOwned<'a, T: 'a> {
Owned(T),
Borrowed(&'a T),
}
impl<'a, T> Deref for MaybeOwned<'a, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
match self {
MaybeOwned::Owned(v) => v,
MaybeOwned::Borrowed(v) => v,
}
}
}
impl<'a, T: 'a> From<T> for MaybeOwned<'a, T> {
fn from(value: T) -> Self {
Self::Owned(value)
}
}
impl<'a, T: 'a> From<MaybeOwnedMut<'a, T>> for MaybeOwned<'a, T> {
fn from(value: MaybeOwnedMut<'a, T>) -> Self {
match value {
MaybeOwnedMut::Owned(v) => MaybeOwned::Owned(v),
MaybeOwnedMut::Borrowed(v) => MaybeOwned::Borrowed(v),
}
}
}
impl<'a, T: 'a> From<&'a T> for MaybeOwned<'a, T> {
fn from(value: &'a T) -> Self {
Self::Borrowed(value)
}
}
impl<'a, T: 'a + Clone> From<Cow<'a, T>> for MaybeOwned<'a, T> {
fn from(value: Cow<'a, T>) -> Self {
match value {
Cow::Owned(v) => MaybeOwned::Owned(v),
Cow::Borrowed(v) => MaybeOwned::Borrowed(v),
}
}
}
impl<'a, T: 'a + Default> Default for MaybeOwned<'a, T> {
fn default() -> Self {
MaybeOwned::Owned(T::default())
}
}
#[derive(Debug)]
pub enum MaybeOwnedMut<'a, T: 'a> {
Owned(T),
Borrowed(&'a mut T),
}
impl<'a, T: 'a + Clone> Clone for MaybeOwnedMut<'a, T> {
fn clone(&self) -> Self {
match self {
Self::Owned(v) => Self::Owned(v.clone()),
Self::Borrowed(v) => Self::Owned((*v).to_owned()),
}
}
}
impl<'a, T> Deref for MaybeOwnedMut<'a, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
match self {
MaybeOwnedMut::Owned(v) => v,
MaybeOwnedMut::Borrowed(v) => *v,
}
}
}
impl<'a, T> DerefMut for MaybeOwnedMut<'a, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
match self {
MaybeOwnedMut::Owned(v) => v,
MaybeOwnedMut::Borrowed(v) => *v,
}
}
}
impl<'a, T: 'a> From<T> for MaybeOwnedMut<'a, T> {
fn from(value: T) -> Self {
Self::Owned(value)
}
}
impl<'a, T: 'a> From<&'a mut T> for MaybeOwnedMut<'a, T> {
fn from(value: &'a mut T) -> Self {
Self::Borrowed(value)
}
}
impl<'a, T: 'a + Default> Default for MaybeOwnedMut<'a, T> {
fn default() -> Self {
MaybeOwnedMut::Owned(T::default())
}
}