pub const RV_CONTEXT_ARGUMENTS_VOID_PTR: u64 = 1 << 0;
pub const RV_CONTEXT_STACK_TRACE: u64 = 1 << 1;
pub const RV_CONTEXT_NO_DEFAULT_CALL: u64 = 1 << 2;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct FeatureFlags {
context_stack_trace: bool,
}
impl FeatureFlags {
pub const fn set_context_stack_trace(&mut self, value: bool) {
self.context_stack_trace = value;
}
pub const fn with_context_stack_trace(mut self, value: bool) -> Self {
self.set_context_stack_trace(value);
self
}
pub const fn context_stack_trace(&self) -> bool {
self.context_stack_trace
}
pub fn from_bits(bits: u64) -> Self {
let mut flags = Self::default();
flags.set_context_stack_trace(bits & RV_CONTEXT_STACK_TRACE != 0);
flags
}
pub const fn as_bits(&self) -> u64 {
let mut bits = RV_CONTEXT_NO_DEFAULT_CALL | RV_CONTEXT_ARGUMENTS_VOID_PTR;
if self.context_stack_trace() {
bits |= RV_CONTEXT_STACK_TRACE;
}
bits
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default() {
let flags = FeatureFlags::default();
assert_eq!(
flags.as_bits(),
RV_CONTEXT_NO_DEFAULT_CALL | RV_CONTEXT_ARGUMENTS_VOID_PTR
);
}
#[test]
fn just_stack_trace() {
let mut flags = FeatureFlags::default();
flags.set_context_stack_trace(true);
assert_eq!(
flags.as_bits(),
RV_CONTEXT_NO_DEFAULT_CALL | RV_CONTEXT_STACK_TRACE | RV_CONTEXT_ARGUMENTS_VOID_PTR
);
}
}