Add is_even() and is_odd() integer methods

Convenience methods for modulo operations involving even and odd
numbers.
pull/750/head
Emmanuele Bassi 9 years ago
parent 00e5962aaa
commit 2dd1ec6f8c
  1. 18
      mesonbuild/interpreter.py
  2. 2
      test cases/common/68 number arithmetic/meson.build

@ -2293,6 +2293,22 @@ class Interpreter():
else:
raise InterpreterException('Unknown method "%s" for a boolean.' % method_name)
def int_method_call(self, obj, method_name, args):
obj = self.to_native(obj)
(posargs, _) = self.reduce_arguments(args)
if method_name == 'is_even':
if len(posargs) == 0:
return obj % 2 == 0
else:
raise InterpreterException('int.is_even() must have no arguments.')
elif method_name == 'is_odd':
if len(posargs) == 0:
return obj % 2 != 0
else:
raise InterpreterException('int.is_odd() must have no arguments.')
else:
raise InterpreterException('Unknown method "%s" for an integer.' % method_name)
def string_method_call(self, obj, method_name, args):
obj = self.to_native(obj)
(posargs, _) = self.reduce_arguments(args)
@ -2379,6 +2395,8 @@ class Interpreter():
return self.string_method_call(obj, method_name, args)
if isinstance(obj, bool):
return self.bool_method_call(obj, method_name, args)
if isinstance(obj, int):
return self.int_method_call(obj, method_name, args)
if isinstance(obj, list):
return self.array_method_call(obj, method_name, self.reduce_arguments(args)[0])
if not isinstance(obj, InterpreterObject):

@ -23,6 +23,8 @@ endif
assert((5 % 2) == 1, 'Integer modulo (odd) is broken')
assert((4 % 2) == 0, 'Integer modulo (even) is broken')
assert(2.is_even() == 1, 'int is_even() broken')
assert(2.is_odd() == 0, 'int is_odd() broken')
assert(3 < 4, 'Lt broken')
assert(not(4 < 3), 'Lt broken')

Loading…
Cancel
Save