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 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
45extern_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
84pub const PyBUF_MAX_NDIM: usize = 64;
86
87pub const PyBUF_SIMPLE: c_int = 0;
89pub const PyBUF_WRITABLE: c_int = 0x0001;
90pub 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;