Skip to content

Commit

Permalink
Make some direct conversions unsafe
Browse files Browse the repository at this point in the history
  • Loading branch information
Zerthox committed Jul 26, 2023
1 parent 0ff43ee commit 92e36b9
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 42 deletions.
31 changes: 17 additions & 14 deletions arcdps_evtc/src/buff/formula.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ pub struct BuffFormula {

impl BuffFormula {
/// Extracts buff information from a [`StateChange::BuffFormula`] event.
///
/// # Safety
/// This operation is safe when the [`CombatEvent`] is a valid buff formula event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
pub unsafe fn from_event(event: &CombatEvent) -> Self {
RawBuffFormula::from_event(event).into()
}

Expand Down Expand Up @@ -98,25 +101,25 @@ pub struct RawBuffFormula {

impl RawBuffFormula {
/// Extracts buff information from a [`StateChange::BuffFormula`] event.
///
/// # Safety
/// This operation is safe when the [`CombatEvent`] is a valid buff formula event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
let [kind, attr1, attr2, param1, param2, param3, trait_src, trait_self]: [f32; 8] = unsafe {
pub unsafe fn from_event(event: &CombatEvent) -> Self {
let [kind, attr1, attr2, param1, param2, param3, trait_src, trait_self]: [f32; 8] =
transmute((
event.time,
event.src_agent,
event.dst_agent,
event.value,
event.buff_dmg,
))
};
let [buff_src, buff_self]: [f32; 2] = unsafe {
transmute((
event.src_instance_id,
event.dst_instance_id,
event.src_master_instance_id,
event.dst_master_instance_id,
))
};
));
let [buff_src, buff_self]: [f32; 2] = transmute((
event.src_instance_id,
event.dst_instance_id,
event.src_master_instance_id,
event.dst_master_instance_id,
));

Self {
kind,
Expand Down Expand Up @@ -153,7 +156,7 @@ impl TryFrom<&CombatEvent> for RawBuffFormula {
#[inline]
fn try_from(event: &CombatEvent) -> Result<Self, Self::Error> {
match event.is_statechange {
StateChange::BuffFormula => Ok(Self::from_event(event)),
StateChange::BuffFormula => Ok(unsafe { Self::from_event(event) }),
_ => Err(()),
}
}
Expand Down
9 changes: 6 additions & 3 deletions arcdps_evtc/src/effect/guid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@ pub struct EffectGUID {

impl EffectGUID {
/// Extracts effect GUID information from a [`StateChange::IdToGUID`] event.
///
/// # Safety
/// This operation is safe when the [`CombatEvent`] is a valid id-to-guid event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
pub unsafe fn from_event(event: &CombatEvent) -> Self {
Self {
effect_id: event.skill_id,
guid: u128::from_be_bytes(unsafe { transmute([event.src_agent, event.dst_agent]) }),
guid: u128::from_be_bytes(transmute([event.src_agent, event.dst_agent])),
content_local: event.overstack_value.try_into().ok(),
}
}
Expand All @@ -45,7 +48,7 @@ impl TryFrom<&CombatEvent> for EffectGUID {

fn try_from(event: &CombatEvent) -> Result<Self, Self::Error> {
match event.is_statechange {
StateChange::IdToGUID => Ok(Self::from_event(event)),
StateChange::IdToGUID => Ok(unsafe { Self::from_event(event) }),
_ => Err(()),
}
}
Expand Down
15 changes: 10 additions & 5 deletions arcdps_evtc/src/effect/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,11 @@ pub struct Effect {

impl Effect {
/// Extracts effect information from an [`StateChange::Effect`] event.
///
/// # Safety
/// This operation is safe when the [`CombatEvent`] is a valid effect event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
pub unsafe fn from_event(event: &CombatEvent) -> Self {
let effect_id = event.skill_id;
let duration: u32 = unsafe {
transmute([
Expand Down Expand Up @@ -90,7 +93,7 @@ impl TryFrom<&CombatEvent> for Effect {
#[inline]
fn try_from(event: &CombatEvent) -> Result<Self, Self::Error> {
match event.is_statechange {
StateChange::Effect => Ok(Self::from_event(event)),
StateChange::Effect => Ok(unsafe { Self::from_event(event) }),
_ => Err(()),
}
}
Expand All @@ -106,13 +109,15 @@ pub enum EffectLocation {

impl EffectLocation {
/// Extracts an effect location from an effect [`CombatEvent`].
///
/// # Safety
/// This operation is safe when the [`CombatEvent`] is a valid effect event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
pub unsafe fn from_event(event: &CombatEvent) -> Self {
if event.dst_agent != 0 {
Self::Agent(event.dst_agent)
} else {
let pos: [f32; 3] =
unsafe { transmute((event.value, event.buff_dmg, event.overstack_value)) };
let pos: [f32; 3] = transmute((event.value, event.buff_dmg, event.overstack_value));
Self::Position(pos.into())
}
}
Expand Down
33 changes: 17 additions & 16 deletions arcdps_evtc/src/effect/old.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,24 @@ pub struct EffectOld {

impl EffectOld {
/// Extracts effect information from a [`StateChange::EffectOld`] event.
///
/// # Safety
/// This operation is safe when the [`CombatEvent`] is a valid effect event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
pub unsafe fn from_event(event: &CombatEvent) -> Self {
let effect_id = event.skill_id;
let [x, y]: [f32; 2] = unsafe {
transmute([
event.affinity.into(),
event.buff,
event.result,
event.is_activation.into(),
event.is_buff_remove.into(),
event.is_ninety,
event.is_fifty,
event.is_moving,
])
};
let z: f32 = unsafe { transmute([event.pad61, event.pad62, event.pad63, event.pad64]) };
let duration: u16 = unsafe { transmute([event.is_shields, event.is_off_cycle]) };
let [x, y]: [f32; 2] = transmute([
event.affinity.into(),
event.buff,
event.result,
event.is_activation.into(),
event.is_buff_remove.into(),
event.is_ninety,
event.is_fifty,
event.is_moving,
]);
let z: f32 = transmute([event.pad61, event.pad62, event.pad63, event.pad64]);
let duration: u16 = transmute([event.is_shields, event.is_off_cycle]);

Self {
effect_id,
Expand Down Expand Up @@ -73,7 +74,7 @@ impl TryFrom<&CombatEvent> for EffectOld {
#[inline]
fn try_from(event: &CombatEvent) -> Result<Self, Self::Error> {
match event.is_statechange {
StateChange::EffectOld => Ok(Self::from_event(event)),
StateChange::EffectOld => Ok(unsafe { Self::from_event(event) }),
_ => Err(()),
}
}
Expand Down
9 changes: 6 additions & 3 deletions arcdps_evtc/src/skill/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@ pub struct SkillInfo {

impl SkillInfo {
/// Extracts skill information from a [`StateChange::SkillInfo`] event.
///
/// # Safety
/// This operation is safe when the [`CombatEvent`] is a valid skill info event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
pub unsafe fn from_event(event: &CombatEvent) -> Self {
let [recharge, range0, range1, tooltip_time]: [f32; 4] =
unsafe { transmute((event.time, event.src_agent)) };
transmute((event.time, event.src_agent));
Self {
recharge,
range0,
Expand All @@ -35,7 +38,7 @@ impl TryFrom<&CombatEvent> for SkillInfo {
#[inline]
fn try_from(event: &CombatEvent) -> Result<Self, Self::Error> {
match event.is_statechange {
StateChange::SkillInfo => Ok(Self::from_event(event)),
StateChange::SkillInfo => Ok(unsafe { Self::from_event(event) }),
_ => Err(()),
}
}
Expand Down
2 changes: 1 addition & 1 deletion arcdps_evtc/src/skill/timing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pub struct SkillTiming {
}

impl SkillTiming {
/// Extracts skill timing from a [`StateChange::SkillTiminig`] event.
/// Extracts skill timing from a [`StateChange::SkillTiming`] event.
#[inline]
pub fn from_event(event: &CombatEvent) -> Self {
Self {
Expand Down

0 comments on commit 92e36b9

Please sign in to comment.