python3_sys/
pybuffer.rs

1use libc::{c_char, c_int, c_void};
2
3use crate::pyport::Py_ssize_t;
4use crate::object::PyObject;
5
6#[repr(C)]
7#[derive(Copy)]
8pub struct Py_buffer {
9    pub buf: *mut c_void,
10    pub obj: *mut PyObject,
11    pub len: Py_ssize_t,
12    pub itemsize: Py_ssize_t,
13    pub readonly: c_int,
14    pub ndim: c_int,
15    pub format: *mut c_char,
16    pub shape: *mut Py_ssize_t,
17    pub strides: *mut Py_ssize_t,
18    pub suboffsets: *mut Py_ssize_t,
19    pub internal: *mut c_void,
20}
21impl Clone for Py_buffer {
22    #[inline]
23    fn clone(&self) -> Self {
24        *self
25    }
26}
27impl Default for Py_buffer {
28    #[inline]
29    fn default() -> Self {
30        unsafe { core::mem::zeroed() }
31    }
32}
33
34#[cfg_attr(windows, link(name = "pythonXY"))]
35extern "C" {
36    #[cfg(Py_3_9)]
37    pub fn PyObject_CheckBuffer(obj: *mut PyObject) -> c_int;
38    pub fn PyObject_GetBuffer(obj: *mut PyObject, view: *mut Py_buffer, flags: c_int) -> c_int;
39    pub fn PyBuffer_GetPointer(view: *mut Py_buffer, indices: *mut Py_ssize_t) -> *mut c_void;
40    #[cfg(any(Py_3_11, all(not(Py_LIMITED_API), Py_3_9)))]
41    pub fn PyBuffer_SizeFromFormat(format: *const c_char) -> Py_ssize_t;
42    pub fn PyBuffer_ToContiguous(
43        buf: *mut c_void,
44        view: *mut Py_buffer,
45        len: Py_ssize_t,
46        order: c_char,
47    ) -> c_int;
48    pub fn PyBuffer_FromContiguous(
49        view: *mut Py_buffer,
50        buf: *mut c_void,
51        len: Py_ssize_t,
52        order: c_char,
53    ) -> c_int;
54    pub fn PyObject_CopyData(dest: *mut PyObject, src: *mut PyObject) -> c_int;
55    pub fn PyBuffer_IsContiguous(view: *const Py_buffer, fort: c_char) -> c_int;
56    pub fn PyBuffer_FillContiguousStrides(
57        ndims: c_int,
58        shape: *mut Py_ssize_t,
59        strides: *mut Py_ssize_t,
60        itemsize: c_int,
61        fort: c_char,
62    ) -> ();
63    pub fn PyBuffer_FillInfo(
64        view: *mut Py_buffer,
65        o: *mut PyObject,
66        buf: *mut c_void,
67        len: Py_ssize_t,
68        readonly: c_int,
69        flags: c_int,
70    ) -> c_int;
71    pub fn PyBuffer_Release(view: *mut Py_buffer) -> ();
72}
73
74 /// Maximum number of dimensions
75 pub const PyBUF_MAX_NDIM: c_int = 64;
76
77 /* Flags for getting buffers */
78 pub const PyBUF_SIMPLE: c_int = 0;
79 pub const PyBUF_WRITABLE: c_int = 0x0001;
80 /*  we used to include an E, backwards compatible alias  */
81#[cfg(not(Py_LIMITED_API))]
82 pub const PyBUF_WRITEABLE: c_int = PyBUF_WRITABLE;
83 pub const PyBUF_FORMAT: c_int = 0x0004;
84 pub const PyBUF_ND: c_int = 0x0008;
85 pub const PyBUF_STRIDES: c_int = (0x0010 | PyBUF_ND);
86 pub const PyBUF_C_CONTIGUOUS: c_int = (0x0020 | PyBUF_STRIDES);
87 pub const PyBUF_F_CONTIGUOUS: c_int = (0x0040 | PyBUF_STRIDES);
88 pub const PyBUF_ANY_CONTIGUOUS: c_int = (0x0080 | PyBUF_STRIDES);
89 pub const PyBUF_INDIRECT: c_int = (0x0100 | PyBUF_STRIDES);
90
91 pub const PyBUF_CONTIG: c_int = (PyBUF_ND | PyBUF_WRITABLE);
92 pub const PyBUF_CONTIG_RO: c_int = (PyBUF_ND);
93
94 pub const PyBUF_STRIDED: c_int = (PyBUF_STRIDES | PyBUF_WRITABLE);
95 pub const PyBUF_STRIDED_RO: c_int = (PyBUF_STRIDES);
96
97 pub const PyBUF_RECORDS: c_int = (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT);
98 pub const PyBUF_RECORDS_RO: c_int = (PyBUF_STRIDES | PyBUF_FORMAT);
99
100 pub const PyBUF_FULL: c_int = (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT);
101 pub const PyBUF_FULL_RO: c_int = (PyBUF_INDIRECT | PyBUF_FORMAT);
102
103 pub const PyBUF_READ: c_int = 0x100;
104 pub const PyBUF_WRITE: c_int = 0x200;