Author: Amaury Forgeot d'Arc <[email protected]>
Branch: decimal-libmpdec
Changeset: r73038:1df130158ca5
Date: 2014-05-25 19:07 +0200
http://bitbucket.org/pypy/pypy/changeset/1df130158ca5/

Log:    Add Context.is_* methods

diff --git a/pypy/module/_decimal/interp_context.py 
b/pypy/module/_decimal/interp_context.py
--- a/pypy/module/_decimal/interp_context.py
+++ b/pypy/module/_decimal/interp_context.py
@@ -344,6 +344,24 @@
     W_Context.__init__(w_result, space)
     return w_result
 
+def make_bool_function(mpd_func):
+    @unwrap_spec(w_context=W_Context)
+    def func_w(space, w_context, w_x):
+        from pypy.module._decimal import interp_decimal
+        w_x = interp_decimal.convert_op_raise(space, w_context, w_x)
+        res = getattr(rmpdec, mpd_func)(w_x.mpd, w_context.ctx)
+        return space.wrap(bool(res))
+    return interp2app(func_w)
+
+def make_bool_function_noctx(mpd_func):
+    @unwrap_spec(w_context=W_Context)
+    def func_w(space, w_context, w_x):
+        from pypy.module._decimal import interp_decimal
+        w_x = interp_decimal.convert_op_raise(space, w_context, w_x)
+        res = getattr(rmpdec, mpd_func)(w_x.mpd)
+        return space.wrap(bool(res))
+    return interp2app(func_w)
+
 W_Context.typedef = TypeDef(
     'Context',
     __new__ = interp2app(descr_new_context),
@@ -401,6 +419,16 @@
     # Ternary operations
     power=interp2app(W_Context.power_w),
     fma=interp2app(W_Context.fma_w),
+    # Boolean operations
+    is_signed=make_bool_function_noctx('mpd_issigned'),
+    is_zero=make_bool_function_noctx('mpd_iszero'),
+    is_normal=make_bool_function('mpd_isnormal'),
+    is_subnormal=make_bool_function('mpd_issubnormal'),
+    is_finite=make_bool_function_noctx('mpd_isfinite'),
+    is_infinite=make_bool_function_noctx('mpd_isinfinite'),
+    is_nan=make_bool_function_noctx('mpd_isnan'),
+    is_qnan=make_bool_function_noctx('mpd_isqnan'),
+    is_snan=make_bool_function_noctx('mpd_issnan'),
     )
 
 
diff --git a/pypy/module/_decimal/test/test_context.py 
b/pypy/module/_decimal/test/test_context.py
--- a/pypy/module/_decimal/test/test_context.py
+++ b/pypy/module/_decimal/test/test_context.py
@@ -164,3 +164,84 @@
         self.assertRaises(TypeError, c.logical_xor, '1', 1)
         self.assertRaises(TypeError, c.logical_xor, 1, '1')
 
+    def test_is_finite(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_finite(Decimal(10))
+        self.assertEqual(c.is_finite(10), d)
+        self.assertRaises(TypeError, c.is_finite, '10')
+
+    def test_is_infinite(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_infinite(Decimal(10))
+        self.assertEqual(c.is_infinite(10), d)
+        self.assertRaises(TypeError, c.is_infinite, '10')
+
+    def test_is_nan(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_nan(Decimal(10))
+        self.assertEqual(c.is_nan(10), d)
+        self.assertRaises(TypeError, c.is_nan, '10')
+
+    def test_is_normal(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_normal(Decimal(10))
+        self.assertEqual(c.is_normal(10), d)
+        self.assertRaises(TypeError, c.is_normal, '10')
+
+    def test_is_qnan(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_qnan(Decimal(10))
+        self.assertEqual(c.is_qnan(10), d)
+        self.assertRaises(TypeError, c.is_qnan, '10')
+
+    def test_is_signed(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_signed(Decimal(10))
+        self.assertEqual(c.is_signed(10), d)
+        self.assertRaises(TypeError, c.is_signed, '10')
+
+    def test_is_snan(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_snan(Decimal(10))
+        self.assertEqual(c.is_snan(10), d)
+        self.assertRaises(TypeError, c.is_snan, '10')
+
+    def test_is_subnormal(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_subnormal(Decimal(10))
+        self.assertEqual(c.is_subnormal(10), d)
+        self.assertRaises(TypeError, c.is_subnormal, '10')
+
+    def test_is_zero(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.is_zero(Decimal(10))
+        self.assertEqual(c.is_zero(10), d)
+        self.assertRaises(TypeError, c.is_zero, '10')
+
diff --git a/rpython/rlib/rmpdec.py b/rpython/rlib/rmpdec.py
--- a/rpython/rlib/rmpdec.py
+++ b/rpython/rlib/rmpdec.py
@@ -46,7 +46,9 @@
         "mpd_maxcontext",
         "mpd_qnew", "mpd_del",
         "mpd_to_sci", "mpd_to_sci_size",
-        "mpd_iszero", "mpd_isnegative", "mpd_isinfinite", "mpd_isspecial",
+        "mpd_iszero", "mpd_isnegative", "mpd_issigned",
+        "mpd_isfinite", "mpd_isinfinite",
+        "mpd_isnormal", "mpd_issubnormal", "mpd_isspecial",
         "mpd_isnan", "mpd_issnan", "mpd_isqnan",
         "mpd_qcmp", "mpd_qcompare", "mpd_qcompare_signal",
         "mpd_qmin", "mpd_qmax", "mpd_qmin_mag", "mpd_qmax_mag",
@@ -233,8 +235,16 @@
     'mpd_iszero', [MPD_PTR], rffi.INT)
 mpd_isnegative = external(
     'mpd_isnegative', [MPD_PTR], rffi.INT)
+mpd_issigned = external(
+    'mpd_issigned', [MPD_PTR], rffi.INT)
+mpd_isfinite = external(
+    'mpd_isfinite', [MPD_PTR], rffi.INT)
 mpd_isinfinite = external(
     'mpd_isinfinite', [MPD_PTR], rffi.INT)
+mpd_isnormal = external(
+    'mpd_isnormal', [MPD_PTR, MPD_CONTEXT_PTR], rffi.INT)
+mpd_issubnormal = external(
+    'mpd_issubnormal', [MPD_PTR, MPD_CONTEXT_PTR], rffi.INT)
 mpd_isspecial = external(
     'mpd_isspecial', [MPD_PTR], rffi.INT)
 mpd_isnan = external(
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to