X-Git-Url: https://svn.cri.ensmp.fr/git/linpy.git/blobdiff_plain/841943174bb4d3b602e8e055592d8b54d1bb086d..ddd4ffae2055577597ec46bf195bd401aaa9c625:/pypol/isl.py?ds=sidebyside diff --git a/pypol/isl.py b/pypol/isl.py index 758fb79..74cc5d3 100644 --- a/pypol/isl.py +++ b/pypol/isl.py @@ -4,6 +4,7 @@ import math import numbers import operator import re +import functools from decimal import Decimal from fractions import Fraction @@ -14,6 +15,16 @@ libisl = ctypes.CDLL(ctypes.util.find_library('isl')) libisl.isl_printer_get_str.restype = ctypes.c_char_p +def _polymorphic_method(func): + @functools.wraps(func) + def wrapper(self, other): + if isinstance(other, Value): + return func(self, other) + if isinstance(other, numbers.Rational): + other = Value(self.context, other) + return func(self, other) + raise TypeError('operand should be a Value or a Rational') + return wrapper class Context: @@ -130,34 +141,23 @@ class Value: def __bool__(self): return not bool(libisl.isl_val_is_zero(self)) - def _polymorphic(func): - @wraps(func) - def wrapper(self, other): - if isinstance(other, Value): - return func(self, other) - if isinstance(other, numbers.Rational): - other = Value(self.context, other) - return func(self, other) - raise TypeError('operand should be a Value or a Rational') - return wrapper - - @_polymorphic + @_polymorphic_method def __lt__(self, other): return bool(libisl.isl_val_lt(self, other)) - @_polymorphic + @_polymorphic_method def __le__(self, other): return bool(libisl.isl_val_le(self, other)) - @_polymorphic + @_polymorphic_method def __gt__(self, other): return bool(libisl.isl_val_gt(self, other)) - @_polymorphic + @_polymorphic_method def __ge__(self, other): return bool(libisl.isl_val_ge(self, other)) - @_polymorphic + @_polymorphic_method def __eq__(self, other): return bool(libisl.isl_val_eq(self, other)) @@ -192,7 +192,7 @@ class Value: val = libisl.isl_val_trunc(val) return self.__class__(self.context, self._ptr(val)) - @_polymorphic + @_polymorphic_method def __add__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other) @@ -201,7 +201,7 @@ class Value: __radd__ = __add__ - @_polymorphic + @_polymorphic_method def __sub__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other) @@ -210,7 +210,7 @@ class Value: __rsub__ = __sub__ - @_polymorphic + @_polymorphic_method def __mul__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other) @@ -219,7 +219,7 @@ class Value: __rmul__ = __mul__ - @_polymorphic + @_polymorphic_method def __truediv__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other)