codekingpro/portable-devtools
115k
1#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_COMMON_H_
2#define NUMPY_CORE_INCLUDE_NUMPY_NPY_COMMON_H_
3
4/* need Python.h for npy_intp, npy_uintp */
5#include <Python.h>
6
7/* numpconfig.h is auto-generated */
8#include "numpyconfig.h"
9#ifdef HAVE_NPY_CONFIG_H
10#include <npy_config.h>
11#endif
12
13/*
14 * using static inline modifiers when defining npy_math functions
15 * allows the compiler to make optimizations when possible
16 */
17#ifndef NPY_INLINE_MATH
18#if defined(NPY_INTERNAL_BUILD) && NPY_INTERNAL_BUILD
19 #define NPY_INLINE_MATH 1
20#else
21 #define NPY_INLINE_MATH 0
22#endif
23#endif
24
25/*
26 * gcc does not unroll even with -O3
27 * use with care, unrolling on modern cpus rarely speeds things up
28 */
29#ifdef HAVE_ATTRIBUTE_OPTIMIZE_UNROLL_LOOPS
30#define NPY_GCC_UNROLL_LOOPS \
31 __attribute__((optimize("unroll-loops")))
32#else
33#define NPY_GCC_UNROLL_LOOPS
34#endif
35
36/* highest gcc optimization level, enabled autovectorizer */
37#ifdef HAVE_ATTRIBUTE_OPTIMIZE_OPT_3
38#define NPY_GCC_OPT_3 __attribute__((optimize("O3")))
39#else
40#define NPY_GCC_OPT_3
41#endif
42
43/*
44 * mark an argument (starting from 1) that must not be NULL and is not checked
45 * DO NOT USE IF FUNCTION CHECKS FOR NULL!! the compiler will remove the check
46 */
47#ifdef HAVE_ATTRIBUTE_NONNULL
48#define NPY_GCC_NONNULL(n) __attribute__((nonnull(n)))
49#else
50#define NPY_GCC_NONNULL(n)
51#endif
52
53/*
54 * give a hint to the compiler which branch is more likely or unlikely
55 * to occur, e.g. rare error cases:
56 *
57 * if (NPY_UNLIKELY(failure == 0))
58 * return NULL;
59 *
60 * the double !! is to cast the expression (e.g. NULL) to a boolean required by
61 * the intrinsic
62 */
63#ifdef HAVE___BUILTIN_EXPECT
64#define NPY_LIKELY(x) __builtin_expect(!!(x), 1)
65#define NPY_UNLIKELY(x) __builtin_expect(!!(x), 0)
66#else
67#define NPY_LIKELY(x) (x)
68#define NPY_UNLIKELY(x) (x)
69#endif
70
71#ifdef HAVE___BUILTIN_PREFETCH
72/* unlike _mm_prefetch also works on non-x86 */
73#define NPY_PREFETCH(x, rw, loc) __builtin_prefetch((x), (rw), (loc))
74#else
75#ifdef NPY_HAVE_SSE
76/* _MM_HINT_ET[01] (rw = 1) unsupported, only available in gcc >= 4.9 */
77#define NPY_PREFETCH(x, rw, loc) _mm_prefetch((x), loc == 0 ? _MM_HINT_NTA : \
78 (loc == 1 ? _MM_HINT_T2 : \
79 (loc == 2 ? _MM_HINT_T1 : \
80 (loc == 3 ? _MM_HINT_T0 : -1))))
81#else
82#define NPY_PREFETCH(x, rw,loc)
83#endif
84#endif
85
86/* `NPY_INLINE` kept for backwards compatibility; use `inline` instead */
87#if defined(_MSC_VER) && !defined(__clang__)
88 #define NPY_INLINE __inline
89/* clang included here to handle clang-cl on Windows */
90#elif defined(__GNUC__) || defined(__clang__)
91 #if defined(__STRICT_ANSI__)
92 #define NPY_INLINE __inline__
93 #else
94 #define NPY_INLINE inline
95 #endif
96#else
97 #define NPY_INLINE
98#endif
99
100#ifdef _MSC_VER
101 #ifdef __cplusplus
102 #define NPY_FINLINE __forceinline
103 #else
104 #define NPY_FINLINE static __forceinline
105 #endif
106#elif defined(__GNUC__)
107 #ifdef __cplusplus
108 #define NPY_FINLINE inline __attribute__((always_inline))
109 #else
110 #define NPY_FINLINE static inline __attribute__((always_inline))
111 #endif
112#else
113 #ifdef __cplusplus
114 #define NPY_FINLINE inline
115 #else
116 #define NPY_FINLINE static NPY_INLINE
117 #endif
118#endif
119
120#if defined(_MSC_VER)
121 #define NPY_NOINLINE static __declspec(noinline)
122#elif defined(__GNUC__) || defined(__clang__)
123 #define NPY_NOINLINE static __attribute__((noinline))
124#else
125 #define NPY_NOINLINE static
126#endif
127
128#ifdef __cplusplus
129 #define NPY_TLS thread_local
130#elif defined(HAVE_THREAD_LOCAL)
131 #define NPY_TLS thread_local
132#elif defined(HAVE__THREAD_LOCAL)
133 #define NPY_TLS _Thread_local
134#elif defined(HAVE___THREAD)
135 #define NPY_TLS __thread
136#elif defined(HAVE___DECLSPEC_THREAD_)
137 #define NPY_TLS __declspec(thread)
138#else
139 #define NPY_TLS
140#endif
141
142#ifdef WITH_CPYCHECKER_RETURNS_BORROWED_REF_ATTRIBUTE
143 #define NPY_RETURNS_BORROWED_REF \
144 __attribute__((cpychecker_returns_borrowed_ref))
145#else
146 #define NPY_RETURNS_BORROWED_REF
147#endif
148
149#ifdef WITH_CPYCHECKER_STEALS_REFERENCE_TO_ARG_ATTRIBUTE
150 #define NPY_STEALS_REF_TO_ARG(n) \
151 __attribute__((cpychecker_steals_reference_to_arg(n)))
152#else
153 #define NPY_STEALS_REF_TO_ARG(n)
154#endif
155
156/* 64 bit file position support, also on win-amd64. Issue gh-2256 */
157#if defined(_MSC_VER) && defined(_WIN64) && (_MSC_VER > 1400) || \
158 defined(__MINGW32__) || defined(__MINGW64__)
159 #include <io.h>
160
161 #define npy_fseek _fseeki64
162 #define npy_ftell _ftelli64
163 #define npy_lseek _lseeki64
164 #define npy_off_t npy_int64
165
166 #if NPY_SIZEOF_INT == 8
167 #define NPY_OFF_T_PYFMT "i"
168 #elif NPY_SIZEOF_LONG == 8
169 #define NPY_OFF_T_PYFMT "l"
170 #elif NPY_SIZEOF_LONGLONG == 8
171 #define NPY_OFF_T_PYFMT "L"
172 #else
173 #error Unsupported size for type off_t
174 #endif
175#else
176#ifdef HAVE_FSEEKO
177 #define npy_fseek fseeko
178#else
179 #define npy_fseek fseek
180#endif
181#ifdef HAVE_FTELLO
182 #define npy_ftell ftello
183#else
184 #define npy_ftell ftell
185#endif
186 #include <sys/types.h>
187 #ifndef _WIN32
188 #include <unistd.h>
189 #endif
190 #define npy_lseek lseek
191 #define npy_off_t off_t
192
193 #if NPY_SIZEOF_OFF_T == NPY_SIZEOF_SHORT
194 #define NPY_OFF_T_PYFMT "h"
195 #elif NPY_SIZEOF_OFF_T == NPY_SIZEOF_INT
196 #define NPY_OFF_T_PYFMT "i"
197 #elif NPY_SIZEOF_OFF_T == NPY_SIZEOF_LONG
198 #define NPY_OFF_T_PYFMT "l"
199 #elif NPY_SIZEOF_OFF_T == NPY_SIZEOF_LONGLONG
200 #define NPY_OFF_T_PYFMT "L"
201 #else
202 #error Unsupported size for type off_t
203 #endif
204#endif
205
206/* enums for detected endianness */
207enum {
208 NPY_CPU_UNKNOWN_ENDIAN,
209 NPY_CPU_LITTLE,
210 NPY_CPU_BIG
211};
212
213/*
214 * This is to typedef npy_intp to the appropriate size for Py_ssize_t.
215 * (Before NumPy 2.0 we used Py_intptr_t and Py_uintptr_t from `pyport.h`.)
216 */
217typedef Py_ssize_t npy_intp;
218typedef size_t npy_uintp;
219
220/*
221 * Define sizes that were not defined in numpyconfig.h.
222 */
223#define NPY_SIZEOF_CHAR 1
224#define NPY_SIZEOF_BYTE 1
225#define NPY_SIZEOF_DATETIME 8
226#define NPY_SIZEOF_TIMEDELTA 8
227#define NPY_SIZEOF_HALF 2
228#define NPY_SIZEOF_CFLOAT NPY_SIZEOF_COMPLEX_FLOAT
229#define NPY_SIZEOF_CDOUBLE NPY_SIZEOF_COMPLEX_DOUBLE
230#define NPY_SIZEOF_CLONGDOUBLE NPY_SIZEOF_COMPLEX_LONGDOUBLE
231
232#ifdef constchar
233#undef constchar
234#endif
235
236#define NPY_SSIZE_T_PYFMT "n"
237#define constchar char
238
239/* NPY_INTP_FMT Note:
240 * Unlike the other NPY_*_FMT macros, which are used with PyOS_snprintf,
241 * NPY_INTP_FMT is used with PyErr_Format and PyUnicode_FromFormat. Those
242 * functions use different formatting codes that are portably specified
243 * according to the Python documentation. See issue gh-2388.
244 */
245#if NPY_SIZEOF_INTP == NPY_SIZEOF_LONG
246 #define NPY_INTP NPY_LONG
247 #define NPY_UINTP NPY_ULONG
248 #define PyIntpArrType_Type PyLongArrType_Type
249 #define PyUIntpArrType_Type PyULongArrType_Type
250 #define NPY_MAX_INTP NPY_MAX_LONG
251 #define NPY_MIN_INTP NPY_MIN_LONG
252 #define NPY_MAX_UINTP NPY_MAX_ULONG
253 #define NPY_INTP_FMT "ld"
254#elif NPY_SIZEOF_INTP == NPY_SIZEOF_INT
255 #define NPY_INTP NPY_INT
256 #define NPY_UINTP NPY_UINT
257 #define PyIntpArrType_Type PyIntArrType_Type
258 #define PyUIntpArrType_Type PyUIntArrType_Type
259 #define NPY_MAX_INTP NPY_MAX_INT
260 #define NPY_MIN_INTP NPY_MIN_INT
261 #define NPY_MAX_UINTP NPY_MAX_UINT
262 #define NPY_INTP_FMT "d"
263#elif defined(PY_LONG_LONG) && (NPY_SIZEOF_INTP == NPY_SIZEOF_LONGLONG)
264 #define NPY_INTP NPY_LONGLONG
265 #define NPY_UINTP NPY_ULONGLONG
266 #define PyIntpArrType_Type PyLongLongArrType_Type
267 #define PyUIntpArrType_Type PyULongLongArrType_Type
268 #define NPY_MAX_INTP NPY_MAX_LONGLONG
269 #define NPY_MIN_INTP NPY_MIN_LONGLONG
270 #define NPY_MAX_UINTP NPY_MAX_ULONGLONG
271 #define NPY_INTP_FMT "lld"
272#else
273 #error "Failed to correctly define NPY_INTP and NPY_UINTP"
274#endif
275
276
277/*
278 * Some platforms don't define bool, long long, or long double.
279 * Handle that here.
280 */
281#define NPY_BYTE_FMT "hhd"
282#define NPY_UBYTE_FMT "hhu"
283#define NPY_SHORT_FMT "hd"
284#define NPY_USHORT_FMT "hu"
285#define NPY_INT_FMT "d"
286#define NPY_UINT_FMT "u"
287#define NPY_LONG_FMT "ld"
288#define NPY_ULONG_FMT "lu"
289#define NPY_HALF_FMT "g"
290#define NPY_FLOAT_FMT "g"
291#define NPY_DOUBLE_FMT "g"
292
293
294#ifdef PY_LONG_LONG
295typedef PY_LONG_LONG npy_longlong;
296typedef unsigned PY_LONG_LONG npy_ulonglong;
297# ifdef _MSC_VER
298# define NPY_LONGLONG_FMT "I64d"
299# define NPY_ULONGLONG_FMT "I64u"
300# else
301# define NPY_LONGLONG_FMT "lld"
302# define NPY_ULONGLONG_FMT "llu"
303# endif
304# ifdef _MSC_VER
305# define NPY_LONGLONG_SUFFIX(x) (x##i64)
306# define NPY_ULONGLONG_SUFFIX(x) (x##Ui64)
307# else
308# define NPY_LONGLONG_SUFFIX(x) (x##LL)
309# define NPY_ULONGLONG_SUFFIX(x) (x##ULL)
310# endif
311#else
312typedef long npy_longlong;
313typedef unsigned long npy_ulonglong;
314# define NPY_LONGLONG_SUFFIX(x) (x##L)
315# define NPY_ULONGLONG_SUFFIX(x) (x##UL)
316#endif
317
318
319typedef unsigned char npy_bool;
320#define NPY_FALSE 0
321#define NPY_TRUE 1
322/*
323 * `NPY_SIZEOF_LONGDOUBLE` isn't usually equal to sizeof(long double).
324 * In some certain cases, it may forced to be equal to sizeof(double)
325 * even against the compiler implementation and the same goes for
326 * `complex long double`.
327 *
328 * Therefore, avoid `long double`, use `npy_longdouble` instead,
329 * and when it comes to standard math functions make sure of using
330 * the double version when `NPY_SIZEOF_LONGDOUBLE` == `NPY_SIZEOF_DOUBLE`.
331 * For example:
332 * npy_longdouble *ptr, x;
333 * #if NPY_SIZEOF_LONGDOUBLE == NPY_SIZEOF_DOUBLE
334 * npy_longdouble r = modf(x, ptr);
335 * #else
336 * npy_longdouble r = modfl(x, ptr);
337 * #endif
338 *
339 * See https://github.com/numpy/numpy/issues/20348
340 */
341#if NPY_SIZEOF_LONGDOUBLE == NPY_SIZEOF_DOUBLE
342 #define NPY_LONGDOUBLE_FMT "g"
343 #define longdouble_t double
344 typedef double npy_longdouble;
345#else
346 #define NPY_LONGDOUBLE_FMT "Lg"
347 #define longdouble_t long double
348 typedef long double npy_longdouble;
349#endif
350
351#ifndef Py_USING_UNICODE
352#error Must use Python with unicode enabled.
353#endif
354
355
356typedef signed char npy_byte;
357typedef unsigned char npy_ubyte;
358typedef unsigned short npy_ushort;
359typedef unsigned int npy_uint;
360typedef unsigned long npy_ulong;
361
362/* These are for completeness */
363typedef char npy_char;
364typedef short npy_short;
365typedef int npy_int;
366typedef long npy_long;
367typedef float npy_float;
368typedef double npy_double;
369
370typedef Py_hash_t npy_hash_t;
371#define NPY_SIZEOF_HASH_T NPY_SIZEOF_INTP
372
373#if defined(__cplusplus)
374
375typedef struct
376{
377 double _Val[2];
378} npy_cdouble;
379
380typedef struct
381{
382 float _Val[2];
383} npy_cfloat;
384
385typedef struct
386{
387 long double _Val[2];
388} npy_clongdouble;
389
390#else
391
392#include <complex.h>
393
394
395#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
396typedef _Dcomplex npy_cdouble;
397typedef _Fcomplex npy_cfloat;
398typedef _Lcomplex npy_clongdouble;
399#else /* !defined(_MSC_VER) || defined(__INTEL_COMPILER) */
400typedef double _Complex npy_cdouble;
401typedef float _Complex npy_cfloat;
402typedef longdouble_t _Complex npy_clongdouble;
403#endif
404
405#endif
406
407/*
408 * numarray-style bit-width typedefs
409 */
410#define NPY_MAX_INT8 127
411#define NPY_MIN_INT8 -128
412#define NPY_MAX_UINT8 255
413#define NPY_MAX_INT16 32767
414#define NPY_MIN_INT16 -32768
415#define NPY_MAX_UINT16 65535
416#define NPY_MAX_INT32 2147483647
417#define NPY_MIN_INT32 (-NPY_MAX_INT32 - 1)
418#define NPY_MAX_UINT32 4294967295U
419#define NPY_MAX_INT64 NPY_LONGLONG_SUFFIX(9223372036854775807)
420#define NPY_MIN_INT64 (-NPY_MAX_INT64 - NPY_LONGLONG_SUFFIX(1))
421#define NPY_MAX_UINT64 NPY_ULONGLONG_SUFFIX(18446744073709551615)
422#define NPY_MAX_INT128 NPY_LONGLONG_SUFFIX(85070591730234615865843651857942052864)
423#define NPY_MIN_INT128 (-NPY_MAX_INT128 - NPY_LONGLONG_SUFFIX(1))
424#define NPY_MAX_UINT128 NPY_ULONGLONG_SUFFIX(170141183460469231731687303715884105728)
425#define NPY_MIN_DATETIME NPY_MIN_INT64
426#define NPY_MAX_DATETIME NPY_MAX_INT64
427#define NPY_MIN_TIMEDELTA NPY_MIN_INT64
428#define NPY_MAX_TIMEDELTA NPY_MAX_INT64
429
430 /* Need to find the number of bits for each type and
431 make definitions accordingly.
432
433 C states that sizeof(char) == 1 by definition
434
435 So, just using the sizeof keyword won't help.
436
437 It also looks like Python itself uses sizeof(char) quite a
438 bit, which by definition should be 1 all the time.
439
440 Idea: Make Use of CHAR_BIT which should tell us how many
441 BITS per CHARACTER
442 */
443
444 /* Include platform definitions -- These are in the C89/90 standard */
445#include <limits.h>
446#define NPY_MAX_BYTE SCHAR_MAX
447#define NPY_MIN_BYTE SCHAR_MIN
448#define NPY_MAX_UBYTE UCHAR_MAX
449#define NPY_MAX_SHORT SHRT_MAX
450#define NPY_MIN_SHORT SHRT_MIN
451#define NPY_MAX_USHORT USHRT_MAX
452#define NPY_MAX_INT INT_MAX
453#ifndef INT_MIN
454#define INT_MIN (-INT_MAX - 1)
455#endif
456#define NPY_MIN_INT INT_MIN
457#define NPY_MAX_UINT UINT_MAX
458#define NPY_MAX_LONG LONG_MAX
459#define NPY_MIN_LONG LONG_MIN
460#define NPY_MAX_ULONG ULONG_MAX
461
462#define NPY_BITSOF_BOOL (sizeof(npy_bool) * CHAR_BIT)
463#define NPY_BITSOF_CHAR CHAR_BIT
464#define NPY_BITSOF_BYTE (NPY_SIZEOF_BYTE * CHAR_BIT)
465#define NPY_BITSOF_SHORT (NPY_SIZEOF_SHORT * CHAR_BIT)
466#define NPY_BITSOF_INT (NPY_SIZEOF_INT * CHAR_BIT)
467#define NPY_BITSOF_LONG (NPY_SIZEOF_LONG * CHAR_BIT)
468#define NPY_BITSOF_LONGLONG (NPY_SIZEOF_LONGLONG * CHAR_BIT)
469#define NPY_BITSOF_INTP (NPY_SIZEOF_INTP * CHAR_BIT)
470#define NPY_BITSOF_HALF (NPY_SIZEOF_HALF * CHAR_BIT)
471#define NPY_BITSOF_FLOAT (NPY_SIZEOF_FLOAT * CHAR_BIT)
472#define NPY_BITSOF_DOUBLE (NPY_SIZEOF_DOUBLE * CHAR_BIT)
473#define NPY_BITSOF_LONGDOUBLE (NPY_SIZEOF_LONGDOUBLE * CHAR_BIT)
474#define NPY_BITSOF_CFLOAT (NPY_SIZEOF_CFLOAT * CHAR_BIT)
475#define NPY_BITSOF_CDOUBLE (NPY_SIZEOF_CDOUBLE * CHAR_BIT)
476#define NPY_BITSOF_CLONGDOUBLE (NPY_SIZEOF_CLONGDOUBLE * CHAR_BIT)
477#define NPY_BITSOF_DATETIME (NPY_SIZEOF_DATETIME * CHAR_BIT)
478#define NPY_BITSOF_TIMEDELTA (NPY_SIZEOF_TIMEDELTA * CHAR_BIT)
479
480#if NPY_BITSOF_LONG == 8
481#define NPY_INT8 NPY_LONG
482#define NPY_UINT8 NPY_ULONG
483 typedef long npy_int8;
484 typedef unsigned long npy_uint8;
485#define PyInt8ScalarObject PyLongScalarObject
486#define PyInt8ArrType_Type PyLongArrType_Type
487#define PyUInt8ScalarObject PyULongScalarObject
488#define PyUInt8ArrType_Type PyULongArrType_Type
489#define NPY_INT8_FMT NPY_LONG_FMT
490#define NPY_UINT8_FMT NPY_ULONG_FMT
491#elif NPY_BITSOF_LONG == 16
492#define NPY_INT16 NPY_LONG
493#define NPY_UINT16 NPY_ULONG
494 typedef long npy_int16;
495 typedef unsigned long npy_uint16;
496#define PyInt16ScalarObject PyLongScalarObject
497#define PyInt16ArrType_Type PyLongArrType_Type
498#define PyUInt16ScalarObject PyULongScalarObject
499#define PyUInt16ArrType_Type PyULongArrType_Type
500#define NPY_INT16_FMT NPY_LONG_FMT
501#define NPY_UINT16_FMT NPY_ULONG_FMT
502#elif NPY_BITSOF_LONG == 32
503#define NPY_INT32 NPY_LONG
504#define NPY_UINT32 NPY_ULONG
505 typedef long npy_int32;
506 typedef unsigned long npy_uint32;
507 typedef unsigned long npy_ucs4;
508#define PyInt32ScalarObject PyLongScalarObject
509#define PyInt32ArrType_Type PyLongArrType_Type
510#define PyUInt32ScalarObject PyULongScalarObject
511#define PyUInt32ArrType_Type PyULongArrType_Type
512#define NPY_INT32_FMT NPY_LONG_FMT
513#define NPY_UINT32_FMT NPY_ULONG_FMT
514#elif NPY_BITSOF_LONG == 64
515#define NPY_INT64 NPY_LONG
516#define NPY_UINT64 NPY_ULONG
517 typedef long npy_int64;
518 typedef unsigned long npy_uint64;
519#define PyInt64ScalarObject PyLongScalarObject
520#define PyInt64ArrType_Type PyLongArrType_Type
521#define PyUInt64ScalarObject PyULongScalarObject
522#define PyUInt64ArrType_Type PyULongArrType_Type
523#define NPY_INT64_FMT NPY_LONG_FMT
524#define NPY_UINT64_FMT NPY_ULONG_FMT
525#define MyPyLong_FromInt64 PyLong_FromLong
526#define MyPyLong_AsInt64 PyLong_AsLong
527#endif
528
529#if NPY_BITSOF_LONGLONG == 8
530# ifndef NPY_INT8
531# define NPY_INT8 NPY_LONGLONG
532# define NPY_UINT8 NPY_ULONGLONG
533 typedef npy_longlong npy_int8;
534 typedef npy_ulonglong npy_uint8;
535# define PyInt8ScalarObject PyLongLongScalarObject
536# define PyInt8ArrType_Type PyLongLongArrType_Type
537# define PyUInt8ScalarObject PyULongLongScalarObject
538# define PyUInt8ArrType_Type PyULongLongArrType_Type
539#define NPY_INT8_FMT NPY_LONGLONG_FMT
540#define NPY_UINT8_FMT NPY_ULONGLONG_FMT
541# endif
542# define NPY_MAX_LONGLONG NPY_MAX_INT8
543# define NPY_MIN_LONGLONG NPY_MIN_INT8
544# define NPY_MAX_ULONGLONG NPY_MAX_UINT8
545#elif NPY_BITSOF_LONGLONG == 16
546# ifndef NPY_INT16
547# define NPY_INT16 NPY_LONGLONG
548# define NPY_UINT16 NPY_ULONGLONG
549 typedef npy_longlong npy_int16;
550 typedef npy_ulonglong npy_uint16;
551# define PyInt16ScalarObject PyLongLongScalarObject
552# define PyInt16ArrType_Type PyLongLongArrType_Type
553# define PyUInt16ScalarObject PyULongLongScalarObject
554# define PyUInt16ArrType_Type PyULongLongArrType_Type
555#define NPY_INT16_FMT NPY_LONGLONG_FMT
556#define NPY_UINT16_FMT NPY_ULONGLONG_FMT
557# endif
558# define NPY_MAX_LONGLONG NPY_MAX_INT16
559# define NPY_MIN_LONGLONG NPY_MIN_INT16
560# define NPY_MAX_ULONGLONG NPY_MAX_UINT16
561#elif NPY_BITSOF_LONGLONG == 32
562# ifndef NPY_INT32
563# define NPY_INT32 NPY_LONGLONG
564# define NPY_UINT32 NPY_ULONGLONG
565 typedef npy_longlong npy_int32;
566 typedef npy_ulonglong npy_uint32;
567 typedef npy_ulonglong npy_ucs4;
568# define PyInt32ScalarObject PyLongLongScalarObject
569# define PyInt32ArrType_Type PyLongLongArrType_Type
570# define PyUInt32ScalarObject PyULongLongScalarObject
571# define PyUInt32ArrType_Type PyULongLongArrType_Type
572#define NPY_INT32_FMT NPY_LONGLONG_FMT
573#define NPY_UINT32_FMT NPY_ULONGLONG_FMT
574# endif
575# define NPY_MAX_LONGLONG NPY_MAX_INT32
576# define NPY_MIN_LONGLONG NPY_MIN_INT32
577# define NPY_MAX_ULONGLONG NPY_MAX_UINT32
578#elif NPY_BITSOF_LONGLONG == 64
579# ifndef NPY_INT64
580# define NPY_INT64 NPY_LONGLONG
581# define NPY_UINT64 NPY_ULONGLONG
582 typedef npy_longlong npy_int64;
583 typedef npy_ulonglong npy_uint64;
584# define PyInt64ScalarObject PyLongLongScalarObject
585# define PyInt64ArrType_Type PyLongLongArrType_Type
586# define PyUInt64ScalarObject PyULongLongScalarObject
587# define PyUInt64ArrType_Type PyULongLongArrType_Type
588#define NPY_INT64_FMT NPY_LONGLONG_FMT
589#define NPY_UINT64_FMT NPY_ULONGLONG_FMT
590# define MyPyLong_FromInt64 PyLong_FromLongLong
591# define MyPyLong_AsInt64 PyLong_AsLongLong
592# endif
593# define NPY_MAX_LONGLONG NPY_MAX_INT64
594# define NPY_MIN_LONGLONG NPY_MIN_INT64
595# define NPY_MAX_ULONGLONG NPY_MAX_UINT64
596#endif
597
598#if NPY_BITSOF_INT == 8
599#ifndef NPY_INT8
600#define NPY_INT8 NPY_INT
601#define NPY_UINT8 NPY_UINT
602 typedef int npy_int8;
603 typedef unsigned int npy_uint8;
604# define PyInt8ScalarObject PyIntScalarObject
605# define PyInt8ArrType_Type PyIntArrType_Type
606# define PyUInt8ScalarObject PyUIntScalarObject
607# define PyUInt8ArrType_Type PyUIntArrType_Type
608#define NPY_INT8_FMT NPY_INT_FMT
609#define NPY_UINT8_FMT NPY_UINT_FMT
610#endif
611#elif NPY_BITSOF_INT == 16
612#ifndef NPY_INT16
613#define NPY_INT16 NPY_INT
614#define NPY_UINT16 NPY_UINT
615 typedef int npy_int16;
616 typedef unsigned int npy_uint16;
617# define PyInt16ScalarObject PyIntScalarObject
618# define PyInt16ArrType_Type PyIntArrType_Type
619# define PyUInt16ScalarObject PyIntUScalarObject
620# define PyUInt16ArrType_Type PyIntUArrType_Type
621#define NPY_INT16_FMT NPY_INT_FMT
622#define NPY_UINT16_FMT NPY_UINT_FMT
623#endif
624#elif NPY_BITSOF_INT == 32
625#ifndef NPY_INT32
626#define NPY_INT32 NPY_INT
627#define NPY_UINT32 NPY_UINT
628 typedef int npy_int32;
629 typedef unsigned int npy_uint32;
630 typedef unsigned int npy_ucs4;
631# define PyInt32ScalarObject PyIntScalarObject
632# define PyInt32ArrType_Type PyIntArrType_Type
633# define PyUInt32ScalarObject PyUIntScalarObject
634# define PyUInt32ArrType_Type PyUIntArrType_Type
635#define NPY_INT32_FMT NPY_INT_FMT
636#define NPY_UINT32_FMT NPY_UINT_FMT
637#endif
638#elif NPY_BITSOF_INT == 64
639#ifndef NPY_INT64
640#define NPY_INT64 NPY_INT
641#define NPY_UINT64 NPY_UINT
642 typedef int npy_int64;
643 typedef unsigned int npy_uint64;
644# define PyInt64ScalarObject PyIntScalarObject
645# define PyInt64ArrType_Type PyIntArrType_Type
646# define PyUInt64ScalarObject PyUIntScalarObject
647# define PyUInt64ArrType_Type PyUIntArrType_Type
648#define NPY_INT64_FMT NPY_INT_FMT
649#define NPY_UINT64_FMT NPY_UINT_FMT
650# define MyPyLong_FromInt64 PyLong_FromLong
651# define MyPyLong_AsInt64 PyLong_AsLong
652#endif
653#endif
654
655#if NPY_BITSOF_SHORT == 8
656#ifndef NPY_INT8
657#define NPY_INT8 NPY_SHORT
658#define NPY_UINT8 NPY_USHORT
659 typedef short npy_int8;
660 typedef unsigned short npy_uint8;
661# define PyInt8ScalarObject PyShortScalarObject
662# define PyInt8ArrType_Type PyShortArrType_Type
663# define PyUInt8ScalarObject PyUShortScalarObject
664# define PyUInt8ArrType_Type PyUShortArrType_Type
665#define NPY_INT8_FMT NPY_SHORT_FMT
666#define NPY_UINT8_FMT NPY_USHORT_FMT
667#endif
668#elif NPY_BITSOF_SHORT == 16
669#ifndef NPY_INT16
670#define NPY_INT16 NPY_SHORT
671#define NPY_UINT16 NPY_USHORT
672 typedef short npy_int16;
673 typedef unsigned short npy_uint16;
674# define PyInt16ScalarObject PyShortScalarObject
675# define PyInt16ArrType_Type PyShortArrType_Type
676# define PyUInt16ScalarObject PyUShortScalarObject
677# define PyUInt16ArrType_Type PyUShortArrType_Type
678#define NPY_INT16_FMT NPY_SHORT_FMT
679#define NPY_UINT16_FMT NPY_USHORT_FMT
680#endif
681#elif NPY_BITSOF_SHORT == 32
682#ifndef NPY_INT32
683#define NPY_INT32 NPY_SHORT
684#define NPY_UINT32 NPY_USHORT
685 typedef short npy_int32;
686 typedef unsigned short npy_uint32;
687 typedef unsigned short npy_ucs4;
688# define PyInt32ScalarObject PyShortScalarObject
689# define PyInt32ArrType_Type PyShortArrType_Type
690# define PyUInt32ScalarObject PyUShortScalarObject
691# define PyUInt32ArrType_Type PyUShortArrType_Type
692#define NPY_INT32_FMT NPY_SHORT_FMT
693#define NPY_UINT32_FMT NPY_USHORT_FMT
694#endif
695#elif NPY_BITSOF_SHORT == 64
696#ifndef NPY_INT64
697#define NPY_INT64 NPY_SHORT
698#define NPY_UINT64 NPY_USHORT
699 typedef short npy_int64;
700 typedef unsigned short npy_uint64;
701# define PyInt64ScalarObject PyShortScalarObject
702# define PyInt64ArrType_Type PyShortArrType_Type
703# define PyUInt64ScalarObject PyUShortScalarObject
704# define PyUInt64ArrType_Type PyUShortArrType_Type
705#define NPY_INT64_FMT NPY_SHORT_FMT
706#define NPY_UINT64_FMT NPY_USHORT_FMT
707# define MyPyLong_FromInt64 PyLong_FromLong
708# define MyPyLong_AsInt64 PyLong_AsLong
709#endif
710#endif
711
712
713#if NPY_BITSOF_CHAR == 8
714#ifndef NPY_INT8
715#define NPY_INT8 NPY_BYTE
716#define NPY_UINT8 NPY_UBYTE
717 typedef signed char npy_int8;
718 typedef unsigned char npy_uint8;
719# define PyInt8ScalarObject PyByteScalarObject
720# define PyInt8ArrType_Type PyByteArrType_Type
721# define PyUInt8ScalarObject PyUByteScalarObject
722# define PyUInt8ArrType_Type PyUByteArrType_Type
723#define NPY_INT8_FMT NPY_BYTE_FMT
724#define NPY_UINT8_FMT NPY_UBYTE_FMT
725#endif
726#elif NPY_BITSOF_CHAR == 16
727#ifndef NPY_INT16
728#define NPY_INT16 NPY_BYTE
729#define NPY_UINT16 NPY_UBYTE
730 typedef signed char npy_int16;
731 typedef unsigned char npy_uint16;
732# define PyInt16ScalarObject PyByteScalarObject
733# define PyInt16ArrType_Type PyByteArrType_Type
734# define PyUInt16ScalarObject PyUByteScalarObject
735# define PyUInt16ArrType_Type PyUByteArrType_Type
736#define NPY_INT16_FMT NPY_BYTE_FMT
737#define NPY_UINT16_FMT NPY_UBYTE_FMT
738#endif
739#elif NPY_BITSOF_CHAR == 32
740#ifndef NPY_INT32
741#define NPY_INT32 NPY_BYTE
742#define NPY_UINT32 NPY_UBYTE
743 typedef signed char npy_int32;
744 typedef unsigned char npy_uint32;
745 typedef unsigned char npy_ucs4;
746# define PyInt32ScalarObject PyByteScalarObject
747# define PyInt32ArrType_Type PyByteArrType_Type
748# define PyUInt32ScalarObject PyUByteScalarObject
749# define PyUInt32ArrType_Type PyUByteArrType_Type
750#define NPY_INT32_FMT NPY_BYTE_FMT
751#define NPY_UINT32_FMT NPY_UBYTE_FMT
752#endif
753#elif NPY_BITSOF_CHAR == 64
754#ifndef NPY_INT64
755#define NPY_INT64 NPY_BYTE
756#define NPY_UINT64 NPY_UBYTE
757 typedef signed char npy_int64;
758 typedef unsigned char npy_uint64;
759# define PyInt64ScalarObject PyByteScalarObject
760# define PyInt64ArrType_Type PyByteArrType_Type
761# define PyUInt64ScalarObject PyUByteScalarObject
762# define PyUInt64ArrType_Type PyUByteArrType_Type
763#define NPY_INT64_FMT NPY_BYTE_FMT
764#define NPY_UINT64_FMT NPY_UBYTE_FMT
765# define MyPyLong_FromInt64 PyLong_FromLong
766# define MyPyLong_AsInt64 PyLong_AsLong
767#endif
768#elif NPY_BITSOF_CHAR == 128
769#endif
770
771
772
773#if NPY_BITSOF_DOUBLE == 32
774#ifndef NPY_FLOAT32
775#define NPY_FLOAT32 NPY_DOUBLE
776#define NPY_COMPLEX64 NPY_CDOUBLE
777 typedef double npy_float32;
778 typedef npy_cdouble npy_complex64;
779# define PyFloat32ScalarObject PyDoubleScalarObject
780# define PyComplex64ScalarObject PyCDoubleScalarObject
781# define PyFloat32ArrType_Type PyDoubleArrType_Type
782# define PyComplex64ArrType_Type PyCDoubleArrType_Type
783#define NPY_FLOAT32_FMT NPY_DOUBLE_FMT
784#define NPY_COMPLEX64_FMT NPY_CDOUBLE_FMT
785#endif
786#elif NPY_BITSOF_DOUBLE == 64
787#ifndef NPY_FLOAT64
788#define NPY_FLOAT64 NPY_DOUBLE
789#define NPY_COMPLEX128 NPY_CDOUBLE
790 typedef double npy_float64;
791 typedef npy_cdouble npy_complex128;
792# define PyFloat64ScalarObject PyDoubleScalarObject
793# define PyComplex128ScalarObject PyCDoubleScalarObject
794# define PyFloat64ArrType_Type PyDoubleArrType_Type
795# define PyComplex128ArrType_Type PyCDoubleArrType_Type
796#define NPY_FLOAT64_FMT NPY_DOUBLE_FMT
797#define NPY_COMPLEX128_FMT NPY_CDOUBLE_FMT
798#endif
799#elif NPY_BITSOF_DOUBLE == 80
800#ifndef NPY_FLOAT80
801#define NPY_FLOAT80 NPY_DOUBLE
802#define NPY_COMPLEX160 NPY_CDOUBLE
803 typedef double npy_float80;
804 typedef npy_cdouble npy_complex160;
805# define PyFloat80ScalarObject PyDoubleScalarObject
806# define PyComplex160ScalarObject PyCDoubleScalarObject
807# define PyFloat80ArrType_Type PyDoubleArrType_Type
808# define PyComplex160ArrType_Type PyCDoubleArrType_Type
809#define NPY_FLOAT80_FMT NPY_DOUBLE_FMT
810#define NPY_COMPLEX160_FMT NPY_CDOUBLE_FMT
811#endif
812#elif NPY_BITSOF_DOUBLE == 96
813#ifndef NPY_FLOAT96
814#define NPY_FLOAT96 NPY_DOUBLE
815#define NPY_COMPLEX192 NPY_CDOUBLE
816 typedef double npy_float96;
817 typedef npy_cdouble npy_complex192;
818# define PyFloat96ScalarObject PyDoubleScalarObject
819# define PyComplex192ScalarObject PyCDoubleScalarObject
820# define PyFloat96ArrType_Type PyDoubleArrType_Type
821# define PyComplex192ArrType_Type PyCDoubleArrType_Type
822#define NPY_FLOAT96_FMT NPY_DOUBLE_FMT
823#define NPY_COMPLEX192_FMT NPY_CDOUBLE_FMT
824#endif
825#elif NPY_BITSOF_DOUBLE == 128
826#ifndef NPY_FLOAT128
827#define NPY_FLOAT128 NPY_DOUBLE
828#define NPY_COMPLEX256 NPY_CDOUBLE
829 typedef double npy_float128;
830 typedef npy_cdouble npy_complex256;
831# define PyFloat128ScalarObject PyDoubleScalarObject
832# define PyComplex256ScalarObject PyCDoubleScalarObject
833# define PyFloat128ArrType_Type PyDoubleArrType_Type
834# define PyComplex256ArrType_Type PyCDoubleArrType_Type
835#define NPY_FLOAT128_FMT NPY_DOUBLE_FMT
836#define NPY_COMPLEX256_FMT NPY_CDOUBLE_FMT
837#endif
838#endif
839
840
841
842#if NPY_BITSOF_FLOAT == 32
843#ifndef NPY_FLOAT32
844#define NPY_FLOAT32 NPY_FLOAT
845#define NPY_COMPLEX64 NPY_CFLOAT
846 typedef float npy_float32;
847 typedef npy_cfloat npy_complex64;
848# define PyFloat32ScalarObject PyFloatScalarObject
849# define PyComplex64ScalarObject PyCFloatScalarObject
850# define PyFloat32ArrType_Type PyFloatArrType_Type
851# define PyComplex64ArrType_Type PyCFloatArrType_Type
852#define NPY_FLOAT32_FMT NPY_FLOAT_FMT
853#define NPY_COMPLEX64_FMT NPY_CFLOAT_FMT
854#endif
855#elif NPY_BITSOF_FLOAT == 64
856#ifndef NPY_FLOAT64
857#define NPY_FLOAT64 NPY_FLOAT
858#define NPY_COMPLEX128 NPY_CFLOAT
859 typedef float npy_float64;
860 typedef npy_cfloat npy_complex128;
861# define PyFloat64ScalarObject PyFloatScalarObject
862# define PyComplex128ScalarObject PyCFloatScalarObject
863# define PyFloat64ArrType_Type PyFloatArrType_Type
864# define PyComplex128ArrType_Type PyCFloatArrType_Type
865#define NPY_FLOAT64_FMT NPY_FLOAT_FMT
866#define NPY_COMPLEX128_FMT NPY_CFLOAT_FMT
867#endif
868#elif NPY_BITSOF_FLOAT == 80
869#ifndef NPY_FLOAT80
870#define NPY_FLOAT80 NPY_FLOAT
871#define NPY_COMPLEX160 NPY_CFLOAT
872 typedef float npy_float80;
873 typedef npy_cfloat npy_complex160;
874# define PyFloat80ScalarObject PyFloatScalarObject
875# define PyComplex160ScalarObject PyCFloatScalarObject
876# define PyFloat80ArrType_Type PyFloatArrType_Type
877# define PyComplex160ArrType_Type PyCFloatArrType_Type
878#define NPY_FLOAT80_FMT NPY_FLOAT_FMT
879#define NPY_COMPLEX160_FMT NPY_CFLOAT_FMT
880#endif
881#elif NPY_BITSOF_FLOAT == 96
882#ifndef NPY_FLOAT96
883#define NPY_FLOAT96 NPY_FLOAT
884#define NPY_COMPLEX192 NPY_CFLOAT
885 typedef float npy_float96;
886 typedef npy_cfloat npy_complex192;
887# define PyFloat96ScalarObject PyFloatScalarObject
888# define PyComplex192ScalarObject PyCFloatScalarObject
889# define PyFloat96ArrType_Type PyFloatArrType_Type
890# define PyComplex192ArrType_Type PyCFloatArrType_Type
891#define NPY_FLOAT96_FMT NPY_FLOAT_FMT
892#define NPY_COMPLEX192_FMT NPY_CFLOAT_FMT
893#endif
894#elif NPY_BITSOF_FLOAT == 128
895#ifndef NPY_FLOAT128
896#define NPY_FLOAT128 NPY_FLOAT
897#define NPY_COMPLEX256 NPY_CFLOAT
898 typedef float npy_float128;
899 typedef npy_cfloat npy_complex256;
900# define PyFloat128ScalarObject PyFloatScalarObject
901# define PyComplex256ScalarObject PyCFloatScalarObject
902# define PyFloat128ArrType_Type PyFloatArrType_Type
903# define PyComplex256ArrType_Type PyCFloatArrType_Type
904#define NPY_FLOAT128_FMT NPY_FLOAT_FMT
905#define NPY_COMPLEX256_FMT NPY_CFLOAT_FMT
906#endif
907#endif
908
909/* half/float16 isn't a floating-point type in C */
910#define NPY_FLOAT16 NPY_HALF
911typedef npy_uint16 npy_half;
912typedef npy_half npy_float16;
913
914#if NPY_BITSOF_LONGDOUBLE == 32
915#ifndef NPY_FLOAT32
916#define NPY_FLOAT32 NPY_LONGDOUBLE
917#define NPY_COMPLEX64 NPY_CLONGDOUBLE
918 typedef npy_longdouble npy_float32;
919 typedef npy_clongdouble npy_complex64;
920# define PyFloat32ScalarObject PyLongDoubleScalarObject
921# define PyComplex64ScalarObject PyCLongDoubleScalarObject
922# define PyFloat32ArrType_Type PyLongDoubleArrType_Type
923# define PyComplex64ArrType_Type PyCLongDoubleArrType_Type
924#define NPY_FLOAT32_FMT NPY_LONGDOUBLE_FMT
925#define NPY_COMPLEX64_FMT NPY_CLONGDOUBLE_FMT
926#endif
927#elif NPY_BITSOF_LONGDOUBLE == 64
928#ifndef NPY_FLOAT64
929#define NPY_FLOAT64 NPY_LONGDOUBLE
930#define NPY_COMPLEX128 NPY_CLONGDOUBLE
931 typedef npy_longdouble npy_float64;
932 typedef npy_clongdouble npy_complex128;
933# define PyFloat64ScalarObject PyLongDoubleScalarObject
934# define PyComplex128ScalarObject PyCLongDoubleScalarObject
935# define PyFloat64ArrType_Type PyLongDoubleArrType_Type
936# define PyComplex128ArrType_Type PyCLongDoubleArrType_Type
937#define NPY_FLOAT64_FMT NPY_LONGDOUBLE_FMT
938#define NPY_COMPLEX128_FMT NPY_CLONGDOUBLE_FMT
939#endif
940#elif NPY_BITSOF_LONGDOUBLE == 80
941#ifndef NPY_FLOAT80
942#define NPY_FLOAT80 NPY_LONGDOUBLE
943#define NPY_COMPLEX160 NPY_CLONGDOUBLE
944 typedef npy_longdouble npy_float80;
945 typedef npy_clongdouble npy_complex160;
946# define PyFloat80ScalarObject PyLongDoubleScalarObject
947# define PyComplex160ScalarObject PyCLongDoubleScalarObject
948# define PyFloat80ArrType_Type PyLongDoubleArrType_Type
949# define PyComplex160ArrType_Type PyCLongDoubleArrType_Type
950#define NPY_FLOAT80_FMT NPY_LONGDOUBLE_FMT
951#define NPY_COMPLEX160_FMT NPY_CLONGDOUBLE_FMT
952#endif
953#elif NPY_BITSOF_LONGDOUBLE == 96
954#ifndef NPY_FLOAT96
955#define NPY_FLOAT96 NPY_LONGDOUBLE
956#define NPY_COMPLEX192 NPY_CLONGDOUBLE
957 typedef npy_longdouble npy_float96;
958 typedef npy_clongdouble npy_complex192;
959# define PyFloat96ScalarObject PyLongDoubleScalarObject
960# define PyComplex192ScalarObject PyCLongDoubleScalarObject
961# define PyFloat96ArrType_Type PyLongDoubleArrType_Type
962# define PyComplex192ArrType_Type PyCLongDoubleArrType_Type
963#define NPY_FLOAT96_FMT NPY_LONGDOUBLE_FMT
964#define NPY_COMPLEX192_FMT NPY_CLONGDOUBLE_FMT
965#endif
966#elif NPY_BITSOF_LONGDOUBLE == 128
967#ifndef NPY_FLOAT128
968#define NPY_FLOAT128 NPY_LONGDOUBLE
969#define NPY_COMPLEX256 NPY_CLONGDOUBLE
970 typedef npy_longdouble npy_float128;
971 typedef npy_clongdouble npy_complex256;
972# define PyFloat128ScalarObject PyLongDoubleScalarObject
973# define PyComplex256ScalarObject PyCLongDoubleScalarObject
974# define PyFloat128ArrType_Type PyLongDoubleArrType_Type
975# define PyComplex256ArrType_Type PyCLongDoubleArrType_Type
976#define NPY_FLOAT128_FMT NPY_LONGDOUBLE_FMT
977#define NPY_COMPLEX256_FMT NPY_CLONGDOUBLE_FMT
978#endif
979#endif
980
981/* datetime typedefs */
982typedef npy_int64 npy_timedelta;
983typedef npy_int64 npy_datetime;
984#define NPY_DATETIME_FMT NPY_INT64_FMT
985#define NPY_TIMEDELTA_FMT NPY_INT64_FMT
986
987/* End of typedefs for numarray style bit-width names */
988
989#endif /* NUMPY_CORE_INCLUDE_NUMPY_NPY_COMMON_H_ */
990 