pyo3_pytests/
comparisons.rs

1use pyo3::basic::CompareOp;
2use pyo3::prelude::*;
3use std::fmt;
4
5#[pyclass(frozen)]
6struct Eq(i64);
7
8#[pymethods]
9impl Eq {
10    #[new]
11    fn new(value: i64) -> Self {
12        Self(value)
13    }
14
15    fn __eq__(&self, other: &Self) -> bool {
16        self.0 == other.0
17    }
18
19    fn __ne__(&self, other: &Self) -> bool {
20        self.0 != other.0
21    }
22}
23
24#[pyclass(frozen)]
25struct EqDefaultNe(i64);
26
27#[pymethods]
28impl EqDefaultNe {
29    #[new]
30    fn new(value: i64) -> Self {
31        Self(value)
32    }
33
34    fn __eq__(&self, other: &Self) -> bool {
35        self.0 == other.0
36    }
37}
38
39#[pyclass(eq, frozen)]
40#[derive(PartialEq, Eq)]
41struct EqDerived(i64);
42
43#[pymethods]
44impl EqDerived {
45    #[new]
46    fn new(value: i64) -> Self {
47        Self(value)
48    }
49}
50
51#[pyclass(frozen)]
52struct Ordered(i64);
53
54#[pymethods]
55impl Ordered {
56    #[new]
57    fn new(value: i64) -> Self {
58        Self(value)
59    }
60
61    fn __lt__(&self, other: &Self) -> bool {
62        self.0 < other.0
63    }
64
65    fn __le__(&self, other: &Self) -> bool {
66        self.0 <= other.0
67    }
68
69    fn __eq__(&self, other: &Self) -> bool {
70        self.0 == other.0
71    }
72
73    fn __ne__(&self, other: &Self) -> bool {
74        self.0 != other.0
75    }
76
77    fn __gt__(&self, other: &Self) -> bool {
78        self.0 > other.0
79    }
80
81    fn __ge__(&self, other: &Self) -> bool {
82        self.0 >= other.0
83    }
84}
85
86#[pyclass(frozen)]
87struct OrderedRichCmp(i64);
88
89#[pymethods]
90impl OrderedRichCmp {
91    #[new]
92    fn new(value: i64) -> Self {
93        Self(value)
94    }
95
96    fn __richcmp__(&self, other: &Self, op: CompareOp) -> bool {
97        op.matches(self.0.cmp(&other.0))
98    }
99}
100
101#[pyclass(eq, ord, hash, str, frozen)]
102#[derive(PartialEq, Eq, Ord, PartialOrd, Hash)]
103struct OrderedDerived(i64);
104
105impl fmt::Display for OrderedDerived {
106    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
107        self.0.fmt(f)
108    }
109}
110
111#[pymethods]
112impl OrderedDerived {
113    #[new]
114    fn new(value: i64) -> Self {
115        Self(value)
116    }
117}
118
119#[pyclass(frozen)]
120struct OrderedDefaultNe(i64);
121
122#[pymethods]
123impl OrderedDefaultNe {
124    #[new]
125    fn new(value: i64) -> Self {
126        Self(value)
127    }
128
129    fn __lt__(&self, other: &Self) -> bool {
130        self.0 < other.0
131    }
132
133    fn __le__(&self, other: &Self) -> bool {
134        self.0 <= other.0
135    }
136
137    fn __eq__(&self, other: &Self) -> bool {
138        self.0 == other.0
139    }
140
141    fn __gt__(&self, other: &Self) -> bool {
142        self.0 > other.0
143    }
144
145    fn __ge__(&self, other: &Self) -> bool {
146        self.0 >= other.0
147    }
148}
149
150#[pymodule]
151pub mod comparisons {
152    #[pymodule_export]
153    use super::{
154        Eq, EqDefaultNe, EqDerived, Ordered, OrderedDefaultNe, OrderedDerived, OrderedRichCmp,
155    };
156}