#[derive(Clone, Copy, Debug, Default)]
pub struct ForwardFlags(u8);
#[allow(dead_code, reason = "API Completeness")]
impl ForwardFlags {
const EXHAUSTED: u8 = 1 << 0;
const INITIALIZED: u8 = 1 << 1;
const EMIT_EQUAL: u8 = 1 << 2;
const NEEDS_DUPLICATE_CHECK: u8 = 1 << 3;
const SINGLE_LAYER_MODE: u8 = 1 << 4;
#[inline(always)]
pub const fn new() -> Self {
Self(0)
}
#[inline(always)]
pub const fn with_values(emit_equal: bool, single_layer_mode: bool) -> Self {
let mut bits: u8 = 0;
if emit_equal {
bits |= Self::EMIT_EQUAL;
}
if single_layer_mode {
bits |= Self::SINGLE_LAYER_MODE;
}
Self(bits)
}
#[inline(always)]
pub const fn exhausted(self) -> bool {
self.0 & Self::EXHAUSTED != 0
}
#[inline(always)]
pub const fn initialized(self) -> bool {
self.0 & Self::INITIALIZED != 0
}
#[inline(always)]
pub const fn emit_equal(self) -> bool {
self.0 & Self::EMIT_EQUAL != 0
}
#[inline(always)]
pub const fn needs_duplicate_check(self) -> bool {
self.0 & Self::NEEDS_DUPLICATE_CHECK != 0
}
#[inline(always)]
pub const fn single_layer_mode(self) -> bool {
self.0 & Self::SINGLE_LAYER_MODE != 0
}
#[inline(always)]
pub const fn set_exhausted(&mut self, value: bool) {
if value {
self.0 |= Self::EXHAUSTED;
} else {
self.0 &= !Self::EXHAUSTED;
}
}
#[inline(always)]
pub const fn set_initialized(&mut self, value: bool) {
if value {
self.0 |= Self::INITIALIZED;
} else {
self.0 &= !Self::INITIALIZED;
}
}
#[inline(always)]
pub const fn mark_exhausted(&mut self) {
self.0 |= Self::EXHAUSTED;
}
#[inline(always)]
pub const fn mark_initialized(&mut self) {
self.0 |= Self::INITIALIZED;
}
#[inline(always)]
pub const fn clear_duplicate_check(&mut self) {
self.0 &= !Self::NEEDS_DUPLICATE_CHECK;
}
#[inline(always)]
pub const fn require_duplicate_check(&mut self) {
self.0 |= Self::NEEDS_DUPLICATE_CHECK;
}
#[inline(always)]
pub const fn disable_single_layer_mode(&mut self) {
self.0 &= !Self::SINGLE_LAYER_MODE;
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct ReverseFlags(u8);
#[allow(dead_code, reason = "API Completeness")]
impl ReverseFlags {
const EXHAUSTED: u8 = 1 << 0;
const INITIALIZED: u8 = 1 << 1;
const EMIT_EQUAL: u8 = 1 << 2;
const NEEDS_DUPLICATE_CHECK: u8 = 1 << 3;
const UPPER_BOUND: u8 = 1 << 4;
#[inline(always)]
pub const fn new() -> Self {
Self(0)
}
#[inline(always)]
pub const fn with_values(emit_equal: bool) -> Self {
let mut bits: u8 = 0;
if emit_equal {
bits |= Self::EMIT_EQUAL;
}
Self(bits)
}
#[inline(always)]
pub const fn exhausted(self) -> bool {
self.0 & Self::EXHAUSTED != 0
}
#[inline(always)]
pub const fn initialized(self) -> bool {
self.0 & Self::INITIALIZED != 0
}
#[inline(always)]
pub const fn emit_equal(self) -> bool {
self.0 & Self::EMIT_EQUAL != 0
}
#[inline(always)]
pub const fn needs_duplicate_check(self) -> bool {
self.0 & Self::NEEDS_DUPLICATE_CHECK != 0
}
#[inline(always)]
pub const fn upper_bound(self) -> bool {
self.0 & Self::UPPER_BOUND != 0
}
#[inline(always)]
pub const fn set_exhausted(&mut self, value: bool) {
if value {
self.0 |= Self::EXHAUSTED;
} else {
self.0 &= !Self::EXHAUSTED;
}
}
#[inline(always)]
pub const fn set_initialized(&mut self, value: bool) {
if value {
self.0 |= Self::INITIALIZED;
} else {
self.0 &= !Self::INITIALIZED;
}
}
#[inline(always)]
pub const fn mark_exhausted(&mut self) {
self.0 |= Self::EXHAUSTED;
}
#[inline(always)]
pub const fn mark_initialized(&mut self) {
self.0 |= Self::INITIALIZED;
}
#[inline(always)]
pub const fn clear_duplicate_check(&mut self) {
self.0 &= !Self::NEEDS_DUPLICATE_CHECK;
}
#[inline(always)]
pub const fn require_duplicate_check(&mut self) {
self.0 |= Self::NEEDS_DUPLICATE_CHECK;
}
#[inline(always)]
pub const fn set_upper_bound(&mut self) {
self.0 |= Self::UPPER_BOUND;
}
#[inline(always)]
pub const fn clear_upper_bound(&mut self) {
self.0 &= !Self::UPPER_BOUND;
}
}