// SPDX-License-Identifier: MIT OR Apache-2.0 // // Copyright (c) 2020-2022 Andre Richter //! Common device driver code. use core::{fmt, marker::PhantomData, ops}; //-------------------------------------------------------------------------------------------------- // Public Definitions //-------------------------------------------------------------------------------------------------- pub struct MMIODerefWrapper { start_addr: usize, phantom: PhantomData T>, } /// A wrapper type for usize with integrated range bound check. #[derive(Copy, Clone)] pub struct BoundedUsize(usize); //-------------------------------------------------------------------------------------------------- // Public Code //-------------------------------------------------------------------------------------------------- impl MMIODerefWrapper { /// Create an instance. pub const unsafe fn new(start_addr: usize) -> Self { Self { start_addr, phantom: PhantomData, } } } impl ops::Deref for MMIODerefWrapper { type Target = T; fn deref(&self) -> &Self::Target { unsafe { &*(self.start_addr as *const _) } } } impl BoundedUsize<{ MAX_INCLUSIVE }> { pub const MAX_INCLUSIVE: usize = MAX_INCLUSIVE; /// Creates a new instance if number <= MAX_INCLUSIVE. pub const fn new(number: usize) -> Self { assert!(number <= MAX_INCLUSIVE); Self(number) } /// Return the wrapped number. pub const fn get(self) -> usize { self.0 } } impl fmt::Display for BoundedUsize<{ MAX_INCLUSIVE }> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.0) } }