Skip to main content

pyforge_ffi/
pybuffer.rs

1use crate::object::PyObject;
2use crate::pyport::Py_ssize_t;
3use std::ffi::{c_char, c_int, c_void};
4use std::ptr;
5
6#[repr(C)]
7#[derive(Copy, Clone)]
8pub struct Py_buffer {
9    pub buf: *mut c_void,
10    /// Owned reference
11    pub obj: *mut crate::PyObject,
12    pub len: Py_ssize_t,
13    pub itemsize: Py_ssize_t,
14    pub readonly: c_int,
15    pub ndim: c_int,
16    pub format: *mut c_char,
17    pub shape: *mut Py_ssize_t,
18    pub strides: *mut Py_ssize_t,
19    pub suboffsets: *mut Py_ssize_t,
20    pub internal: *mut c_void,
21}
22
23impl Py_buffer {
24    #[allow(clippy::new_without_default)]
25    pub const fn new() -> Self {
26        Py_buffer {
27            buf: ptr::null_mut(),
28            obj: ptr::null_mut(),
29            len: 0,
30            itemsize: 0,
31            readonly: 0,
32            ndim: 0,
33            format: ptr::null_mut(),
34            shape: ptr::null_mut(),
35            strides: ptr::null_mut(),
36            suboffsets: ptr::null_mut(),
37            internal: ptr::null_mut(),
38        }
39    }
40}
41
42pub type getbufferproc = unsafe extern "C" fn(*mut PyObject, *mut crate::Py_buffer, c_int) -> c_int;
43pub type releasebufferproc = unsafe extern "C" fn(*mut PyObject, *mut crate::Py_buffer);
44
45/* Return 1 if the getbuffer function is available, otherwise return 0. */
46extern_libpython! {
47    pub fn PyObject_CheckBuffer(obj: *mut PyObject) -> c_int;
48
49    pub fn PyObject_GetBuffer(obj: *mut PyObject, view: *mut Py_buffer, flags: c_int) -> c_int;
50    pub fn PyBuffer_GetPointer(view: *const Py_buffer, indices: *const Py_ssize_t) -> *mut c_void;
51    pub fn PyBuffer_SizeFromFormat(format: *const c_char) -> Py_ssize_t;
52    pub fn PyBuffer_ToContiguous(
53        buf: *mut c_void,
54        view: *const Py_buffer,
55        len: Py_ssize_t,
56        order: c_char,
57    ) -> c_int;
58    pub fn PyBuffer_FromContiguous(
59        view: *const Py_buffer,
60        buf: *const c_void,
61        len: Py_ssize_t,
62        order: c_char,
63    ) -> c_int;
64    pub fn PyObject_CopyData(dest: *mut PyObject, src: *mut PyObject) -> c_int;
65    pub fn PyBuffer_IsContiguous(view: *const Py_buffer, fort: c_char) -> c_int;
66    pub fn PyBuffer_FillContiguousStrides(
67        ndims: c_int,
68        shape: *mut Py_ssize_t,
69        strides: *mut Py_ssize_t,
70        itemsize: c_int,
71        fort: c_char,
72    );
73    pub fn PyBuffer_FillInfo(
74        view: *mut Py_buffer,
75        o: *mut PyObject,
76        buf: *mut c_void,
77        len: Py_ssize_t,
78        readonly: c_int,
79        flags: c_int,
80    ) -> c_int;
81    pub fn PyBuffer_Release(view: *mut Py_buffer);
82}
83
84/// Maximum number of dimensions
85pub const PyBUF_MAX_NDIM: usize = 64;
86
87/* Flags for getting buffers */
88pub const PyBUF_SIMPLE: c_int = 0;
89pub const PyBUF_WRITABLE: c_int = 0x0001;
90/* we used to include an E, backwards compatible alias */
91pub const PyBUF_WRITEABLE: c_int = PyBUF_WRITABLE;
92pub const PyBUF_FORMAT: c_int = 0x0004;
93pub const PyBUF_ND: c_int = 0x0008;
94pub const PyBUF_STRIDES: c_int = 0x0010 | PyBUF_ND;
95pub const PyBUF_C_CONTIGUOUS: c_int = 0x0020 | PyBUF_STRIDES;
96pub const PyBUF_F_CONTIGUOUS: c_int = 0x0040 | PyBUF_STRIDES;
97pub const PyBUF_ANY_CONTIGUOUS: c_int = 0x0080 | PyBUF_STRIDES;
98pub const PyBUF_INDIRECT: c_int = 0x0100 | PyBUF_STRIDES;
99
100pub const PyBUF_CONTIG: c_int = PyBUF_ND | PyBUF_WRITABLE;
101pub const PyBUF_CONTIG_RO: c_int = PyBUF_ND;
102
103pub const PyBUF_STRIDED: c_int = PyBUF_STRIDES | PyBUF_WRITABLE;
104pub const PyBUF_STRIDED_RO: c_int = PyBUF_STRIDES;
105
106pub const PyBUF_RECORDS: c_int = PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT;
107pub const PyBUF_RECORDS_RO: c_int = PyBUF_STRIDES | PyBUF_FORMAT;
108
109pub const PyBUF_FULL: c_int = PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT;
110pub const PyBUF_FULL_RO: c_int = PyBUF_INDIRECT | PyBUF_FORMAT;
111
112pub const PyBUF_READ: c_int = 0x100;
113pub const PyBUF_WRITE: c_int = 0x200;