pyo3_pytests/
comparisons.rs1use 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}