| # Element Encoder Macro |
| |
| This macro is invoked by `__encode_bits!` with a set of bits that exactly fills |
| some `BitStore` element type. It is responsible for encoding those bits into the |
| raw memory bytes and assembling them into a whole integer. |
| |
| It works by inspecting the `$order` argument. If it is one of `LocalBits`, |
| `Lsb0`, or `Msb0`, then it can do the construction in-place, and get solved |
| during `const` evaluation. If it is any other ordering, then it emits runtime |
| code to do the translation and defers to the optimizer for evaluation. |
| |
| It divides the input into clusters of eight bit expressions, then uses the |
| `$order` argument to choose whether the bits are accumulated into a `u8` using |
| `Lsb0`, `Msb0`, or `LocalBits` ordering. The accumulated byte array is then |
| converted into an integer using the corresponding `uN::from_{b,l,n}e_bytes` |
| function in `__ty_from_bytes!`. |
| |
| Once assembled, the raw integer is changed into the requested final type. This |
| currently routes through a helper type that unifies `const fn` constructors for |
| each of the raw integer fundamentals, cells, and atomics in order to avoid |
| transmutes. |