use crate::DataType;
use serde::{Deserialize, Serialize};
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Transform {
pub transform_data_type: Option<DataType>,
pub transform_scale: Option<f64>,
pub transform_offset: Option<f64>,
#[serde(default)]
pub transform_negate: bool,
}
impl Transform {
#[inline]
pub fn is_identity_numeric(&self) -> bool {
!self.transform_negate && self.transform_scale.is_none() && self.transform_offset.is_none()
}
#[inline]
pub fn resolve_logical_datatype(&self, wire_dt: DataType) -> DataType {
self.transform_data_type.unwrap_or(wire_dt)
}
#[inline]
pub fn apply_f64(&self, x: f64) -> f64 {
let mut y = x;
if let Some(s) = self.transform_scale {
y *= s;
}
if let Some(o) = self.transform_offset {
y += o;
}
if self.transform_negate {
y = -y;
}
y
}
#[inline]
pub fn inverse_f64(&self, y: f64) -> f64 {
let mut x = y;
if self.transform_negate {
x = -x;
}
if let Some(o) = self.transform_offset {
x -= o;
}
let s = self.transform_scale.unwrap_or(1.0);
x / s
}
}