1use crate::ring::*;
2use std::cmp::*;
3
4pub trait OrderedRing: RingBase {
13
14 fn cmp(&self, lhs: &Self::Element, rhs: &Self::Element) -> Ordering;
19
20 fn abs_cmp(&self, lhs: &Self::Element, rhs: &Self::Element) -> Ordering {
25 self.cmp(&self.abs(self.clone_el(lhs)), &self.abs(self.clone_el(rhs)))
26 }
27
28 fn is_leq(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool {
32 self.cmp(lhs, rhs) != Ordering::Greater
33 }
34
35 fn is_geq(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool {
39 self.cmp(lhs, rhs) != Ordering::Less
40 }
41
42 fn is_lt(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool {
46 self.cmp(lhs, rhs) == Ordering::Less
47 }
48
49 fn is_gt(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool {
53 self.cmp(lhs, rhs) == Ordering::Greater
54 }
55
56 fn is_neg(&self, value: &Self::Element) -> bool {
60 self.is_lt(value, &self.zero())
61 }
62
63 fn is_pos(&self, value: &Self::Element) -> bool {
67 self.is_gt(value, &self.zero())
68 }
69
70 fn abs(&self, value: Self::Element) -> Self::Element {
74 if self.is_neg(&value) {
75 self.negate(value)
76 } else {
77 value
78 }
79 }
80
81 fn max<'a>(&self, fst: &'a Self::Element, snd: &'a Self::Element) -> &'a Self::Element {
85 if self.is_geq(fst, snd) {
86 return fst;
87 } else {
88 return snd;
89 }
90 }
91}
92
93pub trait OrderedRingStore: RingStore
98 where Self::Type: OrderedRing
99{
100 delegate!{ OrderedRing, fn cmp(&self, lhs: &El<Self>, rhs: &El<Self>) -> Ordering }
101 delegate!{ OrderedRing, fn abs_cmp(&self, lhs: &El<Self>, rhs: &El<Self>) -> Ordering }
102 delegate!{ OrderedRing, fn is_leq(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
103 delegate!{ OrderedRing, fn is_geq(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
104 delegate!{ OrderedRing, fn is_lt(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
105 delegate!{ OrderedRing, fn is_gt(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool }
106 delegate!{ OrderedRing, fn is_neg(&self, value: &El<Self>) -> bool }
107 delegate!{ OrderedRing, fn is_pos(&self, value: &El<Self>) -> bool }
108 delegate!{ OrderedRing, fn abs(&self, value: El<Self>) -> El<Self> }
109
110 fn max<'a>(&self, fst: &'a El<Self>, snd: &'a El<Self>) -> &'a El<Self> {
114 self.get_ring().max(fst, snd)
115 }
116}
117
118impl<R: ?Sized> OrderedRingStore for R
119 where R: RingStore,
120 R::Type: OrderedRing
121{}