use core::marker::PhantomData;
use core::ops::Deref;
pub struct Peri<'a, T: PeripheralType> {
inner: T,
_lifetime: PhantomData<&'a mut T>,
}
impl<'a, T: PeripheralType> Peri<'a, T> {
#[inline]
#[doc(hidden)]
pub const unsafe fn new_unchecked(inner: T) -> Self {
Self {
inner,
_lifetime: PhantomData,
}
}
pub const unsafe fn clone_unchecked(&self) -> Peri<'a, T> {
Peri::new_unchecked(self.inner)
}
pub const fn reborrow(&mut self) -> Peri<'_, T> {
unsafe { self.clone_unchecked() }
}
#[inline]
pub fn into<U>(self) -> Peri<'a, U>
where
T: Into<U>,
U: PeripheralType,
{
unsafe { Peri::new_unchecked(self.inner.into()) }
}
}
impl<'a, T: PeripheralType> Deref for Peri<'a, T> {
type Target = T;
#[inline]
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<'a, T: PeripheralType + core::fmt::Debug> core::fmt::Debug for Peri<'a, T> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.inner.fmt(f)
}
}
impl<'a, T: PeripheralType + core::fmt::Display> core::fmt::Display for Peri<'a, T> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.inner.fmt(f)
}
}
#[cfg(feature = "defmt")]
impl<'a, T: PeripheralType + defmt::Format> defmt::Format for Peri<'a, T> {
fn format(&self, fmt: defmt::Formatter) {
self.inner.format(fmt);
}
}
pub trait PeripheralType: Copy + Sized {}