From: Ben Pfaff Date: Mon, 19 May 2025 15:33:38 +0000 (-0700) Subject: simplify missingvaluerange X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b86d77a01b392a082cffddcefd5a414cdc83cbf9;p=pspp simplify missingvaluerange --- diff --git a/rust/pspp/src/sys/raw.rs b/rust/pspp/src/sys/raw.rs index fe13fe3fdb..2a9113a736 100644 --- a/rust/pspp/src/sys/raw.rs +++ b/rust/pspp/src/sys/raw.rs @@ -1129,17 +1129,39 @@ where pub values: Vec>, /// Optional range of missing values. - pub range: Option>, + pub range: Option, } -#[derive(Clone)] -pub enum MissingValueRange> -where - S: Debug, -{ - In { low: Value, high: Value }, - From { low: Value }, - To { high: Value }, +#[derive(Copy, Clone)] +pub enum MissingValueRange { + In { low: f64, high: f64 }, + From { low: f64 }, + To { high: f64 }, +} + +impl MissingValueRange { + pub fn new(low: f64, high: f64) -> Self { + const LOWEST: f64 = f64::MIN.next_up(); + match (low, high) { + (f64::MIN | LOWEST, _) => Self::To { high }, + (_, f64::MAX) => Self::From { low }, + (_, _) => Self::In { low, high }, + } + } + + pub fn low(&self) -> Option { + match self { + MissingValueRange::In { low, .. } | MissingValueRange::From { low } => Some(*low), + MissingValueRange::To { .. } => None, + } + } + + pub fn high(&self) -> Option { + match self { + MissingValueRange::In { high, .. } | MissingValueRange::To { high } => Some(*high), + MissingValueRange::From { .. } => None, + } + } } impl Debug for MissingValues @@ -1218,22 +1240,9 @@ impl MissingValues { .map(|v| Value::Number(endian.parse(v))) .collect(); - const LOWEST: f64 = f64::MIN.next_up(); - let range = - range.map( - |(low, high)| match (endian.parse(low), endian.parse(high)) { - (f64::MIN | LOWEST, high) => MissingValueRange::To { - high: Value::Number(Some(high)), - }, - (low, f64::MAX) => MissingValueRange::From { - low: Value::Number(Some(low)), - }, - (low, high) => MissingValueRange::In { - low: Value::Number(Some(low)), - high: Value::Number(Some(high)), - }, - }, - ); + let range = range.map(|(low, high)| { + MissingValueRange::new(endian.parse(low), endian.parse(high)) + }); return Ok(Self { values, range }); } Ok(VarWidth::String(_)) if range.is_some() => warn(Warning::MissingValueStringRange),