1use std::cmp::*;
2
3use crate::ring::*;
4
5pub trait OrderedRing: RingBase {
12 fn cmp(&self, lhs: &Self::Element, rhs: &Self::Element) -> Ordering;
15
16 fn abs_cmp(&self, lhs: &Self::Element, rhs: &Self::Element) -> Ordering {
19 self.cmp(&self.abs(self.clone_el(lhs)), &self.abs(self.clone_el(rhs)))
20 }
21
22 fn is_leq(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool { self.cmp(lhs, rhs) != Ordering::Greater }
24
25 fn is_geq(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool { self.cmp(lhs, rhs) != Ordering::Less }
27
28 fn is_lt(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool { self.cmp(lhs, rhs) == Ordering::Less }
30
31 fn is_gt(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool { self.cmp(lhs, rhs) == Ordering::Greater }
33
34 fn is_neg(&self, value: &Self::Element) -> bool { self.is_lt(value, &self.zero()) }
36
37 fn is_pos(&self, value: &Self::Element) -> bool { self.is_gt(value, &self.zero()) }
39
40 fn abs(&self, value: Self::Element) -> Self::Element {
42 if self.is_neg(&value) { self.negate(value) } else { value }
43 }
44
45 fn max<'a>(&self, fst: &'a Self::Element, snd: &'a Self::Element) -> &'a Self::Element {
47 if self.is_geq(fst, snd) {
48 return fst;
49 } else {
50 return snd;
51 }
52 }
53}
54
55pub trait OrderedRingStore: RingStore
58where
59 Self::Type: OrderedRing,
60{
61 delegate! { OrderedRing, fn cmp(&self, lhs: &El<Self>, rhs: &El<Self>) -> Ordering }
62 delegate! { OrderedRing, fn abs_cmp(&self, lhs: &El<Self>, rhs: &El<Self>) -> Ordering }
63 delegate! { OrderedRing, fn is_leq(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
64 delegate! { OrderedRing, fn is_geq(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
65 delegate! { OrderedRing, fn is_lt(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
66 delegate! { OrderedRing, fn is_gt(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
67 delegate! { OrderedRing, fn is_neg(&self, value: &El<Self>) -> bool }
68 delegate! { OrderedRing, fn is_pos(&self, value: &El<Self>) -> bool }
69 delegate! { OrderedRing, fn abs(&self, value: El<Self>) -> El<Self> }
70
71 fn max<'a>(&self, fst: &'a El<Self>, snd: &'a El<Self>) -> &'a El<Self> { self.get_ring().max(fst, snd) }
73}
74
75impl<R: ?Sized> OrderedRingStore for R
76where
77 R: RingStore,
78 R::Type: OrderedRing,
79{
80}