blob: b48113994a0006348f4fef60d9fe2eb816470fb9 [file] [log] [blame] [view]
# Bit-Slice Specialization
This module provides specialized implementations for `BitSlice<T, Lsb0>` and
`BitSlice<T, Msb0>`. These implementations are able to use knowledge of their
bit-ordering behavior to be faster and operate in batches.
Since true specialization is not available in the language yet, this uses the
`any::TypeId` system to detect if a type parameter is identical to a known type
and conditionally force a cast and branch. Since type identifiers are compiler
intrinsics produced during compilation, during monomorphization each branch
has its conditional replaced with a compile-time constant value. The `if true`
branch is retained, the `if false` branches are discarded, and the
monomorphization proceeds with the specialized function replacing the generic
body.
The `.coerce()` and `.coerce_mut()` methods detect whether a bit-slice with
generic type parameters matches statically-known type parameters, and return an
`Option` of a value-identical bit-slice reference with the statically-known type
parameters which can then invoke a specialization method.
Generic methods can be specialized whenever their implementation is dependent on
the `O` type parameter and the map of positions the ordering produces is
easily legible to processor instructions. Because language-level specialization
is unavailable, dispatch is only done in `bitvec` and cannot be extended to
third-party crates.
The `lsb0` and `msb0` modules should have identical symbols present. For
implementation, remember that `Lsb0` and `Msb0` orderings **are** correlated
with little-endian and big-endian byte operations!