Lichen

lib/operator/binary.py

798:4f77605e14e8
2017-04-03 Paul Boddie Added support for left and right shift operators.
     1 #!/usr/bin/env python     2      3 """     4 Operator support.     5      6 Copyright (C) 2010, 2013, 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>     7      8 This program is free software; you can redistribute it and/or modify it under     9 the terms of the GNU General Public License as published by the Free Software    10 Foundation; either version 3 of the License, or (at your option) any later    11 version.    12     13 This program is distributed in the hope that it will be useful, but WITHOUT    14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    15 FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more    16 details.    17     18 You should have received a copy of the GNU General Public License along with    19 this program.  If not, see <http://www.gnu.org/licenses/>.    20 """    21     22 from operator.core import binary_op, is_, is_not    23 from native import int_add, int_div, int_mod, int_mul, int_pow, int_sub, \    24                    int_lshift, int_rshift, \    25                    int_and, int_not, int_or, int_xor, \    26                    is_int    27     28 # These functions defer method lookup by wrapping the attribute access in    29 # lambda functions. Thus, the appropriate methods are defined locally, but no    30 # attempt to obtain them is made until the generic function is called.    31     32 # Binary operator functions.    33     34 def add(a, b):    35     if is_int(a) and is_int(b):    36         return int_add(a, b)    37     return binary_op(a, b, lambda a: a.__add__, lambda b: b.__radd__)    38     39 def and_(a, b):    40     if is_int(a) and is_int(b):    41         return int_and(a, b)    42     return binary_op(a, b, lambda a: a.__and__, lambda b: b.__rand__)    43     44 def contains(a, b):    45     return in_(b, a)    46     47 def div(a, b):    48     if is_int(a) and is_int(b):    49         return int_div(a, b)    50     return binary_op(a, b, lambda a: a.__div__, lambda b: b.__rdiv__)    51     52 def floordiv(a, b):    53     return binary_op(a, b, lambda a: a.__floordiv__, lambda b: b.__rfloordiv__)    54     55 def in_(a, b):    56     return b.__contains__(a)    57     58 def not_in(a, b):    59     return not b.__contains__(a)    60     61 def lshift(a, b):    62     if is_int(a) and is_int(b):    63         return int_lshift(a, b)    64     return binary_op(a, b, lambda a: a.__lshift__, lambda b: b.__rlshift__)    65     66 def mod(a, b):    67     if is_int(a) and is_int(b):    68         return int_mod(a, b)    69     return binary_op(a, b, lambda a: a.__mod__, lambda b: b.__rmod__)    70     71 def mul(a, b):    72     if is_int(a) and is_int(b):    73         return int_mul(a, b)    74     return binary_op(a, b, lambda a: a.__mul__, lambda b: b.__rmul__)    75     76 def or_(a, b):    77     if is_int(a) and is_int(b):    78         return int_or(a, b)    79     return binary_op(a, b, lambda a: a.__or__, lambda b: b.__ror__)    80     81 def pow(a, b):    82     if is_int(a) and is_int(b):    83         return int_pow(a, b)    84     return binary_op(a, b, lambda a: a.__pow__, lambda b: b.__rpow__)    85     86 def rshift(a, b):    87     if is_int(a) and is_int(b):    88         return int_rshift(a, b)    89     return binary_op(a, b, lambda a: a.__rshift__, lambda b: b.__rrshift__)    90     91 def sub(a, b):    92     if is_int(a) and is_int(b):    93         return int_sub(a, b)    94     return binary_op(a, b, lambda a: a.__sub__, lambda b: b.__rsub__)    95     96 def xor(a, b):    97     if is_int(a) and is_int(b):    98         return int_xor(a, b)    99     return binary_op(a, b, lambda a: a.__xor__, lambda b: b.__rxor__)   100    101 # vim: tabstop=4 expandtab shiftwidth=4