dope-net 0.11.0

The manifold runtime
Documentation
use std::mem;
use std::pin::Pin;
use std::rc::Rc;

use o3::buffer::{BlockLease, BlockPool};

pub(crate) struct WireLease {
    block: BlockLease<'static>,
    _pool: Pin<Rc<BlockPool>>,
}

impl WireLease {
    pub(crate) fn acquire(owner: Pin<Rc<BlockPool>>) -> Option<Self> {
        let block = owner.as_ref().try_acquire()?;
        let block = unsafe { mem::transmute::<BlockLease<'_>, BlockLease<'static>>(block) };
        Some(Self {
            block,
            _pool: owner,
        })
    }

    pub(crate) fn len(&self) -> usize {
        self.block.len()
    }

    pub(crate) fn is_empty(&self) -> bool {
        self.block.is_empty()
    }

    pub(crate) fn push(&mut self, byte: u8) -> bool {
        self.block.try_push(byte).is_ok()
    }

    pub(crate) fn extend_from_slice(&mut self, src: &[u8]) -> bool {
        self.block.try_extend_from_slice(src).is_ok()
    }

    pub(crate) fn as_mut_slice(&mut self) -> &mut [u8] {
        self.block.as_mut_slice()
    }

    pub(crate) fn pointer_at(&self, offset: usize) -> *const u8 {
        debug_assert!(offset <= self.block.len());
        unsafe { self.block.as_ptr().add(offset) }
    }

    pub(crate) fn consume(&mut self, amount: usize) {
        self.block.consume(amount);
    }

    pub(crate) fn truncate(&mut self, len: usize) {
        self.block.truncate(len);
    }
}