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.