| // This Source Code Form is subject to the terms of the Mozilla Public |
| // License, v. 2.0. If a copy of the MPL was not distributed with this |
| // file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| #[derive(Clone, Copy, PartialEq, Eq, Debug)] |
| pub(crate) enum Discriminant { |
| Boxed, |
| Inline, |
| } |
| |
| impl Discriminant { |
| #[inline(always)] |
| pub(crate) const fn from_bit(bit: bool) -> Self { |
| if bit { |
| Self::Inline |
| } else { |
| Self::Boxed |
| } |
| } |
| |
| #[inline(always)] |
| const fn bit(self) -> u8 { |
| match self { |
| Self::Boxed => 0, |
| Self::Inline => 1, |
| } |
| } |
| } |
| |
| #[derive(Clone, Copy, Debug)] |
| pub(crate) struct Marker(u8); |
| |
| impl Marker { |
| #[inline(always)] |
| const fn assemble(discriminant: Discriminant, data: u8) -> u8 { |
| data << 1 | discriminant.bit() |
| } |
| |
| #[inline(always)] |
| pub(crate) const fn empty() -> Self { |
| Self(Self::assemble(Discriminant::Inline, 0)) |
| } |
| |
| #[inline(always)] |
| pub(crate) const fn new_inline(data: u8) -> Self { |
| debug_assert!(data < 0x80); |
| Self(Self::assemble(Discriminant::Inline, data)) |
| } |
| |
| #[inline(always)] |
| pub(crate) const fn discriminant(self) -> Discriminant { |
| Discriminant::from_bit(self.0 & 0x01 != 0) |
| } |
| |
| #[inline(always)] |
| pub(crate) const fn data(self) -> u8 { |
| self.0 >> 1 |
| } |
| |
| #[inline(always)] |
| pub(crate) fn set_data(&mut self, byte: u8) { |
| debug_assert!(byte < 0x80); |
| self.0 = Self::assemble(self.discriminant(), byte); |
| } |
| } |