1.6 KiB
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!