@@ -4382,19 +4382,11 @@ dec_##MPDFUNC(PyObject *self, PyObject *context) \
4382
4382
/* Binary function with an optional context arg. */
4383
4383
#define Dec_BinaryFuncVA (MPDFUNC ) \
4384
4384
static PyObject * \
4385
- dec_##MPDFUNC(PyObject *self, PyObject *args , PyObject *kwds) \
4385
+ dec_##MPDFUNC(PyObject *self, PyObject *other , PyObject *context) \
4386
4386
{ \
4387
- static char *kwlist[] = {"other", "context", NULL}; \
4388
- PyObject *other; \
4389
4387
PyObject *a, *b; \
4390
4388
PyObject *result; \
4391
- PyObject *context = Py_None; \
4392
4389
uint32_t status = 0; \
4393
- \
4394
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, \
4395
- &other, &context)) { \
4396
- return NULL; \
4397
- } \
4398
4390
decimal_state *state = \
4399
4391
get_module_state_by_def(Py_TYPE(self)); \
4400
4392
CONTEXT_CHECK_VA(state, context); \
@@ -4748,6 +4740,166 @@ Dec_BinaryFuncVA(mpd_qmin_mag)
4748
4740
Dec_BinaryFuncVA (mpd_qnext_toward )
4749
4741
Dec_BinaryFuncVA (mpd_qrem_near )
4750
4742
4743
+ /*[clinic input]
4744
+ _decimal.Decimal.compare
4745
+
4746
+ other: object
4747
+ context: object = None
4748
+
4749
+ Compare self to other.
4750
+
4751
+ Return a decimal value:
4752
+
4753
+ a or b is a NaN ==> Decimal('NaN')
4754
+ a < b ==> Decimal('-1')
4755
+ a == b ==> Decimal('0')
4756
+ a > b ==> Decimal('1')
4757
+ [clinic start generated code]*/
4758
+
4759
+ static PyObject *
4760
+ _decimal_Decimal_compare_impl (PyObject * self , PyObject * other ,
4761
+ PyObject * context )
4762
+ /*[clinic end generated code: output=d6967aa3578b9d48 input=1b7b75a2a154e520]*/
4763
+ {
4764
+ return dec_mpd_qcompare (self , other , context );
4765
+ }
4766
+
4767
+ /*[clinic input]
4768
+ _decimal.Decimal.compare_signal
4769
+
4770
+ other: object
4771
+ context: object = None
4772
+
4773
+ Identical to compare, except that all NaNs signal.
4774
+ [clinic start generated code]*/
4775
+
4776
+ static PyObject *
4777
+ _decimal_Decimal_compare_signal_impl (PyObject * self , PyObject * other ,
4778
+ PyObject * context )
4779
+ /*[clinic end generated code: output=0b8d0ff43f6c8a95 input=daf40eeaec81606f]*/
4780
+ {
4781
+ return dec_mpd_qcompare_signal (self , other , context );
4782
+ }
4783
+
4784
+ /*[clinic input]
4785
+ _decimal.Decimal.max
4786
+
4787
+ other: object
4788
+ context: object = None
4789
+
4790
+ Maximum of self and other.
4791
+
4792
+ If one operand is a quiet NaN and the other is numeric, the numeric
4793
+ operand is returned.
4794
+ [clinic start generated code]*/
4795
+
4796
+ static PyObject *
4797
+ _decimal_Decimal_max_impl (PyObject * self , PyObject * other , PyObject * context )
4798
+ /*[clinic end generated code: output=f3a5c5d76761c9ff input=3a04c62c08c1189a]*/
4799
+ {
4800
+ return dec_mpd_qmax (self , other , context );
4801
+ }
4802
+
4803
+ /*[clinic input]
4804
+ _decimal.Decimal.max_mag
4805
+
4806
+ other: object
4807
+ context: object = None
4808
+
4809
+ As the max() method, but compares the absolute values of the operands.
4810
+ [clinic start generated code]*/
4811
+
4812
+ static PyObject *
4813
+ _decimal_Decimal_max_mag_impl (PyObject * self , PyObject * other ,
4814
+ PyObject * context )
4815
+ /*[clinic end generated code: output=52b0451987bac65f input=2eebf864d8659574]*/
4816
+ {
4817
+ return dec_mpd_qmax_mag (self , other , context );
4818
+ }
4819
+
4820
+ /*[clinic input]
4821
+ _decimal.Decimal.min
4822
+
4823
+ other: object
4824
+ context: object = None
4825
+
4826
+ Minimum of self and other.
4827
+
4828
+ If one operand is a quiet NaN and the other is numeric, the numeric
4829
+ operand is returned.
4830
+ [clinic start generated code]*/
4831
+
4832
+ static PyObject *
4833
+ _decimal_Decimal_min_impl (PyObject * self , PyObject * other , PyObject * context )
4834
+ /*[clinic end generated code: output=d2f38ecb9d6f0493 input=01f01cd974c5441d]*/
4835
+ {
4836
+ return dec_mpd_qmin (self , other , context );
4837
+ }
4838
+
4839
+ /*[clinic input]
4840
+ _decimal.Decimal.min_mag
4841
+
4842
+ other: object
4843
+ context: object = None
4844
+
4845
+ As the min() method, but compares the absolute values of the operands.
4846
+ [clinic start generated code]*/
4847
+
4848
+ static PyObject *
4849
+ _decimal_Decimal_min_mag_impl (PyObject * self , PyObject * other ,
4850
+ PyObject * context )
4851
+ /*[clinic end generated code: output=aa3391935f6c8fc9 input=38f70dd313c8db83]*/
4852
+ {
4853
+ return dec_mpd_qmin_mag (self , other , context );
4854
+ }
4855
+
4856
+ /*[clinic input]
4857
+ _decimal.Decimal.next_toward
4858
+
4859
+ other: object
4860
+ context: object = None
4861
+
4862
+ Returns the number closest to self, in the direction towards other.
4863
+
4864
+ If the two operands are unequal, return the number closest to the first
4865
+ operand in the direction of the second operand. If both operands are
4866
+ numerically equal, return a copy of the first operand with the sign set
4867
+ to be the same as the sign of the second operand.
4868
+ [clinic start generated code]*/
4869
+
4870
+ static PyObject *
4871
+ _decimal_Decimal_next_toward_impl (PyObject * self , PyObject * other ,
4872
+ PyObject * context )
4873
+ /*[clinic end generated code: output=edb933755644af69 input=b03dc5ae977012a5]*/
4874
+ {
4875
+ return dec_mpd_qnext_toward (self , other , context );
4876
+ }
4877
+
4878
+ /*[clinic input]
4879
+ _decimal.Decimal.remainder_near
4880
+
4881
+ other: object
4882
+ context: object = None
4883
+
4884
+ Return the remainder from dividing self by other.
4885
+
4886
+ This differs from self % other in that the sign of the remainder is
4887
+ chosen so as to minimize its absolute value. More precisely, the return
4888
+ value is self - n * other where n is the integer nearest to the exact
4889
+ value of self / other, and if two integers are equally near then the
4890
+ even one is chosen.
4891
+
4892
+ If the result is zero then its sign will be the sign of self.
4893
+ [clinic start generated code]*/
4894
+
4895
+ static PyObject *
4896
+ _decimal_Decimal_remainder_near_impl (PyObject * self , PyObject * other ,
4897
+ PyObject * context )
4898
+ /*[clinic end generated code: output=6ce0fb3b0faff2f9 input=6f603d9f21378661]*/
4899
+ {
4900
+ return dec_mpd_qrem_near (self , other , context );
4901
+ }
4902
+
4751
4903
/* Ternary arithmetic functions, optional context arg */
4752
4904
Dec_TernaryFuncVA (mpd_qfma )
4753
4905
@@ -5146,6 +5298,125 @@ Dec_BinaryFuncVA(mpd_qrotate)
5146
5298
Dec_BinaryFuncVA (mpd_qscaleb )
5147
5299
Dec_BinaryFuncVA (mpd_qshift )
5148
5300
5301
+ /*[clinic input]
5302
+ _decimal.Decimal.logical_and
5303
+
5304
+ other: object
5305
+ context: object = None
5306
+
5307
+ Return the digit-wise 'and' of the two (logical) operands.
5308
+ [clinic start generated code]*/
5309
+
5310
+ static PyObject *
5311
+ _decimal_Decimal_logical_and_impl (PyObject * self , PyObject * other ,
5312
+ PyObject * context )
5313
+ /*[clinic end generated code: output=1526a357f97eaf71 input=84d2729d67fca057]*/
5314
+ {
5315
+ return dec_mpd_qand (self , other , context );
5316
+ }
5317
+
5318
+ /*[clinic input]
5319
+ _decimal.Decimal.logical_or
5320
+
5321
+ other: object
5322
+ context: object = None
5323
+
5324
+ Return the digit-wise 'or' of the two (logical) operands.
5325
+ [clinic start generated code]*/
5326
+
5327
+ static PyObject *
5328
+ _decimal_Decimal_logical_or_impl (PyObject * self , PyObject * other ,
5329
+ PyObject * context )
5330
+ /*[clinic end generated code: output=e57a72acf0982f56 input=03c8141eb7ff8020]*/
5331
+ {
5332
+ return dec_mpd_qor (self , other , context );
5333
+ }
5334
+
5335
+ /*[clinic input]
5336
+ _decimal.Decimal.logical_xor
5337
+
5338
+ other: object
5339
+ context: object = None
5340
+
5341
+ Return the digit-wise 'xor' of the two (logical) operands.
5342
+ [clinic start generated code]*/
5343
+
5344
+ static PyObject *
5345
+ _decimal_Decimal_logical_xor_impl (PyObject * self , PyObject * other ,
5346
+ PyObject * context )
5347
+ /*[clinic end generated code: output=ae3a7aeddde5a1a8 input=d154ad76a12595a7]*/
5348
+ {
5349
+ return dec_mpd_qxor (self , other , context );
5350
+ }
5351
+
5352
+ /*[clinic input]
5353
+ _decimal.Decimal.rotate
5354
+
5355
+ other: object
5356
+ context: object = None
5357
+
5358
+ Returns a rotated copy of self's digits, value-of-other times.
5359
+
5360
+ The second operand must be an integer in the range -precision through
5361
+ precision. The absolute value of the second operand gives the number of
5362
+ places to rotate. If the second operand is positive then rotation is to
5363
+ the left; otherwise rotation is to the right. The coefficient of the
5364
+ first operand is padded on the left with zeros to length precision if
5365
+ necessary. The sign and exponent of the first operand are unchanged.
5366
+ [clinic start generated code]*/
5367
+
5368
+ static PyObject *
5369
+ _decimal_Decimal_rotate_impl (PyObject * self , PyObject * other ,
5370
+ PyObject * context )
5371
+ /*[clinic end generated code: output=e59e757e70a8416a input=36574269f4b31d0c]*/
5372
+ {
5373
+ return dec_mpd_qrotate (self , other , context );
5374
+ }
5375
+
5376
+ /*[clinic input]
5377
+ _decimal.Decimal.scaleb
5378
+
5379
+ other: object
5380
+ context: object = None
5381
+
5382
+ Return the first operand with the exponent adjusted the second.
5383
+
5384
+ Equivalently, return the first operand multiplied by 10**other. The
5385
+ second operand must be an integer.
5386
+ [clinic start generated code]*/
5387
+
5388
+ static PyObject *
5389
+ _decimal_Decimal_scaleb_impl (PyObject * self , PyObject * other ,
5390
+ PyObject * context )
5391
+ /*[clinic end generated code: output=f01e99600eda34d7 input=de4ac7eb39f95991]*/
5392
+ {
5393
+ return dec_mpd_qscaleb (self , other , context );
5394
+ }
5395
+
5396
+ /*[clinic input]
5397
+ _decimal.Decimal.shift
5398
+
5399
+ other: object
5400
+ context: object = None
5401
+
5402
+ Returns a shifted copy of self's digits, value-of-other times.
5403
+
5404
+ The second operand must be an integer in the range -precision through
5405
+ precision. The absolute value of the second operand gives the number
5406
+ of places to shift. If the second operand is positive, then the shift
5407
+ is to the left; otherwise the shift is to the right. Digits shifted
5408
+ into the coefficient are zeros. The sign and exponent of the first
5409
+ operand are unchanged.
5410
+ [clinic start generated code]*/
5411
+
5412
+ static PyObject *
5413
+ _decimal_Decimal_shift_impl (PyObject * self , PyObject * other ,
5414
+ PyObject * context )
5415
+ /*[clinic end generated code: output=f79ff9ce6d5b05ed input=899b4d64fd3f76b8]*/
5416
+ {
5417
+ return dec_mpd_qshift (self , other , context );
5418
+ }
5419
+
5149
5420
/*[clinic input]
5150
5421
_decimal.Decimal.quantize
5151
5422
@@ -5542,15 +5813,15 @@ static PyMethodDef dec_methods [] =
5542
5813
_DECIMAL_DECIMAL_SQRT_METHODDEF
5543
5814
5544
5815
/* Binary arithmetic functions, optional context arg */
5545
- { "compare" , _PyCFunction_CAST ( dec_mpd_qcompare ), METH_VARARGS | METH_KEYWORDS , doc_compare },
5546
- { "compare_signal" , _PyCFunction_CAST ( dec_mpd_qcompare_signal ), METH_VARARGS | METH_KEYWORDS , doc_compare_signal },
5547
- { "max" , _PyCFunction_CAST ( dec_mpd_qmax ), METH_VARARGS | METH_KEYWORDS , doc_max },
5548
- { "max_mag" , _PyCFunction_CAST ( dec_mpd_qmax_mag ), METH_VARARGS | METH_KEYWORDS , doc_max_mag },
5549
- { "min" , _PyCFunction_CAST ( dec_mpd_qmin ), METH_VARARGS | METH_KEYWORDS , doc_min },
5550
- { "min_mag" , _PyCFunction_CAST ( dec_mpd_qmin_mag ), METH_VARARGS | METH_KEYWORDS , doc_min_mag },
5551
- { "next_toward" , _PyCFunction_CAST ( dec_mpd_qnext_toward ), METH_VARARGS | METH_KEYWORDS , doc_next_toward },
5816
+ _DECIMAL_DECIMAL_COMPARE_METHODDEF
5817
+ _DECIMAL_DECIMAL_COMPARE_SIGNAL_METHODDEF
5818
+ _DECIMAL_DECIMAL_MAX_METHODDEF
5819
+ _DECIMAL_DECIMAL_MAX_MAG_METHODDEF
5820
+ _DECIMAL_DECIMAL_MIN_METHODDEF
5821
+ _DECIMAL_DECIMAL_MIN_MAG_METHODDEF
5822
+ _DECIMAL_DECIMAL_NEXT_TOWARD_METHODDEF
5552
5823
_DECIMAL_DECIMAL_QUANTIZE_METHODDEF
5553
- { "remainder_near" , _PyCFunction_CAST ( dec_mpd_qrem_near ), METH_VARARGS | METH_KEYWORDS , doc_remainder_near },
5824
+ _DECIMAL_DECIMAL_REMAINDER_NEAR_METHODDEF
5554
5825
5555
5826
/* Ternary arithmetic functions, optional context arg */
5556
5827
_DECIMAL_DECIMAL_FMA_METHODDEF
@@ -5592,12 +5863,12 @@ static PyMethodDef dec_methods [] =
5592
5863
_DECIMAL_DECIMAL_SAME_QUANTUM_METHODDEF
5593
5864
5594
5865
/* Binary functions, optional context arg */
5595
- { "logical_and" , _PyCFunction_CAST ( dec_mpd_qand ), METH_VARARGS | METH_KEYWORDS , doc_logical_and },
5596
- { "logical_or" , _PyCFunction_CAST ( dec_mpd_qor ), METH_VARARGS | METH_KEYWORDS , doc_logical_or },
5597
- { "logical_xor" , _PyCFunction_CAST ( dec_mpd_qxor ), METH_VARARGS | METH_KEYWORDS , doc_logical_xor },
5598
- { "rotate" , _PyCFunction_CAST ( dec_mpd_qrotate ), METH_VARARGS | METH_KEYWORDS , doc_rotate },
5599
- { "scaleb" , _PyCFunction_CAST ( dec_mpd_qscaleb ), METH_VARARGS | METH_KEYWORDS , doc_scaleb },
5600
- { "shift" , _PyCFunction_CAST ( dec_mpd_qshift ), METH_VARARGS | METH_KEYWORDS , doc_shift },
5866
+ _DECIMAL_DECIMAL_LOGICAL_AND_METHODDEF
5867
+ _DECIMAL_DECIMAL_LOGICAL_OR_METHODDEF
5868
+ _DECIMAL_DECIMAL_LOGICAL_XOR_METHODDEF
5869
+ _DECIMAL_DECIMAL_ROTATE_METHODDEF
5870
+ _DECIMAL_DECIMAL_SCALEB_METHODDEF
5871
+ _DECIMAL_DECIMAL_SHIFT_METHODDEF
5601
5872
5602
5873
/* Miscellaneous */
5603
5874
_DECIMAL_DECIMAL_FROM_FLOAT_METHODDEF
0 commit comments