add mut version
This commit is contained in:
parent
7c9bd9c81a
commit
7cbcd78645
3 changed files with 97 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
target/
|
||||
|
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal 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"
|
88
src/lib.rs
88
src/lib.rs
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue