1use crate::{ffi, impl_::pyclass::PyClassImpl, PyTypeInfo};
3use std::{cmp::Ordering, os::raw::c_int};
4
5mod create_type_object;
6mod gc;
7mod guard;
8
9pub(crate) use self::create_type_object::{create_type_object, PyClassTypeObject};
10
11pub use self::gc::{PyTraverseError, PyVisit};
12pub use self::guard::{PyClassGuard, PyClassGuardMap, PyClassGuardMut};
13
14pub trait PyClass: PyTypeInfo + PyClassImpl {
19 type Frozen: Frozen;
23}
24
25#[derive(Debug, Clone, Copy)]
27pub enum CompareOp {
28 Lt = ffi::Py_LT as isize,
30 Le = ffi::Py_LE as isize,
32 Eq = ffi::Py_EQ as isize,
34 Ne = ffi::Py_NE as isize,
36 Gt = ffi::Py_GT as isize,
38 Ge = ffi::Py_GE as isize,
40}
41
42impl CompareOp {
43 pub fn from_raw(op: c_int) -> Option<Self> {
45 match op {
46 ffi::Py_LT => Some(CompareOp::Lt),
47 ffi::Py_LE => Some(CompareOp::Le),
48 ffi::Py_EQ => Some(CompareOp::Eq),
49 ffi::Py_NE => Some(CompareOp::Ne),
50 ffi::Py_GT => Some(CompareOp::Gt),
51 ffi::Py_GE => Some(CompareOp::Ge),
52 _ => None,
53 }
54 }
55
56 pub fn matches(&self, result: Ordering) -> bool {
77 match self {
78 CompareOp::Eq => result == Ordering::Equal,
79 CompareOp::Ne => result != Ordering::Equal,
80 CompareOp::Lt => result == Ordering::Less,
81 CompareOp::Le => result != Ordering::Greater,
82 CompareOp::Gt => result == Ordering::Greater,
83 CompareOp::Ge => result != Ordering::Less,
84 }
85 }
86}
87
88#[doc(hidden)]
92pub mod boolean_struct {
93 pub(crate) mod private {
94 use super::*;
95
96 pub trait Boolean {
98 const VALUE: bool;
99 }
100
101 impl Boolean for True {
102 const VALUE: bool = true;
103 }
104 impl Boolean for False {
105 const VALUE: bool = false;
106 }
107 }
108
109 pub struct True(());
110 pub struct False(());
111}
112
113#[doc(hidden)]
115pub trait Frozen: boolean_struct::private::Boolean {}
116
117impl Frozen for boolean_struct::True {}
118impl Frozen for boolean_struct::False {}
119
120mod tests {
121 #[test]
122 fn test_compare_op_matches() {
123 use super::CompareOp;
124 use std::cmp::Ordering;
125
126 assert!(CompareOp::Eq.matches(Ordering::Equal));
127 assert!(CompareOp::Ne.matches(Ordering::Less));
128 assert!(CompareOp::Ge.matches(Ordering::Greater));
129 assert!(CompareOp::Gt.matches(Ordering::Greater));
130 assert!(CompareOp::Le.matches(Ordering::Equal));
131 assert!(CompareOp::Lt.matches(Ordering::Less));
132 }
133}