use {solana_account_view::AccountView, typhoon_traits::Discriminator};
#[inline(always)]
pub fn discriminator_matches<T: Discriminator>(info: &AccountView) -> bool {
let discriminator = T::DISCRIMINATOR;
let len = discriminator.len();
let data_ptr = info.data_ptr();
unsafe {
match len {
0 => true, 1 => *data_ptr == discriminator[0],
2 => {
let data_val = (data_ptr as *const u16).read_unaligned();
let disc_val = u16::from_le_bytes([discriminator[0], discriminator[1]]);
data_val == disc_val
}
4 => {
let data_val = (data_ptr as *const u32).read_unaligned();
let disc_val = u32::from_le_bytes([
discriminator[0],
discriminator[1],
discriminator[2],
discriminator[3],
]);
data_val == disc_val
}
8 => {
let data_val = (data_ptr as *const u64).read_unaligned();
let disc_val = u64::from_le_bytes([
discriminator[0],
discriminator[1],
discriminator[2],
discriminator[3],
discriminator[4],
discriminator[5],
discriminator[6],
discriminator[7],
]);
data_val == disc_val
}
_ => {
let data = core::slice::from_raw_parts(data_ptr, len);
data == discriminator
}
}
}
}