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!