defaulted 0.1.3

Trait and derive macro for testing whether a value equals its default state, with per-field customization and optional serde integration
Documentation
extern crate alloc;

use alloc::borrow::Cow;
use alloc::boxed::Box;
use alloc::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
use alloc::ffi::CString;
use alloc::rc::{self, Rc};
use alloc::string::String;
use alloc::sync::{self, Arc};
use alloc::vec::Vec;

use crate::Defaulted;

// Strings

impl_defaulted_empty!(String);
impl_defaulted_empty!(CString);

// Collections

impl<T> Defaulted for Vec<T>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.is_empty()
    }
}

impl<T> Defaulted for BTreeSet<T>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.is_empty()
    }
}

impl<K, V> Defaulted for BTreeMap<K, V>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.is_empty()
    }
}

impl<T> Defaulted for BinaryHeap<T>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.is_empty()
    }
}

impl<T> Defaulted for LinkedList<T>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.is_empty()
    }
}

impl<T> Defaulted for VecDeque<T>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.is_empty()
    }
}

// Smart pointers

impl_defaulted_deref!(<T> for Box<T>);
impl_defaulted_deref!(<T> for Rc<T>);
impl_defaulted_deref!(<T> for Arc<T>);

impl<T> Defaulted for Cow<'_, T>
where
    T: Defaulted + alloc::borrow::ToOwned + ?Sized,
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        (**self).is_defaulted()
    }
}

// Weak pointers

impl<T: ?Sized> Defaulted for rc::Weak<T>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.upgrade().is_none()
    }
}

impl<T: ?Sized> Defaulted for sync::Weak<T>
{
    #[inline]
    fn is_defaulted(&self) -> bool
    {
        self.upgrade().is_none()
    }
}