npsd 0.2.0

Network payload serializer / deserializer framework
Documentation

use std::sync::Arc;
use crossbeam::queue::SegQueue;

use crate::AnyBox;

#[derive(Clone, Debug)]
pub struct Stack<'a> {
    stack: Arc<SegQueue<Box<dyn AnyBox<'a> + 'a>>>,
}

impl<'a> Stack<'a> {
    pub fn new() -> Self {
        Self {
            stack: Arc::new(SegQueue::new()),
        }
    }
}

impl<'a> Stack<'a> {
    pub fn push<T: AnyBox<'a>>(&mut self, value: Box<T>) -> &'a T {
        let reference: &'a T = unsafe { &*(value.as_ref() as *const T) };
        self.stack.push(value);
        reference
    }

    pub fn push_mut<T: AnyBox<'a>>(&mut self, mut value: Box<T>) -> &'a mut T {
        let reference: &'a mut T = unsafe { &mut *(value.as_mut() as *mut T) };
        self.stack.push(value);
        reference
    }

    pub fn push_array<T: AnyBox<'a>>(&mut self, values: Box<[T]>) -> &'a [T] {
        let reference: &'a [T] = unsafe { &*(values.as_ref() as *const [T]) };
        self.stack.push(Box::new(values));
        reference
    }

    pub fn push_array_mut<T: AnyBox<'a>>(&mut self, mut values: Box<[T]>) -> &'a mut [T] {
        let reference: &'a mut [T] = unsafe { &mut *(values.as_mut() as *mut [T]) };
        self.stack.push(Box::new(values));
        reference
    }
}