#![allow(non_camel_case_types)]
use crate::rubysys::types::{c_char, c_int, c_void, size_t, ssize_t, RbDataType, Value};
pub const RUBY_MEMORY_VIEW_SIMPLE: c_int = 0;
pub const RUBY_MEMORY_VIEW_WRITABLE: c_int = 1 << 0;
pub const RUBY_MEMORY_VIEW_FORMAT: c_int = 1 << 1;
pub const RUBY_MEMORY_VIEW_MULTI_DIMENSIONAL: c_int = 1 << 2;
pub const RUBY_MEMORY_VIEW_STRIDES: c_int = (1 << 3) | RUBY_MEMORY_VIEW_MULTI_DIMENSIONAL;
pub const RUBY_MEMORY_VIEW_ROW_MAJOR: c_int = (1 << 4) | RUBY_MEMORY_VIEW_STRIDES;
pub const RUBY_MEMORY_VIEW_COLUMN_MAJOR: c_int = (1 << 5) | RUBY_MEMORY_VIEW_STRIDES;
pub const RUBY_MEMORY_VIEW_ANY_CONTIGUOUS: c_int =
RUBY_MEMORY_VIEW_ROW_MAJOR | RUBY_MEMORY_VIEW_COLUMN_MAJOR;
pub const RUBY_MEMORY_VIEW_INDIRECT: c_int = (1 << 6) | RUBY_MEMORY_VIEW_STRIDES;
#[cfg(not(ruby_gte_3_3))]
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct rb_memory_view_item_component_t {
pub format: c_char,
#[cfg(not(windows))]
pub bitfields: u8,
#[cfg(windows)]
pub bitfields: u32,
pub offset: size_t,
pub size: size_t,
pub repeat: size_t,
}
#[cfg(ruby_gte_3_3)]
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct rb_memory_view_item_component_t {
pub format: c_char,
pub native_size_p: bool,
pub little_endian_p: bool,
pub offset: size_t,
pub size: size_t,
pub repeat: size_t,
}
#[cfg(not(ruby_gte_3_3))]
impl rb_memory_view_item_component_t {
#[cfg(any(windows, target_endian = "little"))]
const NATIVE_SIZE_BIT: u32 = 0;
#[cfg(any(windows, target_endian = "little"))]
const LITTLE_ENDIAN_BIT: u32 = 1;
#[cfg(all(not(windows), target_endian = "big"))]
const NATIVE_SIZE_BIT: u32 = 7;
#[cfg(all(not(windows), target_endian = "big"))]
const LITTLE_ENDIAN_BIT: u32 = 6;
pub fn native_size_p(&self) -> bool {
(self.bitfields as u32 >> Self::NATIVE_SIZE_BIT) & 1 == 1
}
pub fn little_endian_p(&self) -> bool {
(self.bitfields as u32 >> Self::LITTLE_ENDIAN_BIT) & 1 == 1
}
}
#[cfg(ruby_gte_3_3)]
impl rb_memory_view_item_component_t {
pub fn native_size_p(&self) -> bool {
self.native_size_p
}
pub fn little_endian_p(&self) -> bool {
self.little_endian_p
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct rb_memory_view_item_desc {
pub components: *const rb_memory_view_item_component_t,
pub length: size_t,
}
#[repr(C)]
#[derive(Debug)]
pub struct rb_memory_view_t {
pub obj: Value,
pub data: *mut c_void,
pub byte_size: ssize_t,
pub readonly: bool,
pub format: *const c_char,
pub item_size: ssize_t,
pub item_desc: rb_memory_view_item_desc,
pub ndim: ssize_t,
pub shape: *const ssize_t,
pub strides: *const ssize_t,
pub sub_offsets: *const ssize_t,
pub private_data: *mut c_void,
pub _memory_view_entry: *const rb_memory_view_entry_t,
}
pub type rb_memory_view_get_func_t =
rutie_callback!(type fn(obj: Value, view: *mut rb_memory_view_t, flags: c_int) -> bool);
pub type rb_memory_view_release_func_t =
rutie_callback!(type fn(obj: Value, view: *mut rb_memory_view_t) -> bool);
pub type rb_memory_view_available_p_func_t = rutie_callback!(type fn(obj: Value) -> bool);
#[repr(C)]
pub struct rb_memory_view_entry_t {
pub get_func: Option<rb_memory_view_get_func_t>,
pub release_func: Option<rb_memory_view_release_func_t>,
pub available_p_func: Option<rb_memory_view_available_p_func_t>,
}
#[cfg_attr(rutie_dllimport, link(name = "rutie_ruby"))]
extern "C" {
pub static rb_memory_view_exported_object_registry: Value;
pub static rb_memory_view_exported_object_registry_data_type: RbDataType;
pub fn rb_memory_view_register(klass: Value, entry: *const rb_memory_view_entry_t) -> bool;
pub fn rb_memory_view_is_row_major_contiguous(view: *const rb_memory_view_t) -> bool;
pub fn rb_memory_view_is_column_major_contiguous(view: *const rb_memory_view_t) -> bool;
pub fn rb_memory_view_fill_contiguous_strides(
ndim: ssize_t,
item_size: ssize_t,
shape: *const ssize_t,
row_major_p: bool,
strides: *mut ssize_t,
);
pub fn rb_memory_view_init_as_byte_array(
view: *mut rb_memory_view_t,
obj: Value,
data: *mut c_void,
len: ssize_t,
readonly: bool,
) -> bool;
pub fn rb_memory_view_parse_item_format(
format: *const c_char,
members: *mut *mut rb_memory_view_item_component_t,
n_members: *mut size_t,
err: *mut *const c_char,
) -> ssize_t;
pub fn rb_memory_view_item_size_from_format(
format: *const c_char,
err: *mut *const c_char,
) -> ssize_t;
pub fn rb_memory_view_get_item_pointer(
view: *mut rb_memory_view_t,
indices: *const ssize_t,
) -> *mut c_void;
pub fn rb_memory_view_extract_item_members(
ptr: *const c_void,
members: *const rb_memory_view_item_component_t,
n_members: size_t,
) -> Value;
pub fn rb_memory_view_prepare_item_desc(view: *mut rb_memory_view_t);
pub fn rb_memory_view_get_item(view: *mut rb_memory_view_t, indices: *const ssize_t) -> Value;
pub fn rb_memory_view_available_p(obj: Value) -> bool;
pub fn rb_memory_view_get(obj: Value, memory_view: *mut rb_memory_view_t, flags: c_int)
-> bool;
pub fn rb_memory_view_release(memory_view: *mut rb_memory_view_t) -> bool;
}