wl-proxy 0.1.2

Wayland connection proxy
Documentation
use std::{
    cell::Cell,
    mem,
    ops::{Deref, DerefMut},
};

#[cfg(test)]
mod tests;

pub(crate) struct Stash<T> {
    elements: Cell<Vec<T>>,
}

impl<T> Stash<T> {
    pub(crate) fn borrow(&self) -> BorrowedStash<'_, T> {
        BorrowedStash {
            cell: &self.elements,
            elements: self.elements.take(),
        }
    }
}

impl<T> Default for Stash<T> {
    fn default() -> Self {
        Self {
            elements: Default::default(),
        }
    }
}

pub(crate) struct BorrowedStash<'a, T> {
    cell: &'a Cell<Vec<T>>,
    elements: Vec<T>,
}

impl<T> Drop for BorrowedStash<'_, T> {
    fn drop(&mut self) {
        self.elements.clear();
        self.cell.set(mem::take(&mut self.elements));
    }
}

impl<T> Deref for BorrowedStash<'_, T> {
    type Target = Vec<T>;

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

impl<T> DerefMut for BorrowedStash<'_, T> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.elements
    }
}