diff --git a/btypes_lazy/src/main/rust/btypes/src/bset.rs b/btypes_lazy/src/main/rust/btypes/src/bset.rs index b374eb142b63ca789ef1245823fde3f575ade86e..5d7771a7879e889cf5bf555b02c305c288e5e8fd 100644 --- a/btypes_lazy/src/main/rust/btypes/src/bset.rs +++ b/btypes_lazy/src/main/rust/btypes/src/bset.rs @@ -37,6 +37,10 @@ pub struct BSet<T: BObject> { transformation: Option<Box<dyn SetOp<Item = T>>>, } +impl<T: BObject> BSet<T> { + const OP_NAME: &'static str = "set"; +} + impl<T: BObject> SetOp for BSet<T> { type Item = T; @@ -50,6 +54,14 @@ impl<T: BObject> SetOp for BSet<T> { fn clone_box(&self) -> Box<dyn SetOp<Item=Self::Item>> { todo!() } + + fn get_op_name(&self) -> &str { + return BSet::<T>::OP_NAME; + } + + fn get_rhs(&self) -> Option<&Box<dyn SetOp<Item=Self::Item>>> { + return self.transformation.as_ref(); + } } impl<T: BObject> SetOpTraits for BSet<T> { diff --git a/btypes_lazy/src/main/rust/btypes/src/lazy_ops/set_ops/setops.rs b/btypes_lazy/src/main/rust/btypes/src/lazy_ops/set_ops/setops.rs index d72d55426bbe28e297419037cdbc87f3b7cb4dac..787ae5c0bef310d8d8426f39a33390acd7b97688 100644 --- a/btypes_lazy/src/main/rust/btypes/src/lazy_ops/set_ops/setops.rs +++ b/btypes_lazy/src/main/rust/btypes/src/lazy_ops/set_ops/setops.rs @@ -11,17 +11,63 @@ pub trait SetOp: SetOpTraits + Debug { fn compute(&self, lhs: &BSet<Self::Item>) -> BSet<Self::Item>; fn clone_box(&self) -> Box<dyn SetOp<Item = Self::Item>>; + fn get_op_name(&self) -> &str; + fn get_rhs(&self) -> Option<&Box<dyn SetOp<Item = Self::Item>>>; + //PartialEq - fn eq(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> bool; + fn eq_box(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> bool { + self.get_op_name().eq(other.get_op_name()) && self.get_rhs().eq(&other.get_rhs()) + } //PartialOrd - fn partial_cmp(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Option<Ordering>; + fn partial_cmp_box(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Option<Ordering> { + let mut result = self.get_op_name().partial_cmp(other.get_op_name()); + if result.is_some() { + if result.clone().unwrap().eq(&Ordering::Equal) { + result = self.get_rhs().partial_cmp(&other.get_rhs()); + } + } + return result; + } //Ord - fn cmp(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Ordering; - fn max(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Box<dyn SetOp<Item = Self::Item>>; - fn min(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Box<dyn SetOp<Item = Self::Item>>; - fn clamp(&self, min: &Box<dyn SetOp<Item = Self::Item>>, max: &Box<dyn SetOp<Item = Self::Item>>) -> Box<dyn SetOp<Item = Self::Item>>; + fn cmp_box(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Ordering { + let mut result = self.get_op_name().cmp(other.get_op_name()); + if result.eq(&Ordering::Equal) { + result = self.get_rhs().cmp(&other.get_rhs()); + } + return result; + } + fn lt(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> bool { self.cmp_box(other).eq(&Ordering::Less) } + fn le(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> bool { [Ordering::Less, Ordering::Equal].contains(&self.cmp_box(other)) } + fn gt(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> bool { self.cmp_box(other).eq(&Ordering::Greater) } + fn ge(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> bool { [Ordering::Greater, Ordering::Equal].contains(&self.cmp_box(other)) } + + fn max(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Box<dyn SetOp<Item = Self::Item>> { + match self.cmp_box(other) { + Ordering::Less => other.clone(), + Ordering::Equal => other.clone(), + Ordering::Greater => self.clone_box(), + } + } + + fn min(&self, other: &Box<dyn SetOp<Item = Self::Item>>) -> Box<dyn SetOp<Item = Self::Item>> { + match self.cmp_box(other) { + Ordering::Less => self.clone_box(), + Ordering::Equal => self.clone_box(), + Ordering::Greater => other.clone(), + } + } + + fn clamp(&self, min: &Box<dyn SetOp<Item = Self::Item>>, max: &Box<dyn SetOp<Item = Self::Item>>) -> Box<dyn SetOp<Item = Self::Item>> { + if self.lt(min) { + return min.clone() + } else if self.gt(max) { + max.clone() + } else { + self.clone_box() + } + } } pub trait SetOpTraits { @@ -49,28 +95,28 @@ impl<T: BObject> Eq for Box<dyn SetOp<Item=T>> {} impl<T: BObject> PartialEq<Self> for Box<dyn SetOp<Item=T>> { fn eq(&self, other: &Self) -> bool { - self.eq(other) + self.eq_box(other) } } impl<T: BObject> PartialOrd<Self> for Box<dyn SetOp<Item=T>> { fn partial_cmp(&self, other: &Self) -> Option<Ordering> { - self.partial_cmp(other) + self.partial_cmp_box(other) } } impl<T: BObject> Ord for Box<dyn SetOp<Item = T>> { fn cmp(&self, other: &Self) -> Ordering { - self.cmp(other) + self.cmp_box(other) } } - -impl<T: 'static + BObject> dyn SetOp<Item = T> { +/* +impl<T: 'static + BObject> Default for Box<dyn SetOp<Item = T>> { fn default() -> Box<Self> { Box::new(Identity {phantom: PhantomData}) } } - +*/ @@ -81,6 +127,10 @@ pub struct Identity<T: BObject> { phantom: PhantomData<T>, } +impl<T: BObject> Identity<T> { + const OP_NAME: &'static str = "Identity"; +} + impl<T: BObject> Debug for Identity<T> { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { write!(f, "Identity()") @@ -97,6 +147,14 @@ impl<T: 'static + BObject> SetOp for Identity<T> { fn clone_box(&self) -> Box<dyn SetOp<Item=Self::Item>> { Box::new(Identity{phantom: PhantomData}) } + + fn get_op_name(&self) -> &str { + return Identity::<T>::OP_NAME; + } + + fn get_rhs(&self) -> Option<&Box<dyn SetOp<Item=Self::Item>>> { + return Option::None; + } } impl<T: 'static + BObject> SetOpTraits for Identity<T>{} \ No newline at end of file