blob: 22f1d71647e05661e6f843f86d4842dd4d86a24a [file] [log] [blame]
Victor Stinnerdfb866d2011-09-29 01:12:24 +02001#ifndef Py_PYMACRO_H
2#define Py_PYMACRO_H
3
4#define Py_MIN(x, y) (((x) > (y)) ? (y) : (x))
5#define Py_MAX(x, y) (((x) > (y)) ? (x) : (y))
6
7/* Argument must be a char or an int in [-128, 127] or [0, 255]. */
8#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
9
10
11/* Assert a build-time dependency, as an expression.
12
13 Your compile will fail if the condition isn't true, or can't be evaluated
14 by the compiler. This can be used in an expression: its value is 0.
15
16 Example:
17
18 #define foo_to_char(foo) \
19 ((char *)(foo) \
20 + Py_BUILD_ASSERT(offsetof(struct foo, string) == 0))
21
22 Written by Rusty Russell, public domain. */
23#define Py_BUILD_ASSERT(cond) \
24 (sizeof(char [1 - 2*!(cond)]) - 1)
25
26#if defined(__GNUC__)
27/* Two gcc extensions.
28 &a[0] degrades to a pointer: a different type from an array */
29#define _Py_ARRAY_LENGTH_CHECK(array) \
30 Py_BUILD_ASSERT(!__builtin_types_compatible_p(typeof(array), \
31 typeof(&(array)[0])))
32#else
33#define _Py_ARRAY_LENGTH_CHECK(array) 0
34#endif
35
36
37/* Get the number of elements in a visible array
38
39 This does not work on pointers, or arrays declared as [], or function
40 parameters. With correct compiler support, such usage will cause a build
41 error (see Py_BUILD_ASSERT).
42
43 Written by Rusty Russell, public domain. */
44#define Py_ARRAY_LENGTH(array) \
45 (sizeof(array) / sizeof((array)[0]) + _Py_ARRAY_LENGTH_CHECK(array))
46
47
48/* Define macros for inline documentation. */
49#define PyDoc_VAR(name) static char name[]
50#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
51#ifdef WITH_DOC_STRINGS
52#define PyDoc_STR(str) str
53#else
54#define PyDoc_STR(str) ""
55#endif
56
57#endif /* Py_PYMACRO_H */