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> {
|
pub enum MaybeOwned<'a, T: 'a> {
|
||||||
Owned(T),
|
Owned(T),
|
||||||
Borrowed(&'a 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> {
|
impl<'a, T: 'a> From<T> for MaybeOwned<'a, T> {
|
||||||
fn from(value: T) -> Self {
|
fn from(value: T) -> Self {
|
||||||
Self::Owned(value)
|
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> {
|
impl<'a, T: 'a> From<&'a T> for MaybeOwned<'a, T> {
|
||||||
fn from(value: &'a T) -> Self {
|
fn from(value: &'a T) -> Self {
|
||||||
Self::Borrowed(value)
|
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> {
|
impl<'a, T: 'a + Default> Default for MaybeOwned<'a, T> {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
MaybeOwned::Owned(T::default())
|
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