__init__.py
Summary
- Lines:
249 of 269 covered (92.6%)
- Branches:
64 of 76 taken (84.2%), 10 lines partially
- Coverage:
90.7%
- Directory:
- Missed lines:
96, 108, 119, 127, 146, 164, 475-482, 565, 584, 603, 622, 641, 660, 689
Source
pyTooling/CallByRef/__init__.pycoveredpartialuncoveredexcludednot executable
1# ==================================================================================================================== #
2# _____ _ _ ____ _ _ ____ ____ __ #
3# _ __ _ |_ _|__ ___ | (_)_ __ __ _ / ___|__ _| | | __ ) _ _| _ \ ___ / _| #
4# | '_ \| | | || |/ _ \ / _ \| | | '_ \ / _` || | / _` | | | _ \| | | | |_) / _ \ |_ #
5# | |_) | |_| || | (_) | (_) | | | | | | (_| || |__| (_| | | | |_) | |_| | _ < __/ _| #
6# | .__/ \__, ||_|\___/ \___/|_|_|_| |_|\__, (_)____\__,_|_|_|____/ \__, |_| \_\___|_| #
7# |_| |___/ |___/ |___/ #
8# ==================================================================================================================== #
9# Authors: #
10# Patrick Lehmann #
11# #
12# License: #
13# ==================================================================================================================== #
14# Copyright 2017-2026 Patrick Lehmann - Bötzingen, Germany #
15# #
16# Licensed under the Apache License, Version 2.0 (the "License"); #
17# you may not use this file except in compliance with the License. #
18# You may obtain a copy of the License at #
19# #
20# http://www.apache.org/licenses/LICENSE-2.0 #
21# #
22# Unless required by applicable law or agreed to in writing, software #
23# distributed under the License is distributed on an "AS IS" BASIS, #
24# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
25# See the License for the specific language governing permissions and #
26# limitations under the License. #
27# #
28# SPDX-License-Identifier: Apache-2.0 #
29# ==================================================================================================================== #
30#
31"""
32Auxiliary classes to implement call-by-reference.
33
34.. hint::
35
36 See :ref:`high-level help <COMMON/CallByRef>` for explanations and usage examples.
37
38.. seealso::
39
40 :mod:`pyTooling.Common`
41 |rarr| Helper functions for the data types passed around this way.
42"""
43from __future__ import annotations
44
45from decimal import Decimal
46from typing import Any, Generic, Self, TypeVar, Optional as Nullable
47
48from pyTooling.Common import getFullyQualifiedName
49from pyTooling.Decorators import export
50from pyTooling.MetaClasses import ExtendedType
51
52
53T = TypeVar("T")
54
55
56@export
57class CallByRefParam(Generic[T], metaclass=ExtendedType, slots=True):
58 """
59 Implements a *call-by-reference* parameter.
60
61 .. seealso::
62
63 :class:`CallByRefBoolParam`
64 |rarr| A special *call-by-reference* implementation for boolean reference types.
65 :class:`CallByRefIntParam`
66 |rarr| A special *call-by-reference* implementation for integer reference types.
67 """
68
69 Value: T #: internal value
70
71 def __init__(self, value: Nullable[T] = None) -> None:
72 """Constructs a *call-by-reference* object for any type.
73
74 :param value: Optional, the value to be set as an initial value.
75 """
76 self.Value = value
77
78 def __ilshift__(self, other: T) -> Self:
79 """Assigns a value to the *call-by-reference* object.
80
81 :param other: The value to be assigned to this *call-by-reference* object.
82 :returns: Itself.
83 """
84 self.Value = other
85 return self
86
87 # binary operators - comparison
88 def __eq__(self, other: Any) -> bool:
89 """
90 Compare a CallByRefParam wrapped value with another instances (CallbyRefParam) or non-wrapped value for equality.
91
92 :param other: Parameter to compare against.
93 :returns: ``True``, if both values are equal.
94 """
95 if isinstance(other, CallByRefParam):
96 return self.Value == other.Value
97 else:
98 return self.Value == other
99
100 def __ne__(self, other: Any) -> bool:
101 """
102 Compare a CallByRefParam wrapped value with another instances (CallbyRefParam) or non-wrapped value for inequality.
103
104 :param other: Parameter to compare against.
105 :returns: ``True``, if both values are unequal.
106 """
107 if isinstance(other, CallByRefParam):
108 return self.Value != other.Value
109 else:
110 return self.Value != other
111
112 # Type conversion operators
113 def __repr__(self) -> str:
114 """
115 Returns the wrapped object's string representation.
116
117 :returns: The string representation of the wrapped value.
118 """
119 return repr(self.Value)
120
121 def __str__(self) -> str:
122 """
123 Returns the wrapped object's string equivalent.
124
125 :returns: The string equivalent of the wrapped value.
126 """
127 return str(self.Value)
128
129
130@export
131class CallByRefBoolParam(CallByRefParam[bool]):
132 """A special *call-by-reference* implementation for boolean reference types."""
133
134 # Binary operators - comparison
135 def __eq__(self, other: Any) -> bool:
136 """
137 Compare a CallByRefBoolParam wrapped boolean value with another instances (CallByRefBoolParam) or non-wrapped boolean value for equality.
138
139 :param other: Parameter to compare against.
140 :returns: ``True``, if both values are equal.
141 :raises TypeError: If parameter ``other`` is not of type boolean or :class:`CallByRefBoolParam`.
142 """
143 if isinstance(other, bool):
144 return self.Value == other
145 elif isinstance(other, CallByRefBoolParam):
146 return self.Value == other.Value
147 else:
148 ex = TypeError("Second operand is not supported by == operator.")
149 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
150 ex.add_note("Supported types for second operand: bool, CallByRefBoolParam")
151 raise ex
152
153 def __ne__(self, other: Any) -> bool:
154 """
155 Compare a CallByRefBoolParam wrapped boolean value with another instances (CallByRefBoolParam) or non-wrapped boolean value for inequality.
156
157 :param other: Parameter to compare against.
158 :returns: ``True``, if both values are unequal.
159 :raises TypeError: If parameter ``other`` is not of type boolean or :class:`CallByRefBoolParam`.
160 """
161 if isinstance(other, bool):
162 return self.Value != other
163 elif isinstance(other, CallByRefBoolParam):
164 return self.Value != other.Value
165 else:
166 ex = TypeError("Second operand is not supported by != operator.")
167 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
168 ex.add_note("Supported types for second operand: bool, CallByRefBoolParam")
169 raise ex
170
171 # Type conversion operators
172 def __bool__(self) -> bool:
173 """
174 Type conversion to :class:`bool`.
175
176 :returns: The wrapped value.
177 """
178 return self.Value
179
180 def __int__(self) -> int:
181 """
182 Type conversion to :class:`int`.
183
184 :returns: The integer representation of the wrapped boolean value.
185 """
186 return int(self.Value)
187
188
189@export
190class CallByRefIntParam(CallByRefParam[int]):
191 """A special *call-by-reference* implementation for integer reference types."""
192
193 # Unary operators
194 def __neg__(self) -> int:
195 """
196 Negate: :pycode:`-self`.
197
198 :returns: The negated value.
199 """
200 return -self.Value
201
202 def __pos__(self) -> int:
203 """
204 Positive: :pycode:`+self`.
205
206 :returns: The value with a positive sign.
207 """
208 return +self.Value
209
210 def __invert__(self) -> int:
211 """
212 Invert: :pycode:`~self`.
213
214 :returns: The bitwise inverted value.
215 """
216 return ~self.Value
217
218 # Binary operators - logical
219 def __and__(self, other: Any) -> int:
220 """
221 And: :pycode:`self & other`.
222
223 :param other: Second operand, which has to be of type integer.
224 :returns: Result of the bitwise *and* operation.
225 :raises TypeError: If the second operand is not of type integer.
226 """
227 if isinstance(other, int):
228 return self.Value & other
229 else:
230 ex = TypeError("Second operand is not supported by and operator.")
231 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
232 ex.add_note("Supported types for second operand: int")
233 raise ex
234
235 def __or__(self, other: Any) -> int:
236 """
237 Or: :pycode:`self | other`.
238
239 :param other: Second operand, which has to be of type integer.
240 :returns: Result of the bitwise *or* operation.
241 :raises TypeError: If the second operand is not of type integer.
242 """
243 if isinstance(other, int):
244 return self.Value | other
245 else:
246 ex = TypeError("Second operand is not supported by or operator.")
247 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
248 ex.add_note("Supported types for second operand: int")
249 raise ex
250
251 def __xor__(self, other: Any) -> int:
252 """
253 Xor: :pycode:`self ^ other`.
254
255 :param other: Second operand, which has to be of type integer.
256 :returns: Result of the bitwise *exclusive or* operation.
257 :raises TypeError: If the second operand is not of type integer.
258 """
259 if isinstance(other, int):
260 return self.Value ^ other
261 else:
262 ex = TypeError("Second operand is not supported by xor operator.")
263 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
264 ex.add_note("Supported types for second operand: int")
265 raise ex
266
267 # Binary inplace operators
268 def __iand__(self, other: Any) -> Self:
269 """
270 In-place and: :pycode:`self &= other`.
271
272 :param other: Second operand, which has to be of type integer.
273 :returns: The same *call-by-reference* object, with its value updated.
274 :raises TypeError: If the second operand is not of type integer.
275 """
276 if isinstance(other, int):
277 self.Value &= other
278 return self
279 else:
280 ex = TypeError("Second operand is not supported by &= operator.")
281 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
282 ex.add_note("Supported types for second operand: int")
283 raise ex
284
285 def __ior__(self, other: Any) -> Self:
286 r"""
287 In-place or: :pycode:`self |= other`.
288
289 :param other: Second operand, which has to be of type integer.
290 :returns: The same *call-by-reference* object, with its value updated.
291 :raises TypeError: If the second operand is not of type integer.
292 """
293 if isinstance(other, int):
294 self.Value |= other
295 return self
296 else:
297 ex = TypeError("Second operand is not supported by |= operator.")
298 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
299 ex.add_note("Supported types for second operand: int")
300 raise ex
301
302 def __ixor__(self, other: Any) -> Self:
303 """
304 In-place xor: :pycode:`self ^= other`.
305
306 :param other: Second operand, which has to be of type integer.
307 :returns: The same *call-by-reference* object, with its value updated.
308 :raises TypeError: If the second operand is not of type integer.
309 """
310 if isinstance(other, int):
311 self.Value ^= other
312 return self
313 else:
314 ex = TypeError("Second operand is not supported by ^= operator.")
315 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
316 ex.add_note("Supported types for second operand: int")
317 raise ex
318
319 # Binary operators - arithmetic
320 def __add__(self, other: Any) -> int:
321 """
322 Addition: :pycode:`self + other`.
323
324 :param other: Second operand, which has to be of type integer.
325 :returns: Sum of both operands.
326 :raises TypeError: If the second operand is not of type integer.
327 """
328 if isinstance(other, int):
329 return self.Value + other
330 else:
331 ex = TypeError("Second operand is not supported by + operator.")
332 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
333 ex.add_note("Supported types for second operand: int")
334 raise ex
335
336 def __sub__(self, other: Any) -> int:
337 """
338 Subtraction: :pycode:`self - other`.
339
340 :param other: Second operand, which has to be of type integer.
341 :returns: Difference of both operands.
342 :raises TypeError: If the second operand is not of type integer.
343 """
344 if isinstance(other, int):
345 return self.Value - other
346 else:
347 ex = TypeError("Second operand is not supported by - operator.")
348 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
349 ex.add_note("Supported types for second operand: int")
350 raise ex
351
352 def __truediv__(self, other: Any) -> int:
353 """
354 Division: :pycode:`self / other`.
355
356 :param other: Second operand, which has to be of type integer.
357 :returns: Quotient of both operands.
358 :raises TypeError: If the second operand is not of type integer.
359 """
360 if isinstance(other, int):
361 return self.Value / other
362 else:
363 ex = TypeError("Second operand is not supported by / operator.")
364 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
365 ex.add_note("Supported types for second operand: int")
366 raise ex
367
368 def __floordiv__(self, other: Any) -> int:
369 """
370 Floor division: :pycode:`self // other`.
371
372 :param other: Second operand, which has to be of type integer.
373 :returns: Floor of the quotient of both operands.
374 :raises TypeError: If the second operand is not of type integer.
375 """
376 if isinstance(other, int):
377 return self.Value // other
378 else:
379 ex = TypeError("Second operand is not supported by // operator.")
380 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
381 ex.add_note("Supported types for second operand: int")
382 raise ex
383
384 def __mul__(self, other: Any) -> int:
385 """
386 Multiplication: :pycode:`self * other`.
387
388 :param other: Second operand, which has to be of type integer.
389 :returns: Product of both operands.
390 :raises TypeError: If the second operand is not of type integer.
391 """
392 if isinstance(other, int):
393 return self.Value * other
394 else:
395 ex = TypeError("Second operand is not supported by * operator.")
396 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
397 ex.add_note("Supported types for second operand: int")
398 raise ex
399
400 def __mod__(self, other: Any) -> int:
401 """
402 Modulo: :pycode:`self % other`.
403
404 :param other: Second operand, which has to be of type integer.
405 :returns: Remainder of the division.
406 :raises TypeError: If the second operand is not of type integer.
407 """
408 if isinstance(other, int):
409 return self.Value % other
410 else:
411 ex = TypeError("Second operand is not supported by % operator.")
412 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
413 ex.add_note("Supported types for second operand: int")
414 raise ex
415
416 def __pow__(self, other: Any) -> int:
417 """
418 Power: :pycode:`self ** other`.
419
420 :param other: Second operand, which has to be of type integer.
421 :returns: The value raised to the power of the second operand.
422 :raises TypeError: If the second operand is not of type integer.
423 """
424 if isinstance(other, int):
425 return self.Value ** other
426 else:
427 ex = TypeError("Second operand is not supported by ** operator.")
428 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
429 ex.add_note("Supported types for second operand: int")
430 raise ex
431
432 # Binary inplace operators - arithmetic
433 def __iadd__(self, other: Any) -> CallByRefIntParam:
434 """
435 In-place addition: :pycode:`self += other`.
436
437 :param other: Second operand, which has to be of type integer.
438 :returns: The same *call-by-reference* object, with its value updated.
439 :raises TypeError: If the second operand is not of type integer.
440 """
441 if isinstance(other, int):
442 self.Value += other
443 return self
444 else:
445 ex = TypeError("Second operand is not supported by xor operator.")
446 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
447 ex.add_note("Supported types for second operand: int")
448 raise ex
449
450 def __isub__(self, other: Any) -> CallByRefIntParam:
451 """
452 In-place subtraction: :pycode:`self -= other`.
453
454 :param other: Second operand, which has to be of type integer.
455 :returns: The same *call-by-reference* object, with its value updated.
456 :raises TypeError: If the second operand is not of type integer.
457 """
458 if isinstance(other, int):
459 self.Value -= other
460 return self
461 else:
462 ex = TypeError("Second operand is not supported by xor operator.")
463 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
464 ex.add_note("Supported types for second operand: int")
465 raise ex
466
467 def __idiv__(self, other: Any) -> CallByRefIntParam:
468 """
469 In-place division: :pycode:`self /= other`.
470
471 :param other: Second operand, which has to be of type integer.
472 :returns: The same *call-by-reference* object, with its value updated.
473 :raises TypeError: If the second operand is not of type integer.
474 """
475 if isinstance(other, int):
476 self.Value /= other
477 return self
478 else:
479 ex = TypeError("Second operand is not supported by xor operator.")
480 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
481 ex.add_note("Supported types for second operand: int")
482 raise ex
483
484 def __ifloordiv__(self, other: Any) -> CallByRefIntParam:
485 """
486 In-place floor division: :pycode:`self //= other`.
487
488 :param other: Second operand, which has to be of type integer.
489 :returns: The same *call-by-reference* object, with its value updated.
490 :raises TypeError: If the second operand is not of type integer.
491 """
492 if isinstance(other, int):
493 self.Value //= other
494 return self
495 else:
496 ex = TypeError("Second operand is not supported by xor operator.")
497 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
498 ex.add_note("Supported types for second operand: int")
499 raise ex
500
501 def __imul__(self, other: Any) -> CallByRefIntParam:
502 r"""
503 In-place multiplication: :pycode:`self *= other`.
504
505 :param other: Second operand, which has to be of type integer.
506 :returns: The same *call-by-reference* object, with its value updated.
507 :raises TypeError: If the second operand is not of type integer.
508 """
509 if isinstance(other, int):
510 self.Value *= other
511 return self
512 else:
513 ex = TypeError("Second operand is not supported by xor operator.")
514 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
515 ex.add_note("Supported types for second operand: int")
516 raise ex
517
518 def __imod__(self, other: Any) -> CallByRefIntParam:
519 """
520 In-place modulo: :pycode:`self %= other`.
521
522 :param other: Second operand, which has to be of type integer.
523 :returns: The same *call-by-reference* object, with its value updated.
524 :raises TypeError: If the second operand is not of type integer.
525 """
526 if isinstance(other, int):
527 self.Value %= other
528 return self
529 else:
530 ex = TypeError("Second operand is not supported by xor operator.")
531 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
532 ex.add_note("Supported types for second operand: int")
533 raise ex
534
535 def __ipow__(self, other: Any) -> CallByRefIntParam:
536 r"""
537 In-place power: :pycode:`self **= other`.
538
539 :param other: Second operand, which has to be of type integer.
540 :returns: The same *call-by-reference* object, with its value updated.
541 :raises TypeError: If the second operand is not of type integer.
542 """
543 if isinstance(other, int):
544 self.Value **= other
545 return self
546 else:
547 ex = TypeError("Second operand is not supported by xor operator.")
548 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
549 ex.add_note("Supported types for second operand: int")
550 raise ex
551
552 # Binary operators - comparison
553 def __eq__(self, other: Any) -> bool:
554 """
555 Compare a CallByRefIntParam wrapped integer value with another instances (CallByRefIntParam) or non-wrapped integer value for equality.
556
557 :param other: Parameter to compare against.
558 :returns: ``True``, if both values are equal.
559 :raises TypeError:If parameter ``other`` is not of type integer, float, complex number, :class:`Decimal` or
560 :class:`CallByRefParam`.
561 """
562 if isinstance(other, (int, float, complex, Decimal)) and not isinstance(other, bool):
563 return self.Value == other
564 elif isinstance(other, CallByRefIntParam):
565 return self.Value == other.Value
566 else:
567 ex = TypeError("Second operand is not supported by == operator.")
568 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
569 ex.add_note("Supported types for second operand: int, float, complex, Decimal, CallByRefIntParam")
570 raise ex
571
572 def __ne__(self, other: Any) -> bool:
573 """
574 Compare a CallByRefIntParam wrapped integer value with another instances (CallByRefIntParam) or non-wrapped integer value for inequality.
575
576 :param other: Parameter to compare against.
577 :returns: ``True``, if both values are unequal.
578 :raises TypeError:If parameter ``other`` is not of type integer, float, complex number, :class:`Decimal` or
579 :class:`CallByRefParam`.
580 """
581 if isinstance(other, (int, float, complex, Decimal)) and not isinstance(other, bool):
582 return self.Value != other
583 elif isinstance(other, CallByRefIntParam):
584 return self.Value != other.Value
585 else:
586 ex = TypeError("Second operand is not supported by != operator.")
587 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
588 ex.add_note("Supported types for second operand: int, float, complex, Decimal, CallByRefIntParam")
589 raise ex
590
591 def __lt__(self, other: Any) -> bool:
592 """
593 Compare a CallByRefIntParam wrapped integer value with another instances (CallByRefIntParam) or non-wrapped integer value for less-than.
594
595 :param other: Parameter to compare against.
596 :returns: ``True``, if the wrapped value is less than the other value.
597 :raises TypeError:If parameter ``other`` is not of type integer, float, complex number, :class:`Decimal` or
598 :class:`CallByRefParam`.
599 """
600 if isinstance(other, (int, float, complex, Decimal)) and not isinstance(other, bool):
601 return self.Value < other
602 elif isinstance(other, CallByRefIntParam):
603 return self.Value < other.Value
604 else:
605 ex = TypeError("Second operand is not supported by < operator.")
606 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
607 ex.add_note("Supported types for second operand: int, float, complex, Decimal, CallByRefIntParam")
608 raise ex
609
610 def __le__(self, other: Any) -> bool:
611 """
612 Compare a CallByRefIntParam wrapped integer value with another instances (CallByRefIntParam) or non-wrapped integer value for less-than-or-equal.
613
614 :param other: Parameter to compare against.
615 :returns: ``True``, if the wrapped value is less than or equal the other value.
616 :raises TypeError:If parameter ``other`` is not of type integer, float, complex number, :class:`Decimal` or
617 :class:`CallByRefParam`.
618 """
619 if isinstance(other, (int, float, complex, Decimal)) and not isinstance(other, bool):
620 return self.Value <= other
621 elif isinstance(other, CallByRefIntParam):
622 return self.Value <= other.Value
623 else:
624 ex = TypeError("Second operand is not supported by <= operator.")
625 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
626 ex.add_note("Supported types for second operand: int, float, complex, Decimal, CallByRefIntParam")
627 raise ex
628
629 def __gt__(self, other: Any) -> bool:
630 """
631 Compare a CallByRefIntParam wrapped integer value with another instances (CallByRefIntParam) or non-wrapped integer value for geater-than.
632
633 :param other: Parameter to compare against.
634 :returns: ``True``, if the wrapped value is greater than the other value.
635 :raises TypeError:If parameter ``other`` is not of type integer, float, complex number, :class:`Decimal` or
636 :class:`CallByRefParam`.
637 """
638 if isinstance(other, (int, float, complex, Decimal)) and not isinstance(other, bool):
639 return self.Value > other
640 elif isinstance(other, CallByRefIntParam):
641 return self.Value > other.Value
642 else:
643 ex = TypeError("Second operand is not supported by > operator.")
644 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
645 ex.add_note("Supported types for second operand: int, float, complex, Decimal, CallByRefIntParam")
646 raise ex
647
648 def __ge__(self, other: Any) -> bool:
649 """
650 Compare a CallByRefIntParam wrapped integer value with another instances (CallByRefIntParam) or non-wrapped integer value for greater-than-or-equal.
651
652 :param other: Parameter to compare against.
653 :returns: ``True``, if the wrapped value is greater than or equal the other value.
654 :raises TypeError:If parameter ``other`` is not of type integer, float, complex number, :class:`Decimal` or
655 :class:`CallByRefParam`.
656 """
657 if isinstance(other, (int, float, complex, Decimal)) and not isinstance(other, bool):
658 return self.Value >= other
659 elif isinstance(other, CallByRefIntParam):
660 return self.Value >= other.Value
661 else:
662 ex = TypeError("Second operand is not supported by >= operator.")
663 ex.add_note(f"Got type '{getFullyQualifiedName(other)}'.")
664 ex.add_note("Supported types for second operand: int, float, complex, Decimal, CallByRefIntParam")
665 raise ex
666
667 # Type conversion operators
668 def __bool__(self) -> bool:
669 """
670 Type conversion to :class:`bool`.
671
672 :returns: The boolean representation of the wrapped integer value.
673 """
674 return bool(self.Value)
675
676 def __int__(self) -> int:
677 """
678 Type conversion to :class:`int`.
679
680 :returns: The wrapped value."""
681 return self.Value
682
683 def __float__(self) -> float:
684 """
685 Type conversion to :class:`float`.
686
687 :returns: The float representation of the wrapped integer value.
688 """
689 return float(self.Value)