use crate::common::bit_subset64::BitSubset64;
use super::null::Null;
pub const EXTENSION: BitSubset64 = BitSubset64::from_tag(0xFFF8_0000_0000_0000);
const EXTENSION_SPLIT: (BitSubset64, BitSubset64) = EXTENSION.split(0x0004_0000_0000_0000);
pub const SIMPLE: BitSubset64 = EXTENSION_SPLIT.0;
pub const REF: BitSubset64 = EXTENSION_SPLIT.1;
pub const SIMPLE_SPLIT: (BitSubset64, BitSubset64) = SIMPLE.split(0x0002_0000_0000_0000);
pub const BOOL: BitSubset64<bool> = SIMPLE_SPLIT.0.cast();
pub const FALSE: u64 = BOOL.raw_value_to_subset_value(false as _);
pub const TRUE: u64 = BOOL.raw_value_to_subset_value(true as _);
pub const NULL: BitSubset64<Null> = SIMPLE_SPLIT.1.cast();
pub const REF_SUBSET_SUPERPOSITION: u64 = 0xFFFF_FFFF_FFFF;
const REF_SPLIT: (BitSubset64, BitSubset64) = REF.split(0x0002_0000_0000_0000);
const STRING_OBJECT: (BitSubset64, BitSubset64) = REF_SPLIT.0.split(0x0001_0000_0000_0000);
const ARRAY_BIGINT: (BitSubset64, BitSubset64) = REF_SPLIT.1.split(0x0001_0000_0000_0000);
pub const STRING: BitSubset64 = STRING_OBJECT.0;
pub const OBJECT: BitSubset64 = STRING_OBJECT.1;
pub const ARRAY: BitSubset64 = ARRAY_BIGINT.0;
pub const BIGINT: BitSubset64 = ARRAY_BIGINT.1;
pub const REF_TYPE_STRING: u8 = 0b00;
pub const REF_TYPE_OBJECT: u8 = 0b01;
pub const REF_TYPE_ARRAY: u8 = 0b10;
pub const REF_TYPE_BIGINT: u8 = 0b11;
pub const fn ref_type(v: u64) -> u8 {
((v >> 48) & 0b11) as u8
}
#[cfg(test)]
mod test {
use crate::js::{
bitset::{BOOL, EXTENSION, FALSE, TRUE},
number::test::NAN,
};
const _: () = assert!(BOOL.has(FALSE));
const _: () = assert!(BOOL.has(TRUE));
const _: () = assert!(!BOOL.has(0));
const _: () = assert!(!BOOL.has(NAN));
const _: () = assert!(BOOL.has(EXTENSION.mask));
}