Mercurial > repos > rliterman > csp2
comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/include/python3.8/longintrepr.h @ 69:33d812a61356
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 17:55:14 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
67:0e9998148a16 | 69:33d812a61356 |
---|---|
1 #ifndef Py_LIMITED_API | |
2 #ifndef Py_LONGINTREPR_H | |
3 #define Py_LONGINTREPR_H | |
4 #ifdef __cplusplus | |
5 extern "C" { | |
6 #endif | |
7 | |
8 | |
9 /* This is published for the benefit of "friends" marshal.c and _decimal.c. */ | |
10 | |
11 /* Parameters of the integer representation. There are two different | |
12 sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit | |
13 integer type, and one set for 15-bit digits with each digit stored in an | |
14 unsigned short. The value of PYLONG_BITS_IN_DIGIT, defined either at | |
15 configure time or in pyport.h, is used to decide which digit size to use. | |
16 | |
17 Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits' | |
18 should be an unsigned integer type able to hold all integers up to | |
19 PyLong_BASE*PyLong_BASE-1. x_sub assumes that 'digit' is an unsigned type, | |
20 and that overflow is handled by taking the result modulo 2**N for some N > | |
21 PyLong_SHIFT. The majority of the code doesn't care about the precise | |
22 value of PyLong_SHIFT, but there are some notable exceptions: | |
23 | |
24 - long_pow() requires that PyLong_SHIFT be divisible by 5 | |
25 | |
26 - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8 | |
27 | |
28 - long_hash() requires that PyLong_SHIFT is *strictly* less than the number | |
29 of bits in an unsigned long, as do the PyLong <-> long (or unsigned long) | |
30 conversion functions | |
31 | |
32 - the Python int <-> size_t/Py_ssize_t conversion functions expect that | |
33 PyLong_SHIFT is strictly less than the number of bits in a size_t | |
34 | |
35 - the marshal code currently expects that PyLong_SHIFT is a multiple of 15 | |
36 | |
37 - NSMALLNEGINTS and NSMALLPOSINTS should be small enough to fit in a single | |
38 digit; with the current values this forces PyLong_SHIFT >= 9 | |
39 | |
40 The values 15 and 30 should fit all of the above requirements, on any | |
41 platform. | |
42 */ | |
43 | |
44 #if PYLONG_BITS_IN_DIGIT == 30 | |
45 typedef uint32_t digit; | |
46 typedef int32_t sdigit; /* signed variant of digit */ | |
47 typedef uint64_t twodigits; | |
48 typedef int64_t stwodigits; /* signed variant of twodigits */ | |
49 #define PyLong_SHIFT 30 | |
50 #define _PyLong_DECIMAL_SHIFT 9 /* max(e such that 10**e fits in a digit) */ | |
51 #define _PyLong_DECIMAL_BASE ((digit)1000000000) /* 10 ** DECIMAL_SHIFT */ | |
52 #elif PYLONG_BITS_IN_DIGIT == 15 | |
53 typedef unsigned short digit; | |
54 typedef short sdigit; /* signed variant of digit */ | |
55 typedef unsigned long twodigits; | |
56 typedef long stwodigits; /* signed variant of twodigits */ | |
57 #define PyLong_SHIFT 15 | |
58 #define _PyLong_DECIMAL_SHIFT 4 /* max(e such that 10**e fits in a digit) */ | |
59 #define _PyLong_DECIMAL_BASE ((digit)10000) /* 10 ** DECIMAL_SHIFT */ | |
60 #else | |
61 #error "PYLONG_BITS_IN_DIGIT should be 15 or 30" | |
62 #endif | |
63 #define PyLong_BASE ((digit)1 << PyLong_SHIFT) | |
64 #define PyLong_MASK ((digit)(PyLong_BASE - 1)) | |
65 | |
66 #if PyLong_SHIFT % 5 != 0 | |
67 #error "longobject.c requires that PyLong_SHIFT be divisible by 5" | |
68 #endif | |
69 | |
70 /* Long integer representation. | |
71 The absolute value of a number is equal to | |
72 SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) | |
73 Negative numbers are represented with ob_size < 0; | |
74 zero is represented by ob_size == 0. | |
75 In a normalized number, ob_digit[abs(ob_size)-1] (the most significant | |
76 digit) is never zero. Also, in all cases, for all valid i, | |
77 0 <= ob_digit[i] <= MASK. | |
78 The allocation function takes care of allocating extra memory | |
79 so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. | |
80 | |
81 CAUTION: Generic code manipulating subtypes of PyVarObject has to | |
82 aware that ints abuse ob_size's sign bit. | |
83 */ | |
84 | |
85 struct _longobject { | |
86 PyObject_VAR_HEAD | |
87 digit ob_digit[1]; | |
88 }; | |
89 | |
90 PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); | |
91 | |
92 /* Return a copy of src. */ | |
93 PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); | |
94 | |
95 #ifdef __cplusplus | |
96 } | |
97 #endif | |
98 #endif /* !Py_LONGINTREPR_H */ | |
99 #endif /* Py_LIMITED_API */ |