use crate::eventsitem::EventsItem; use crate::scalarevents::ScalarEvents; use crate::{Appendable, Clearable, PushableIndex, WithLen, WithTimestamps}; use netpod::{AggKind, HasScalarType, HasShape, ScalarType, Shape}; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] pub enum ScalarPlainEvents { U8(ScalarEvents), U16(ScalarEvents), U32(ScalarEvents), U64(ScalarEvents), I8(ScalarEvents), I16(ScalarEvents), I32(ScalarEvents), I64(ScalarEvents), F32(ScalarEvents), F64(ScalarEvents), String(ScalarEvents), } impl ScalarPlainEvents { pub fn variant_name(&self) -> String { items_proc::tycases1!(self, Self, (k), { "$id".into() }) } } impl Clearable for ScalarPlainEvents { fn clear(&mut self) { items_proc::tycases1!(self, Self, (k), { k.clear() }) } } impl Appendable for ScalarPlainEvents { fn empty_like_self(&self) -> Self { items_proc::tycases1!(self, Self, (k), { Self::$id(k.empty_like_self()) }) } fn append(&mut self, src: &Self) { items_proc::tycases1!(self, Self, (k), { match src { Self::$id(j) => k.append(j), _ => panic!(), } }) } fn append_zero(&mut self, _ts1: u64, _ts2: u64) { // TODO can this implement Appendable in a sane way? Do we need it? err::todo(); } } impl PushableIndex for ScalarPlainEvents { fn push_index(&mut self, src: &Self, ix: usize) { items_proc::tycases1!(self, Self, (k), { match src { Self::$id(j) => k.push_index(j, ix), _ => panic!(), } }) } } impl WithLen for ScalarPlainEvents { fn len(&self) -> usize { items_proc::tycases1!(self, Self, (k), { k.len() }) } } impl WithTimestamps for ScalarPlainEvents { fn ts(&self, ix: usize) -> u64 { items_proc::tycases1!(self, Self, (k), { k.ts(ix) }) } } impl HasShape for ScalarPlainEvents { fn shape(&self) -> Shape { Shape::Scalar } } impl HasScalarType for ScalarPlainEvents { fn scalar_type(&self) -> ScalarType { items_proc::tycases1!(self, Self, (k), { ScalarType::$id }) } } #[derive(Debug, Serialize, Deserialize)] pub enum PlainEvents { Scalar(ScalarPlainEvents), } impl PlainEvents { pub fn is_wave(&self) -> bool { use PlainEvents::*; match self { Scalar(_) => false, } } pub fn variant_name(&self) -> String { use PlainEvents::*; match self { Scalar(h) => format!("Scalar({})", h.variant_name()), } } pub fn x_aggregate(self, _: &AggKind) -> EventsItem { use PlainEvents::*; match self { Scalar(k) => EventsItem::Plain(PlainEvents::Scalar(k)), } } } impl Clearable for PlainEvents { fn clear(&mut self) { match self { PlainEvents::Scalar(k) => k.clear(), } } } impl Appendable for PlainEvents { fn empty_like_self(&self) -> Self { match self { Self::Scalar(k) => Self::Scalar(k.empty_like_self()), } } fn append(&mut self, src: &Self) { match self { PlainEvents::Scalar(k) => match src { Self::Scalar(j) => k.append(j), }, } } fn append_zero(&mut self, _ts1: u64, _ts2: u64) { // TODO can this implement Appendable in a sane way? Do we need it? err::todo(); } } impl PushableIndex for PlainEvents { fn push_index(&mut self, src: &Self, ix: usize) { match self { Self::Scalar(k) => match src { Self::Scalar(j) => k.push_index(j, ix), }, } } } impl WithLen for PlainEvents { fn len(&self) -> usize { use PlainEvents::*; match self { Scalar(j) => j.len(), } } } impl WithTimestamps for PlainEvents { fn ts(&self, ix: usize) -> u64 { use PlainEvents::*; match self { Scalar(j) => j.ts(ix), } } } impl HasShape for PlainEvents { fn shape(&self) -> Shape { use PlainEvents::*; match self { Scalar(h) => HasShape::shape(h), } } } impl HasScalarType for PlainEvents { fn scalar_type(&self) -> ScalarType { use PlainEvents::*; match self { Scalar(h) => h.scalar_type(), } } }