1.1 --- a/lib/operator/augmented.py Fri Mar 24 19:07:01 2017 +0100
1.2 +++ b/lib/operator/augmented.py Fri Mar 24 22:08:50 2017 +0100
1.3 @@ -3,7 +3,7 @@
1.4 """
1.5 Operator support.
1.6
1.7 -Copyright (C) 2010, 2013, 2015 Paul Boddie <paul@boddie.org.uk>
1.8 +Copyright (C) 2010, 2013, 2015, 2017 Paul Boddie <paul@boddie.org.uk>
1.9
1.10 This program is free software; you can redistribute it and/or modify it under
1.11 the terms of the GNU General Public License as published by the Free Software
1.12 @@ -20,6 +20,9 @@
1.13 """
1.14
1.15 from operator.core import augassign
1.16 +from native import int_add, int_div, int_mod, int_mul, int_pow, int_sub, \
1.17 + int_and, int_or, int_xor, \
1.18 + is_int
1.19
1.20 # These functions defer method lookup by wrapping the attribute access in
1.21 # lambda functions. Thus, the appropriate methods are defined locally, but no
1.22 @@ -31,12 +34,18 @@
1.23 # Augmented assignment functions.
1.24
1.25 def iadd(a, b):
1.26 + if is_int(a) and is_int(b):
1.27 + return int_add(a, b)
1.28 return augassign(a, b, lambda a: a.__iadd__, lambda a: a.__add__, lambda b: b.__radd__)
1.29
1.30 def iand_(a, b):
1.31 + if is_int(a) and is_int(b):
1.32 + return int_and(a, b)
1.33 return augassign(a, b, lambda a: a.__iand__, lambda a: a.__and__, lambda b: b.__rand__)
1.34
1.35 def idiv(a, b):
1.36 + if is_int(a) and is_int(b):
1.37 + return int_div(a, b)
1.38 return augassign(a, b, lambda a: a.__idiv__, lambda a: a.__div__, lambda b: b.__rdiv__)
1.39
1.40 def ifloordiv(a, b):
1.41 @@ -46,24 +55,36 @@
1.42 return augassign(a, b, lambda a: a.__ilshift__, lambda a: a.__lshift__, lambda b: b.__rlshift__)
1.43
1.44 def imod(a, b):
1.45 + if is_int(a) and is_int(b):
1.46 + return int_mod(a, b)
1.47 return augassign(a, b, lambda a: a.__imod__, lambda a: a.__mod__, lambda b: b.__rmod__)
1.48
1.49 def imul(a, b):
1.50 + if is_int(a) and is_int(b):
1.51 + return int_mul(a, b)
1.52 return augassign(a, b, lambda a: a.__imul__, lambda a: a.__mul__, lambda b: b.__rmul__)
1.53
1.54 def ior_(a, b):
1.55 + if is_int(a) and is_int(b):
1.56 + return int_or(a, b)
1.57 return augassign(a, b, lambda a: a.__ior__, lambda a: a.__or__, lambda b: b.__ror__)
1.58
1.59 def ipow(a, b):
1.60 + if is_int(a) and is_int(b):
1.61 + return int_pow(a, b)
1.62 return augassign(a, b, lambda a: a.__ipow__, lambda a: a.__pow__, lambda b: b.__rpow__)
1.63
1.64 def irshift(a, b):
1.65 return augassign(a, b, lambda a: a.__irshift__, lambda a: a.__rshift__, lambda b: b.__rrshift__)
1.66
1.67 def isub(a, b):
1.68 + if is_int(a) and is_int(b):
1.69 + return int_sub(a, b)
1.70 return augassign(a, b, lambda a: a.__isub__, lambda a: a.__sub__, lambda b: b.__rsub__)
1.71
1.72 def ixor(a, b):
1.73 + if is_int(a) and is_int(b):
1.74 + return int_xor(a, b)
1.75 return augassign(a, b, lambda a: a.__ixor__, lambda a: a.__xor__, lambda b: b.__rxor__)
1.76
1.77 # vim: tabstop=4 expandtab shiftwidth=4