ocaml_sys/
bigarray.rs

1//! Bigarray bindings
2
3use crate::mlvalues::{Intnat, Uintnat, Value};
4use core::ffi::c_void;
5
6pub type Data = *mut c_void;
7
8#[repr(C)]
9pub struct BigarrayProxy {
10    refcount: Intnat,
11    data: Data,
12    size: Uintnat,
13}
14
15#[repr(C)]
16pub struct Bigarray {
17    pub data: Data,
18    pub num_dims: Intnat,
19    pub flags: Intnat,
20    pub proxy: *const BigarrayProxy,
21    pub dim: [Intnat; 0],
22}
23
24impl Bigarray {
25    /// Returns true if array is Fortran contiguous
26    pub fn is_fortran(&self) -> bool {
27        (self.flags & Layout::FORTRAN_LAYOUT as isize) != 0
28    }
29}
30
31#[allow(non_camel_case_types)]
32pub enum Managed {
33    EXTERNAL = 0,         /* Data is not allocated by OCaml */
34    MANAGED = 0x200,      /* Data is allocated by OCaml */
35    MAPPED_FILE = 0x400,  /* Data is a memory mapped file */
36    MANAGED_MASK = 0x600, /* Mask for "managed" bits in flags field */
37}
38
39#[allow(non_camel_case_types)]
40pub enum Kind {
41    FLOAT32 = 0x00,    /* Single-precision floats */
42    FLOAT64 = 0x01,    /* Double-precision floats */
43    SINT8 = 0x02,      /* Signed 8-bit integers */
44    UINT8 = 0x03,      /* Unsigned 8-bit integers */
45    SINT16 = 0x04,     /* Signed 16-bit integers */
46    UINT16 = 0x05,     /* Unsigned 16-bit integers */
47    INT32 = 0x06,      /* Signed 32-bit integers */
48    INT64 = 0x07,      /* Signed 64-bit integers */
49    CAML_INT = 0x08,   /* OCaml-style integers (signed 31 or 63 bits) */
50    NATIVE_INT = 0x09, /* Platform-native long integers (32 or 64 bits) */
51    COMPLEX32 = 0x0a,  /* Single-precision complex */
52    COMPLEX64 = 0x0b,  /* Double-precision complex */
53    CHAR = 0x0c,       /* Characters */
54    KIND_MASK = 0xFF,  /* Mask for kind in flags field */
55}
56
57#[allow(non_camel_case_types)]
58pub enum Layout {
59    C_LAYOUT = 0,           /* Row major, indices start at 0 */
60    FORTRAN_LAYOUT = 0x100, /* Column major, indices start at 1 */
61}
62
63extern "C" {
64    pub fn malloc(size: usize) -> Data;
65    pub fn caml_ba_alloc(flags: i32, num_dims: i32, data: Data, dim: *const i32) -> Value;
66    pub fn caml_ba_alloc_dims(flags: i32, num_dims: i32, data: Data, ...) -> Value;
67    pub fn caml_ba_byte_size(b: *const Bigarray) -> u32;
68}