Skip to content

Commit c3c61fc

Browse files
committed
enum: Add arithmetic, bitwise and comparison.
Signed-off-by: Ihor Nehrutsa <Ihor.Nehrutsa@gmail.com>
1 parent a4e3daa commit c3c61fc

1 file changed

Lines changed: 106 additions & 5 deletions

File tree

python-stdlib/enum/enum.py

Lines changed: 106 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# enum.py
2-
# version="1.2.5"
2+
# version="1.2.6"
33

44

55
class EnumValue:
@@ -14,20 +14,121 @@ def __repr__(self):
1414
def __call__(self):
1515
return self.value
1616

17-
def __eq__(self, o):
18-
return self.value == (o.value if isinstance(o, EnumValue) else o)
19-
2017
def __setattr__(self, k, v):
2118
raise AttributeError("EnumValue is immutable")
2219

20+
# Helper function to extract the raw value
21+
def _get_value(self, o):
22+
return o.value if isinstance(o, EnumValue) else o
23+
24+
# Arithmetic and Bitwise operations (Forward)
25+
def __add__(self, o):
26+
return self.value + self._get_value(o)
27+
28+
def __sub__(self, o):
29+
return self.value - self._get_value(o)
30+
31+
def __mul__(self, o):
32+
return self.value * self._get_value(o)
33+
34+
def __truediv__(self, o):
35+
return self.value / self._get_value(o)
36+
37+
def __floordiv__(self, o):
38+
return self.value // self._get_value(o)
39+
40+
def __mod__(self, o):
41+
return self.value % self._get_value(o)
42+
43+
def __pow__(self, o):
44+
return self.value ** self._get_value(o)
45+
46+
def __and__(self, o):
47+
return self.value & self._get_value(o)
48+
49+
def __or__(self, o):
50+
return self.value | self._get_value(o)
51+
52+
def __xor__(self, o):
53+
return self.value ^ self._get_value(o)
54+
55+
def __lshift__(self, o):
56+
return self.value << self._get_value(o)
57+
58+
def __rshift__(self, o):
59+
return self.value >> self._get_value(o)
60+
61+
# Arithmetic and Bitwise operations (Reflected)
62+
def __radd__(self, o):
63+
return self._get_value(o) + self.value
64+
65+
def __rsub__(self, o):
66+
return self._get_value(o) - self.value
67+
68+
def __rmul__(self, o):
69+
return self._get_value(o) * self.value
70+
71+
def __rtruediv__(self, o):
72+
return self._get_value(o) / self.value
73+
74+
def __rfloordiv__(self, o):
75+
return self._get_value(o) // self.value
76+
77+
def __rand__(self, o):
78+
return self._get_value(o) & self.value
79+
80+
def __ror__(self, o):
81+
return self._get_value(o) | self.value
82+
83+
def __rxor__(self, o):
84+
return self._get_value(o) ^ self.value
85+
86+
def __rlshift__(self, o):
87+
return self._get_value(o) << self.value
88+
89+
def __rrshift__(self, o):
90+
return self._get_value(o) >> self.value
91+
92+
# Unary operators
93+
def __neg__(self):
94+
return -self.value
95+
96+
def __pos__(self):
97+
return +self.value
98+
99+
def __abs__(self):
100+
return abs(self.value)
101+
102+
def __invert__(self):
103+
return ~self.value
104+
105+
# Comparison
106+
def __eq__(self, o):
107+
return self.value == self._get_value(o)
108+
109+
def __lt__(self, o):
110+
return self.value < self._get_value(o)
111+
112+
def __le__(self, o):
113+
return self.value <= self._get_value(o)
114+
115+
def __gt__(self, o):
116+
return self.value > self._get_value(o)
117+
118+
def __ge__(self, o):
119+
return self.value >= self._get_value(o)
120+
121+
def __ne__(self, o):
122+
return self.value != self._get_value(o)
123+
23124

24125
class Enum:
25126
def __new__(cls, name=None, names=None):
26127
# If a name and names are provided, create a NEW subclass of Enum
27128
if name and names:
28129
# Support Functional API: Enum("Name", {"KEY": VALUE})
29130
# Dynamically create: class <name>
30-
new_cls = type(name, (cls, ), {})
131+
new_cls = type(name, (cls,), {})
31132
for k, v in names.items():
32133
new_cls._up(k, v)
33134
new_cls._inited = True

0 commit comments

Comments
 (0)