use dupe::Dupe;
use crate::values::layout::vtable::AValueDyn;
use crate::values::stack_guard;
use crate::values::FrozenValue;
use crate::values::Value;
#[derive(Copy, Clone, Dupe, Debug, derive_more::Display)]
pub(crate) struct FrozenValueNotSpecial(FrozenValue);
impl FrozenValueNotSpecial {
#[inline]
pub(crate) fn new(value: FrozenValue) -> Option<FrozenValueNotSpecial> {
if value.is_str() || value.unpack_inline_int().is_some() {
None
} else {
Some(FrozenValueNotSpecial(value))
}
}
#[inline]
pub(crate) fn to_frozen_value(self) -> FrozenValue {
self.0
}
#[inline]
pub(crate) fn to_value<'v>(self) -> Value<'v> {
self.0.to_value()
}
#[inline]
fn get_ref<'v>(self) -> AValueDyn<'v> {
unsafe {
self.0
.0
.unpack_ptr_no_int_no_str_unchecked()
.unpack_header_unchecked()
.unpack()
}
}
#[inline]
pub(crate) fn equals(self, other: Value) -> crate::Result<bool> {
if self.to_value().ptr_eq(other) {
Ok(true)
} else {
self.equals_not_ptr_eq(other)
}
}
#[inline]
fn equals_not_ptr_eq(self, other: Value) -> crate::Result<bool> {
let _guard = stack_guard::stack_guard()?;
self.get_ref().equals(other)
}
}