WIP
This commit is contained in:
@@ -2,6 +2,7 @@ pub mod collect_s;
|
||||
pub mod container;
|
||||
pub mod framable;
|
||||
pub mod isodate;
|
||||
pub mod overlap;
|
||||
pub mod scalar_ops;
|
||||
pub mod streamitem;
|
||||
pub mod subfr;
|
||||
@@ -26,12 +27,6 @@ pub trait WithLen {
|
||||
fn len(&self) -> usize;
|
||||
}
|
||||
|
||||
pub trait RangeOverlapInfo {
|
||||
fn ends_before(&self, range: &SeriesRange) -> bool;
|
||||
fn ends_after(&self, range: &SeriesRange) -> bool;
|
||||
fn starts_after(&self, range: &SeriesRange) -> bool;
|
||||
}
|
||||
|
||||
pub trait Empty {
|
||||
fn empty() -> Self;
|
||||
}
|
||||
|
||||
156
items_0/src/overlap.rs
Normal file
156
items_0/src/overlap.rs
Normal file
@@ -0,0 +1,156 @@
|
||||
use netpod::log::*;
|
||||
use netpod::range::evrange::SeriesRange;
|
||||
|
||||
pub trait HasTimestampDeque {
|
||||
fn timestamp_min(&self) -> Option<u64>;
|
||||
fn timestamp_max(&self) -> Option<u64>;
|
||||
fn pulse_min(&self) -> Option<u64>;
|
||||
fn pulse_max(&self) -> Option<u64>;
|
||||
}
|
||||
|
||||
pub trait RangeOverlapCmp {
|
||||
fn range_overlap_cmp_beg(a: u64, b: u64) -> bool;
|
||||
fn range_overlap_cmp_end(a: u64, b: u64) -> bool;
|
||||
}
|
||||
|
||||
pub trait RangeOverlapInfo {
|
||||
fn ends_before(&self, range: &SeriesRange) -> bool;
|
||||
fn ends_after(&self, range: &SeriesRange) -> bool;
|
||||
fn starts_after(&self, range: &SeriesRange) -> bool;
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! impl_range_overlap_info_events {
|
||||
($ty:ident) => {
|
||||
impl<STY> RangeOverlapInfo for $ty<STY>
|
||||
where
|
||||
STY: ScalarOps,
|
||||
{
|
||||
fn ends_before(&self, range: &SeriesRange) -> bool {
|
||||
if range.is_time() {
|
||||
if let Some(max) = HasTimestampDeque::timestamp_max(self) {
|
||||
max < range.beg_u64()
|
||||
//<Self as RangeOverlapCmp>::range_overlap_cmp_beg(max, range.beg_u64())
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else if range.is_pulse() {
|
||||
if let Some(max) = HasTimestampDeque::pulse_max(self) {
|
||||
max < range.beg_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
error!("unexpected");
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
fn ends_after(&self, range: &SeriesRange) -> bool {
|
||||
if range.is_time() {
|
||||
if let Some(max) = HasTimestampDeque::timestamp_max(self) {
|
||||
max >= range.beg_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else if range.is_pulse() {
|
||||
if let Some(max) = HasTimestampDeque::pulse_max(self) {
|
||||
max >= range.beg_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
error!("unexpected");
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fn starts_after(&self, range: &SeriesRange) -> bool {
|
||||
if range.is_time() {
|
||||
if let Some(min) = HasTimestampDeque::timestamp_min(self) {
|
||||
min >= range.end_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else if range.is_pulse() {
|
||||
if let Some(min) = HasTimestampDeque::pulse_min(self) {
|
||||
min >= range.end_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
error!("unexpected");
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! impl_range_overlap_info_bins {
|
||||
($ty:ident) => {
|
||||
impl<STY> RangeOverlapInfo for $ty<STY>
|
||||
where
|
||||
STY: ScalarOps,
|
||||
{
|
||||
fn ends_before(&self, range: &SeriesRange) -> bool {
|
||||
if range.is_time() {
|
||||
if let Some(&max) = self.ts2s.back() {
|
||||
max <= range.beg_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else if range.is_pulse() {
|
||||
// TODO for the time being, the ts represent either ts or pulse
|
||||
if let Some(&max) = self.ts2s.back() {
|
||||
max <= range.beg_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
error!("unexpected");
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
fn ends_after(&self, range: &SeriesRange) -> bool {
|
||||
if range.is_time() {
|
||||
if let Some(&max) = self.ts2s.back() {
|
||||
max > range.end_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else if range.is_pulse() {
|
||||
if let Some(&max) = self.ts2s.back() {
|
||||
max > range.end_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
error!("unexpected");
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fn starts_after(&self, range: &SeriesRange) -> bool {
|
||||
if range.is_time() {
|
||||
if let Some(&min) = self.ts1s.front() {
|
||||
min >= range.end_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else if range.is_pulse() {
|
||||
if let Some(&min) = self.ts1s.front() {
|
||||
min >= range.end_u64()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
error!("unexpected");
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
use crate::subfr::SubFrId;
|
||||
use serde::Serialize;
|
||||
use std::fmt;
|
||||
use std::ops;
|
||||
|
||||
#[allow(unused)]
|
||||
const fn is_nan_int<T>(_x: &T) -> bool {
|
||||
@@ -64,10 +65,15 @@ pub trait ScalarOps:
|
||||
{
|
||||
fn zero_b() -> Self;
|
||||
fn equal_slack(&self, rhs: &Self) -> bool;
|
||||
fn add(&mut self, rhs: &Self);
|
||||
fn div(&mut self, n: usize);
|
||||
fn find_vec_min(a: &Vec<Self>) -> Option<Self>;
|
||||
fn find_vec_max(a: &Vec<Self>) -> Option<Self>;
|
||||
fn avg_vec(a: &Vec<Self>) -> Option<Self>;
|
||||
}
|
||||
|
||||
macro_rules! impl_scalar_ops {
|
||||
($ty:ident, $zero:expr, $equal_slack:ident) => {
|
||||
($ty:ident, $zero:expr, $equal_slack:ident, $mac_add:ident, $mac_div:ident) => {
|
||||
impl ScalarOps for $ty {
|
||||
fn zero_b() -> Self {
|
||||
$zero
|
||||
@@ -76,6 +82,57 @@ macro_rules! impl_scalar_ops {
|
||||
fn equal_slack(&self, rhs: &Self) -> bool {
|
||||
$equal_slack(self, rhs)
|
||||
}
|
||||
|
||||
fn add(&mut self, rhs: &Self) {
|
||||
$mac_add!(self, rhs);
|
||||
}
|
||||
|
||||
fn div(&mut self, n: usize) {
|
||||
$mac_div!(self, n);
|
||||
}
|
||||
|
||||
fn find_vec_min(a: &Vec<Self>) -> Option<Self> {
|
||||
if a.len() == 0 {
|
||||
None
|
||||
} else {
|
||||
let mut k = &a[0];
|
||||
for (i, v) in a.iter().enumerate() {
|
||||
if *v < *k {
|
||||
k = &a[i];
|
||||
}
|
||||
}
|
||||
Some(k.clone())
|
||||
}
|
||||
}
|
||||
|
||||
fn find_vec_max(a: &Vec<Self>) -> Option<Self> {
|
||||
if a.len() == 0 {
|
||||
None
|
||||
} else {
|
||||
let mut k = &a[0];
|
||||
for (i, v) in a.iter().enumerate() {
|
||||
if *v > *k {
|
||||
k = &a[i];
|
||||
}
|
||||
}
|
||||
Some(k.clone())
|
||||
}
|
||||
}
|
||||
|
||||
fn avg_vec(a: &Vec<Self>) -> Option<Self> {
|
||||
if a.len() == 0 {
|
||||
None
|
||||
} else {
|
||||
let mut sum = Self::zero_b();
|
||||
let mut c = 0;
|
||||
for v in a.iter() {
|
||||
sum.add(v);
|
||||
c += 1;
|
||||
}
|
||||
ScalarOps::div(&mut sum, c);
|
||||
Some(sum)
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -100,15 +157,58 @@ fn equal_string(a: &String, b: &String) -> bool {
|
||||
a == b
|
||||
}
|
||||
|
||||
impl_scalar_ops!(u8, 0, equal_int);
|
||||
impl_scalar_ops!(u16, 0, equal_int);
|
||||
impl_scalar_ops!(u32, 0, equal_int);
|
||||
impl_scalar_ops!(u64, 0, equal_int);
|
||||
impl_scalar_ops!(i8, 0, equal_int);
|
||||
impl_scalar_ops!(i16, 0, equal_int);
|
||||
impl_scalar_ops!(i32, 0, equal_int);
|
||||
impl_scalar_ops!(i64, 0, equal_int);
|
||||
impl_scalar_ops!(f32, 0., equal_f32);
|
||||
impl_scalar_ops!(f64, 0., equal_f64);
|
||||
impl_scalar_ops!(bool, false, equal_bool);
|
||||
impl_scalar_ops!(String, String::new(), equal_string);
|
||||
fn add_int<T: ops::AddAssign>(a: &mut T, b: &T) {
|
||||
ops::AddAssign::add_assign(a, todo!());
|
||||
}
|
||||
|
||||
macro_rules! add_int {
|
||||
($a:expr, $b:expr) => {
|
||||
*$a += $b;
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! add_bool {
|
||||
($a:expr, $b:expr) => {
|
||||
*$a |= $b;
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! add_string {
|
||||
($a:expr, $b:expr) => {
|
||||
$a.push_str($b);
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! div_int {
|
||||
($a:expr, $b:expr) => {
|
||||
// TODO for average calculation, the accumulator must be large enough!
|
||||
// Use u64 for all ints, and f32 for all floats.
|
||||
// Therefore, the name "add" is too general.
|
||||
//*$a /= $b;
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! div_bool {
|
||||
($a:expr, $b:expr) => {
|
||||
//
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! div_string {
|
||||
($a:expr, $b:expr) => {
|
||||
//
|
||||
};
|
||||
}
|
||||
|
||||
impl_scalar_ops!(u8, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(u16, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(u32, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(u64, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(i8, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(i16, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(i32, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(i64, 0, equal_int, add_int, div_int);
|
||||
impl_scalar_ops!(f32, 0., equal_f32, add_int, div_int);
|
||||
impl_scalar_ops!(f64, 0., equal_f64, add_int, div_int);
|
||||
impl_scalar_ops!(bool, false, equal_bool, add_bool, div_bool);
|
||||
impl_scalar_ops!(String, String::new(), equal_string, add_string, div_string);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
use crate::collect_s::Collectable;
|
||||
use crate::collect_s::Collector;
|
||||
use crate::collect_s::ToJsonResult;
|
||||
use crate::overlap::RangeOverlapInfo;
|
||||
use crate::AsAnyMut;
|
||||
use crate::AsAnyRef;
|
||||
use crate::Events;
|
||||
use crate::RangeOverlapInfo;
|
||||
use crate::TypeName;
|
||||
use crate::WithLen;
|
||||
use netpod::log::*;
|
||||
|
||||
Reference in New Issue
Block a user