xhci 0.9.2

A library to handle xHCI
Documentation
macro_rules! impl_debug_from_methods {
    ($name:ident {
        $($method:ident),*$(,)?
    }) => {
        impl core::fmt::Debug for $name {
            fn fmt(&self, f:&mut core::fmt::Formatter<'_>) -> core::fmt::Result{
                f.debug_struct(core::stringify!($name))
                    $(.field(core::stringify!($method), &self.$method()))*
                    .finish()
            }
        }
    };
}

macro_rules! bit_getter {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        #[doc = "Returns the"]
        #[doc = $name]
        #[doc = "bit."]
        #[must_use]
        pub fn $method(self) -> bool {
            use bit_field::BitField;
            self.0[$offset].get_bit($bit)
        }
    };
    ($bit:literal,$method:ident,$name:literal) => {
        #[doc = "Returns the"]
        #[doc = $name]
        #[doc = "bit."]
        #[must_use]
        pub fn $method(self) -> bool {
            use bit_field::BitField;
            self.0.get_bit($bit)
        }
    };
}

macro_rules! bit_modifier {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        paste::paste! {
            #[doc = "Sets the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<set_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0[$offset].set_bit($bit,true);
                self
            }

            #[doc = "Clears the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<clear_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0[$offset].set_bit($bit,false);
                self
            }
        }
    };
    ($bit:literal,$method:ident,$name:literal) => {
        paste::paste! {
            #[doc = "Sets the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<set_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0.set_bit($bit,true);
                self
            }

            #[doc = "Clears the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<clear_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0.set_bit($bit,false);
                self
            }
        }
    };
}

macro_rules! ro_bit {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        bit_getter!([$offset]($bit), $method, $name);
    };
    ($bit:literal,$method:ident,$name:literal) => {
        bit_getter!($bit, $method, $name);
    };
}

macro_rules! wo_bit {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        bit_modifier!([$offset]($bit), $method, $name);
    };
    ($bit:literal,$method:ident,$name:literal) => {
        bit_modifier!($bit, $method, $name);
    };
}

macro_rules! rw_bit {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        bit_getter!([$offset]($bit), $method, $name);
        bit_modifier!([$offset]($bit), $method, $name);
    };
    ($bit:literal,$method:ident,$name:literal) => {
        bit_getter!($bit, $method, $name);
        bit_modifier!($bit, $method, $name);
    };
}

macro_rules! rw1c_bit {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        bit_getter!([$offset]($bit), $method, $name);
        paste::paste! {
            #[doc = "Clears the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<clear_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0[$offset].set_bit($bit,true);
                self
            }

            #[doc = "Set the "]
            #[doc = $name]
            #[doc = " bit to 0, preventing the bit from being cleared on write."]
            pub fn [<set_0_ $method>](&mut self) -> &mut Self {
                use bit_field::BitField;
                self.0[$offset].set_bit($bit,false);
                self
            }
        }
    };
    ($bit:literal,$method:ident,$name:literal) => {
        bit_getter!($bit, $method, $name);
        paste::paste! {
            #[doc = "Clears the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<clear_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0.set_bit($bit,true);
                self
            }

            #[doc = "Set the "]
            #[doc = $name]
            #[doc = " bit to 0, preventing the bit from being cleared on write."]
            pub fn [<set_0_ $method>](&mut self) -> &mut Self {
                use bit_field::BitField;
                self.0.set_bit($bit,false);
                self
            }
        }
    };
}

macro_rules! w1s_bit {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        paste::paste! {
            #[doc = "Sets the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<set_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0[$offset].set_bit($bit,true);
                self
            }
        }
    };
    ($bit:literal,$method:ident,$name:literal) => {
        paste::paste! {
            #[doc = "Sets the"]
            #[doc = $name]
            #[doc = "bit."]
            pub fn [<set_ $method>](&mut self)->&mut Self{
                use bit_field::BitField;
                self.0.set_bit($bit,true);
                self
            }
        }
    };
}

macro_rules! rw1s_bit {
    ([$offset:literal]($bit:literal),$method:ident,$name:literal) => {
        bit_getter!([$offset]($bit), $method, $name);
        w1s_bit!([$offset]($bit), $method, $name);
    };
    ($bit:literal,$method:ident,$name:literal) => {
        bit_getter!($bit, $method, $name);
        w1s_bit!($bit, $method, $name);
    };
}

macro_rules! field_getter {
    ([$offset:literal]($range:expr),$method:ident,$name:literal,$ty:ty) => {
        #[doc = "Returns the value of the"]
        #[doc = $name]
        #[doc = "field."]
        #[must_use]
        pub fn $method(self) -> $ty {
            use bit_field::BitField;
            use core::convert::TryInto;
            self.0[$offset].get_bits($range).try_into().unwrap()
        }
    };
    ($range:expr,$method:ident,$name:literal,$ty:ty) => {
        #[doc = "Returns the value of the"]
        #[doc = $name]
        #[doc = "field."]
        #[must_use]
        pub fn $method(self) -> $ty {
            use bit_field::BitField;
            use core::convert::TryInto;
            self.0.get_bits($range).try_into().unwrap()
        }
    };
}

macro_rules! field_setter {
    ([$offset:literal]($range:expr),$method:ident,$name:literal,$ty:ty) => {
        paste::paste! {
            #[doc = "Sets the value of the"]
            #[doc = $name]
            #[doc = "field."]
            pub fn [<set_ $method>](&mut self,value:$ty) -> &mut Self {
                use bit_field::BitField;
                use core::convert::TryInto;
                self.0[$offset].set_bits($range,value.try_into().unwrap());
                self
            }
        }
    };
    ($range:expr,$method:ident,$name:literal,$ty:ty) => {
        paste::paste! {
            #[doc = "Sets the value of the"]
            #[doc = $name]
            #[doc = "field."]
            pub fn [<set_ $method>](&mut self,value:$ty) -> &mut Self {
                use bit_field::BitField;
                use core::convert::TryInto;
                self.0.set_bits($range,value.try_into().unwrap());
                self
            }
        }
    };
}

macro_rules! ro_field {
    ([$offset:literal]($range:expr),$method:ident,$name:literal,$ty:ty) => {
        field_getter!([$offset]($range), $method, $name, $ty);
    };
    ($range:expr,$method:ident,$name:literal,$ty:ty) => {
        field_getter!($range, $method, $name, $ty);
    };
}

macro_rules! rw_field {
    ([$offset:literal]($range:expr),$method:ident,$name:literal,$ty:ty) => {
        field_getter!([$offset]($range), $method, $name, $ty);
        field_setter!([$offset]($range), $method, $name, $ty);
    };
    ($range:expr,$method:ident,$name:literal,$ty:ty) => {
        field_getter!($range, $method, $name, $ty);
        field_setter!($range, $method, $name, $ty);
    };
}