#![doc = include_str!("../README.md")]
#![warn(missing_docs, rustdoc::broken_intra_doc_links)]
#![cfg_attr(not(test), no_std)]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg, doc_cfg_hide))]
#![cfg_attr(docsrs, doc(cfg_hide(docsrs)))]
#![cfg_attr(trace_macros, feature(trace_macros))]
use core::{convert::Infallible, fmt};
pub mod pack;
pub use self::pack::*;
mod bitfield;
#[doc = include_str!("example/example_bitfield.rs")]
#[cfg(any(test, docsrs, trace_macros))]
#[allow(missing_docs)]
pub mod example;
pub trait FromBits<B>: Sized {
type Error: fmt::Display;
const BITS: u32;
fn try_from_bits(bits: B) -> Result<Self, Self::Error>;
fn into_bits(self) -> B;
}
macro_rules! impl_frombits_for_ty {
($(impl FromBits<$($F:ty),+> for $T:ty {})+) => {
$(
$(
impl FromBits<$F> for $T {
const BITS: u32 = <$T>::BITS;
type Error = Infallible;
fn try_from_bits(f: $F) -> Result<Self, Self::Error> {
Ok(f as $T)
}
fn into_bits(self) -> $F {
self as $F
}
}
)*
)+
}
}
macro_rules! impl_frombits_for_bool {
(impl FromBits<$($F:ty),+> for bool {}) => {
$(
impl FromBits<$F> for bool {
const BITS: u32 = 1;
type Error = Infallible;
fn try_from_bits(f: $F) -> Result<Self, Self::Error> {
Ok(if f == 0 { false } else { true })
}
fn into_bits(self) -> $F {
if self {
1
} else {
0
}
}
}
)+
}
}
impl_frombits_for_bool! {
impl FromBits<u8, u16, u32, u64, usize> for bool {}
}
impl_frombits_for_ty! {
impl FromBits<u8, u16, u32, u64> for u8 {}
impl FromBits<u16, u32, u64> for u16 {}
impl FromBits<u32, u64> for u32 {}
impl FromBits<u64> for u64 {}
impl FromBits<u8, u16, u32, u64> for i8 {}
impl FromBits<u16, u32, u64> for i16 {}
impl FromBits<u32, u64> for i32 {}
impl FromBits<u64> for i64 {}
impl FromBits<usize> for u8 {}
impl FromBits<usize> for i8 {}
impl FromBits<usize> for u16 {}
impl FromBits<usize> for i16 {}
impl FromBits<usize> for usize {}
impl FromBits<usize> for isize {}
}
#[cfg(target_pointer_width = "16")]
impl_frombits_for_ty! {
impl FromBits<u16, u32, u64> for usize {}
impl FromBits<u16, u32, u64> for isize {}
}
#[cfg(target_pointer_width = "32")]
impl_frombits_for_ty! {
impl FromBits<u32, u64> for usize {}
impl FromBits<u32, u64> for isize {}
impl FromBits<usize> for u32 {}
impl FromBits<usize> for i32 {}
}
#[cfg(target_pointer_width = "64")]
impl_frombits_for_ty! {
impl FromBits<u64> for usize {}
impl FromBits<u64> for isize {}
impl FromBits<usize> for u32 {}
impl FromBits<usize> for i32 {}
impl FromBits<usize> for u64 {}
impl FromBits<usize> for i64 {}
}