use alloc::rc::Rc;
use alloc::vec::Vec;
use core::{
cell::{RefCell, RefMut},
fmt::Debug,
};
use zeroize::{Zeroize, Zeroizing};
pub(crate) fn usize_to_le_varint_bytes(x: usize) -> Vec<u8> {
let n = (core::mem::size_of::<usize>() * 8 - (x.leading_zeros() as usize) + 7) / 8;
let mut bytes: Vec<u8> = Vec::new();
bytes.extend_from_slice(&x.to_le_bytes()[..n]);
return bytes;
}
mod seal {
use super::{Zeroize, Zeroizing};
pub trait ZeroizingIntoInner<T> {}
impl<T: Zeroize> ZeroizingIntoInner<T> for Zeroizing<T> {}
}
pub(crate) trait ZeroizingIntoInner<T>: seal::ZeroizingIntoInner<T> {
fn into_inner(self) -> T;
}
impl<T: Zeroize> ZeroizingIntoInner<T> for Zeroizing<T> {
fn into_inner(self) -> T {
return unsafe { core::ptr::read(&**core::mem::ManuallyDrop::new(self)) };
}
}
#[derive(Debug)]
pub(crate) struct RcPtrMut<T> {
inner: Rc<RefCell<T>>,
}
impl<T> RcPtrMut<T> {
pub fn new(value: T) -> Self {
return Self {
inner: Rc::new(RefCell::new(value)),
};
}
pub fn borrow_mut(&self) -> RefMut<'_, T> {
return self.inner.borrow_mut();
}
}
impl<T: Debug> RcPtrMut<T> {
pub fn into_inner(self) -> T {
return Rc::try_unwrap(self.inner)
.expect("Failed to unwrap Backend Rc: multiple references exist")
.into_inner();
}
}
impl<T> Clone for RcPtrMut<T> {
fn clone(&self) -> Self {
return Self {
inner: self.inner.clone(),
};
}
}
impl<T> PartialEq for RcPtrMut<T> {
fn eq(&self, other: &Self) -> bool {
return Rc::ptr_eq(&self.inner, &other.inner);
}
}
impl<T> Eq for RcPtrMut<T> {}