borrowned 0.6.0

Borrow-or-owned values
Documentation
macro_rules! shared_impls {
    () => {
        impl<'b, T> Deref for Borrowned<'b, T> {
            type Target = T;

            fn deref(&self) -> &Self::Target {
                self.inner_ref()
            }
        }

        impl<'b, T> Borrow<T> for Borrowned<'b, T> {
            fn borrow(&self) -> &T {
                self.inner_ref()
            }
        }

        impl<'b, T> AsRef<T> for Borrowned<'b, T> {
            fn as_ref(&self) -> &T {
                self.inner_ref()
            }
        }

        impl<'b, T: Clone> Clone for Borrowned<'b, T> {
            fn clone(&self) -> Self {
                match self {
                    Borrowned::Owned(owned) => Borrowned::Owned(owned.clone()),
                    Borrowned::Borrowed(borrowed) => {
                        let borrowed = *borrowed as &T;
                        Borrowned::Owned(borrowed.clone())
                    }
                }
            }
        }

        impl<'b, T: PartialEq> PartialEq for Borrowned<'b, T> {
            fn eq(&self, other: &Self) -> bool {
                let b_self = self.inner_ref();
                let b_other = other.inner_ref();

                b_self.eq(b_other)
            }
        }

        impl<'b, T: PartialEq> PartialEq<T> for Borrowned<'b, T> {
            fn eq(&self, other: &T) -> bool {
                let b_self = self.inner_ref();

                b_self.eq(other)
            }
        }

        impl<'b, T: PartialOrd> PartialOrd for Borrowned<'b, T> {
            fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
                let b_self = self.inner_ref();
                let b_other = other.inner_ref();

                b_self.partial_cmp(b_other)
            }
        }

        impl<'b, T: PartialOrd> PartialOrd<T> for Borrowned<'b, T> {
            fn partial_cmp(&self, other: &T) -> Option<Ordering> {
                let b_self = self.inner_ref();

                b_self.partial_cmp(other)
            }
        }

        impl<'b, T: Default> Default for Borrowned<'b, T> {
            fn default() -> Self {
                Self::Owned(T::default())
            }
        }

        impl<'i, 'b, T> IntoIterator for &'i Borrowned<'b, T>
        where
            &'i T: IntoIterator,
        {
            type Item = <&'i T as IntoIterator>::Item;

            type IntoIter = <&'i T as IntoIterator>::IntoIter;

            fn into_iter(self) -> Self::IntoIter {
                self.inner_ref().into_iter()
            }
        }

        impl<'b, T: Display> Display for Borrowned<'b, T> {
            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
                self.inner_ref().fmt(f)
            }
        }
    };
}