Bit Storage Within Registers
The BitStore trait governs the processor behaviors used to interact with the
memory of a BitSlice buffer. These include both the width of the processor
register used to contain a memory element, and the load/store instructions the
processor uses to move data across the memory bus.
BitStore has no behavior of its own, and serves only to collect associated
types and constants. It cannot be implemented outside bitvec, and is a closed
portion of the API. You can freely use the trait as a bound in types that
contain bitvec structures, but should not otherwise attempt to make use of it.
Implementations
BitStore is implemented on all unsigned integer types not larger than a target
processor’s word size, all Cell<T> wrappers of them (as Cell is a compiler
directive), and their AtomicT variants.
Not all processors have atomic instructions for all their scalar registers.
bitvec uses the [radium] crate to manage its support for atomic types.
On architectures with missing atomics, bitvec’s default feature set will cause
a compiler error when you attempt to instantiate a bitvec structure with the
register that is missing an atomic variant. You can fix this by using a narrower
register that does have atomic instructions, or by disabling default-features
and not enabling the "atomic" feature.
Associated Types
The Mem associated type names the scalar integer corresponding to the
BitStore type. u8, Cell<u8>, and AtomicU8 all implement BitStore with
their Mem type assigned as u8; the same is true for the wider registers.
This type is used to create selection masks in the processor and permit access to unaliased memory.
The Access associated type names the type used to implement memory access. The
BitAccess trait is an internal bridge to Radium that allows a consistent
memory API, regardless of instructions used. All reads from and writes to memory
route through this association and trait.
Lastly, the Alias and Unalias associated types enable bitvec to gracefully
and correctly handle events that cause multiple handles to alias the same memory
address. This association is used in .split_at_mut() to select the alias-aware
type used for all subsequent accesses.
The Mem and Alias types are exposed in public APIs according to local alias
information. The Access type is never publicly exposed, and only used for code
generation.