refactor(argus-core): create explicit signal and and or methods
This commit is contained in:
parent
16cbaace20
commit
4084bb738b
3 changed files with 32 additions and 11 deletions
|
|
@ -12,16 +12,16 @@ mod utils;
|
||||||
use std::ops::{Bound, RangeBounds};
|
use std::ops::{Bound, RangeBounds};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
pub use bool_ops::*;
|
|
||||||
pub use cast::*;
|
|
||||||
pub use cmp_ops::*;
|
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
pub use num_ops::*;
|
|
||||||
use num_traits::Num;
|
use num_traits::Num;
|
||||||
pub use shift_ops::*;
|
|
||||||
pub use traits::*;
|
|
||||||
use utils::intersect_bounds;
|
|
||||||
|
|
||||||
|
pub use self::bool_ops::*;
|
||||||
|
pub use self::cast::*;
|
||||||
|
pub use self::cmp_ops::*;
|
||||||
|
pub use self::num_ops::*;
|
||||||
|
pub use self::shift_ops::*;
|
||||||
|
pub use self::traits::*;
|
||||||
|
use self::utils::intersect_bounds;
|
||||||
use crate::{ArgusResult, Error};
|
use crate::{ArgusResult, Error};
|
||||||
|
|
||||||
/// A single sample of a signal.
|
/// A single sample of a signal.
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,33 @@ impl core::ops::Not for &Signal<bool> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Signal<bool> {
|
||||||
|
/// Apply logical conjunction for each sample across the two signals.
|
||||||
|
///
|
||||||
|
/// Here, the conjunction is taken at all signal points where either of the signals
|
||||||
|
/// are sampled, and where they intersect (using interpolation).
|
||||||
|
///
|
||||||
|
/// See [`Signal::sync_with_intersection`].
|
||||||
|
pub fn and(&self, other: &Self) -> Self {
|
||||||
|
apply2::<_, _, _, Linear>(self, other, |lhs, rhs| lhs && rhs)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Apply logical disjunction for each sample across the two signals.
|
||||||
|
///
|
||||||
|
/// Here, the disjunction is taken at all signal points where either of the signals
|
||||||
|
/// are sampled, and where they intersect (using interpolation).
|
||||||
|
///
|
||||||
|
/// See [`Signal::sync_with_intersection`].
|
||||||
|
pub fn or(&self, other: &Self) -> Self {
|
||||||
|
apply2::<_, _, _, Linear>(self, other, |lhs, rhs| lhs || rhs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl core::ops::BitAnd<Self> for &Signal<bool> {
|
impl core::ops::BitAnd<Self> for &Signal<bool> {
|
||||||
type Output = Signal<bool>;
|
type Output = Signal<bool>;
|
||||||
|
|
||||||
fn bitand(self, other: Self) -> Self::Output {
|
fn bitand(self, other: Self) -> Self::Output {
|
||||||
apply2::<_, _, _, Linear>(self, other, |lhs, rhs| lhs && rhs)
|
self.and(other)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -22,6 +44,6 @@ impl core::ops::BitOr<Self> for &Signal<bool> {
|
||||||
type Output = Signal<bool>;
|
type Output = Signal<bool>;
|
||||||
|
|
||||||
fn bitor(self, other: Self) -> Self::Output {
|
fn bitor(self, other: Self) -> Self::Output {
|
||||||
apply2::<_, _, _, Linear>(self, other, |lhs, rhs| lhs || rhs)
|
self.or(other)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,7 @@ where
|
||||||
|
|
||||||
// Find the first index that satisfies `t >= delta` while also checking
|
// Find the first index that satisfies `t >= delta` while also checking
|
||||||
// if we need to interpolate
|
// if we need to interpolate
|
||||||
let Some((idx, first_t)) = time_points.iter().find_position(|&t| t >= &delta)
|
let Some((idx, first_t)) = time_points.iter().find_position(|&t| t >= &delta) else {
|
||||||
else {
|
|
||||||
// Return an empty signal (we exhauseted all samples).
|
// Return an empty signal (we exhauseted all samples).
|
||||||
return Signal::Empty;
|
return Signal::Empty;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue