#![allow(non_snake_case)]
use crate::pg_sys;
use core::{mem, ptr};
#[inline(always)]
pub(super) const fn TYPEALIGN(alignval: usize, len: usize) -> usize {
(len + (alignval - 1)) & !(alignval - 1)
}
#[inline(always)]
pub(super) const fn MAXALIGN(len: usize) -> usize {
TYPEALIGN(pg_sys::MAXIMUM_ALIGNOF as _, len)
}
#[inline(always)]
pub(super) unsafe fn ARR_NDIM(a: *mut pg_sys::ArrayType) -> usize {
unsafe { (*a).ndim as usize }
}
#[inline(always)]
pub(super) unsafe fn ARR_HASNULL(a: *mut pg_sys::ArrayType) -> bool {
unsafe { (*a).dataoffset != 0 }
}
#[inline(always)]
pub(super) const unsafe fn ARR_DIMS(a: *mut pg_sys::ArrayType) -> *mut i32 {
unsafe { a.cast::<u8>().add(mem::size_of::<pg_sys::ArrayType>()).cast::<i32>() }
}
#[inline(always)]
pub(super) unsafe fn ARR_NULLBITMAP(a: *mut pg_sys::ArrayType) -> *mut pg_sys::bits8 {
unsafe {
if ARR_HASNULL(a) {
a.cast::<u8>()
.add(mem::size_of::<pg_sys::ArrayType>() + 2 * mem::size_of::<i32>() * ARR_NDIM(a))
} else {
ptr::null_mut()
}
}
}
#[inline(always)]
pub(super) const fn ARR_OVERHEAD_NONULLS(ndims: usize) -> usize {
MAXALIGN(mem::size_of::<pg_sys::ArrayType>() + 2 * mem::size_of::<i32>() * ndims)
}
#[inline(always)]
pub(super) unsafe fn ARR_DATA_OFFSET(a: *mut pg_sys::ArrayType) -> usize {
unsafe { if ARR_HASNULL(a) { (*a).dataoffset as _ } else { ARR_OVERHEAD_NONULLS(ARR_NDIM(a)) } }
}
#[inline(always)]
pub(super) unsafe fn ARR_DATA_PTR(a: *mut pg_sys::ArrayType) -> *mut u8 {
unsafe { a.cast::<u8>().add(ARR_DATA_OFFSET(a)) }
}