Skip to main content

miniextendr_api/altrep_impl/
buffers.rs

1//! Registered native buffers with value duplication and retained allocations.
2use crate::AltrepBuffer;
3use crate::altrep::RegisterAltrep;
4
5macro_rules! buffer_class {
6    ($elem:ty, $storage:ty, $methods:ident, $infer:ident, $class:literal, $register:ident, $entry:ident) => {
7        crate::__impl_altrep_base!(
8            AltrepBuffer<$elem>,
9            RUnwind,
10            with_serialize,
11            extra = {
12                const HAS_DUPLICATE: bool = true;
13                fn duplicate(x: crate::SEXP, _deep: bool) -> crate::SEXP {
14                    unsafe { super::duplicate_altrep_owner::<Self>(x) }
15                }
16            }
17        );
18        crate::__impl_altvec_dataptr!(AltrepBuffer<$elem>, $storage);
19        crate::$methods!(AltrepBuffer<$elem>);
20        crate::$infer!(AltrepBuffer<$elem>);
21        super::builtins::impl_register_altrep_builtin!(AltrepBuffer<$elem>, $class);
22
23        #[doc(hidden)]
24        #[unsafe(no_mangle)]
25        pub extern "C-unwind" fn $register() {
26            <AltrepBuffer<$elem> as RegisterAltrep>::get_or_init_class();
27        }
28        #[cfg_attr(
29                    not(target_arch = "wasm32"),
30                    crate::linkme::distributed_slice(crate::registry::MX_ALTREP_REGISTRATIONS),
31                    linkme(crate = crate::linkme)
32                )]
33        static $entry: crate::registry::AltrepRegistration = crate::registry::AltrepRegistration {
34            register: $register,
35            symbol: stringify!($register),
36        };
37    };
38}
39
40impl crate::altrep_traits::Altrep for AltrepBuffer<i32> where  {
    const GUARD: crate::altrep_traits::AltrepGuard =
        crate::altrep_traits::AltrepGuard::RUnwind;
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: crate::SEXP, _deep: bool) -> crate::SEXP {
        unsafe { super::duplicate_altrep_owner::<Self>(x) }
    }
    fn length(x: crate::SEXP) -> crate::R_xlen_t {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return crate::SexpExt::len(&data2) as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as crate::altrep_data::AltrepLen>::altrep_len(data)
            as crate::R_xlen_t
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: crate::SEXP) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as
                crate::altrep_data::AltrepSerialize>::serialized_state(data)
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: crate::SEXP, state: crate::SEXP) -> crate::SEXP {
        let ::core::option::Option::Some(data) =
            <AltrepBuffer<i32> as
                    crate::altrep_data::AltrepSerialize>::unserialize(state) else {
                {
                    ::core::panicking::panic_fmt(format_args!("ALTREP unserialize failed for {0}",
                            ::core::any::type_name::<AltrepBuffer<i32>>()));
                };
            };
        unsafe {
            use crate::SEXP;
            use crate::externalptr::ExternalPtr;
            use crate::sys::altrep::R_altrep_class_t;
            use crate::sys::{Rf_protect_unchecked, Rf_unprotect_unchecked};
            let ext_ptr = ExternalPtr::new_unchecked(data);
            let data1 = ext_ptr.as_sexp();
            Rf_protect_unchecked(data1);
            let cls = R_altrep_class_t::from_sexp(class);
            let out = cls.new_altrep_unchecked(data1, SEXP::nil());
            Rf_unprotect_unchecked(1);
            out
        }
    }
}
impl crate::altrep_traits::AltVec for AltrepBuffer<i32> where  {
    const HAS_DATAPTR: bool = true;
    fn dataptr(x: crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2).cast_mut();
            }
        }
        let direct =
            if writable {
                let d =
                    unsafe {
                        <AltrepBuffer<i32> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<i32> as
                            crate::altrep_data::AltrepDataptr<i32>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <AltrepBuffer<i32> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <AltrepBuffer<i32> as
                                crate::altrep_data::AltrepDataptr<i32>>::dataptr_or_null(d)
                    };
                if let ::core::option::Option::Some(p) = ro {
                    return p.cast_mut().cast::<::core::ffi::c_void>();
                }
                let d =
                    unsafe {
                        <AltrepBuffer<i32> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<i32> as
                            crate::altrep_data::AltrepDataptr<i32>>::dataptr(d,
                        false).map(|p| p.cast::<::core::ffi::c_void>())
            };
        if let ::core::option::Option::Some(p) = direct { return p; }
        unsafe { crate::altrep_data::materialize_altrep_data2::<i32>(x) }
    }
    const HAS_DATAPTR_OR_NULL: bool = true;
    fn dataptr_or_null(x: crate::SEXP) -> *const ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2);
            }
        }
        let d =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepDataptr<i32>>::dataptr_or_null(d).map(|p|
                    p.cast::<::core::ffi::c_void>()).unwrap_or(::core::ptr::null())
    }
}
impl crate::altrep_traits::AltInteger for AltrepBuffer<i32> where  {
    const HAS_ELT: bool = true;
    fn elt(x: crate::SEXP, i: crate::R_xlen_t) -> i32 {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return <i32 as crate::RNativeType>::elt(data2, i.max(0));
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as
                crate::altrep_data::AltIntegerData>::elt(data,
            i.max(0) as usize)
    }
    const HAS_GET_REGION: bool = true;
    fn get_region(x: crate::SEXP, start: crate::R_xlen_t,
        len: crate::R_xlen_t, buf: &mut [i32]) -> crate::R_xlen_t {
        if start < 0 || len <= 0 { return 0; }
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return unsafe {
                        crate::altrep_data::materialized_altrep_region::<i32>(data2,
                            start as usize, len as usize, buf)
                    } as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <AltrepBuffer<i32> as
                    crate::altrep_data::AltIntegerData>::get_region(data,
                start as usize, len, buf) as crate::R_xlen_t
    }
    const HAS_IS_SORTED: bool = true;
    fn is_sorted(x: crate::SEXP) -> i32 {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::altrep_traits::UNKNOWN_SORTEDNESS;
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as
                        crate::altrep_data::AltIntegerData>::is_sorted(data).map(|s|
                    s.to_r_int()).unwrap_or(i32::MIN)
    }
    const HAS_NO_NA: bool = true;
    fn no_na(x: crate::SEXP) -> i32 {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return 0;
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as
                        crate::altrep_data::AltIntegerData>::no_na(data).map(|b|
                    if b { 1 } else { 0 }).unwrap_or(0)
    }
    const HAS_SUM: bool = true;
    fn sum(x: crate::SEXP, narm: bool) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <AltrepBuffer<i32> as
                    crate::altrep_data::AltIntegerData>::sum(data, narm) {
            ::core::option::Option::Some(s) => {
                if s >= i32::MIN as i64 && s <= i32::MAX as i64 {
                    crate::SEXP::scalar_integer(s as i32)
                } else { crate::SEXP::scalar_real(s as f64) }
            }
            ::core::option::Option::None => crate::SEXP::null(),
        }
    }
    const HAS_MIN: bool = true;
    fn min(x: crate::SEXP, narm: bool) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as
                        crate::altrep_data::AltIntegerData>::min(data,
                    narm).map(|m|
                    crate::SEXP::scalar_integer(m)).unwrap_or(crate::SEXP::null())
    }
    const HAS_MAX: bool = true;
    fn max(x: crate::SEXP, narm: bool) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<i32> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<i32> as
                        crate::altrep_data::AltIntegerData>::max(data,
                    narm).map(|m|
                    crate::SEXP::scalar_integer(m)).unwrap_or(crate::SEXP::null())
    }
}
impl crate::altrep_data::InferBase for AltrepBuffer<i32> where  {
    const BASE: crate::altrep::RBase = crate::altrep::RBase::Int;
    unsafe fn make_class(class_name: *const ::core::ffi::c_char,
        pkg_name: *const ::core::ffi::c_char)
        -> crate::sys::altrep::R_altrep_class_t {
        let dll = crate::altrep_dll_info();
        let cls =
            unsafe {
                crate::sys::altrep::R_make_altinteger_class(class_name,
                    pkg_name, dll)
            };
        let name = unsafe { ::core::ffi::CStr::from_ptr(class_name) };
        crate::altrep::validate_altrep_class(cls, name,
            crate::altrep::RBase::Int)
    }
    unsafe fn install_methods(cls: crate::sys::altrep::R_altrep_class_t) {
        unsafe {
            crate::altrep_bridge::install_base::<AltrepBuffer<i32>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<AltrepBuffer<i32>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_int::<AltrepBuffer<i32>>(cls)
        };
    }
}
impl RegisterAltrep for AltrepBuffer<i32> {
    fn get_or_init_class() -> crate::sys::altrep::R_altrep_class_t {
        use std::sync::OnceLock;
        static CLASS: OnceLock<crate::sys::altrep::R_altrep_class_t> =
            OnceLock::new();
        *CLASS.get_or_init(||
                    {
                        const CLASS_NAME: &[u8] = "Buffer_i32\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <AltrepBuffer<i32> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <AltrepBuffer<i32> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Buffer_i32() {
    <AltrepBuffer<i32> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_BUFFER_I32: crate::registry::AltrepRegistration =
    {
        #[allow(clippy :: no_effect_underscore_binding)]
        unsafe fn __typecheck(_: crate::linkme::__private36::Void) {
            #[allow(clippy :: ref_option_ref)]
            let __new =
                || -> fn() -> &'static crate::registry::AltrepRegistration
                    { || &__MX_ALTREP_REG_BUFFER_I32 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Buffer_i32,
            symbol: "__mx_altrep_reg_builtin_Buffer_i32",
        }
    };buffer_class!(
41    i32,
42    i32,
43    __impl_altinteger_methods,
44    impl_inferbase_integer,
45    "Buffer_i32",
46    __mx_altrep_reg_builtin_Buffer_i32,
47    __MX_ALTREP_REG_BUFFER_I32
48);
49impl crate::altrep_traits::Altrep for AltrepBuffer<f64> where  {
    const GUARD: crate::altrep_traits::AltrepGuard =
        crate::altrep_traits::AltrepGuard::RUnwind;
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: crate::SEXP, _deep: bool) -> crate::SEXP {
        unsafe { super::duplicate_altrep_owner::<Self>(x) }
    }
    fn length(x: crate::SEXP) -> crate::R_xlen_t {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return crate::SexpExt::len(&data2) as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as crate::altrep_data::AltrepLen>::altrep_len(data)
            as crate::R_xlen_t
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: crate::SEXP) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                crate::altrep_data::AltrepSerialize>::serialized_state(data)
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: crate::SEXP, state: crate::SEXP) -> crate::SEXP {
        let ::core::option::Option::Some(data) =
            <AltrepBuffer<f64> as
                    crate::altrep_data::AltrepSerialize>::unserialize(state) else {
                {
                    ::core::panicking::panic_fmt(format_args!("ALTREP unserialize failed for {0}",
                            ::core::any::type_name::<AltrepBuffer<f64>>()));
                };
            };
        unsafe {
            use crate::SEXP;
            use crate::externalptr::ExternalPtr;
            use crate::sys::altrep::R_altrep_class_t;
            use crate::sys::{Rf_protect_unchecked, Rf_unprotect_unchecked};
            let ext_ptr = ExternalPtr::new_unchecked(data);
            let data1 = ext_ptr.as_sexp();
            Rf_protect_unchecked(data1);
            let cls = R_altrep_class_t::from_sexp(class);
            let out = cls.new_altrep_unchecked(data1, SEXP::nil());
            Rf_unprotect_unchecked(1);
            out
        }
    }
}
impl crate::altrep_traits::AltVec for AltrepBuffer<f64> where  {
    const HAS_DATAPTR: bool = true;
    fn dataptr(x: crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2).cast_mut();
            }
        }
        let direct =
            if writable {
                let d =
                    unsafe {
                        <AltrepBuffer<f64> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<f64> as
                            crate::altrep_data::AltrepDataptr<f64>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <AltrepBuffer<f64> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <AltrepBuffer<f64> as
                                crate::altrep_data::AltrepDataptr<f64>>::dataptr_or_null(d)
                    };
                if let ::core::option::Option::Some(p) = ro {
                    return p.cast_mut().cast::<::core::ffi::c_void>();
                }
                let d =
                    unsafe {
                        <AltrepBuffer<f64> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<f64> as
                            crate::altrep_data::AltrepDataptr<f64>>::dataptr(d,
                        false).map(|p| p.cast::<::core::ffi::c_void>())
            };
        if let ::core::option::Option::Some(p) = direct { return p; }
        unsafe { crate::altrep_data::materialize_altrep_data2::<f64>(x) }
    }
    const HAS_DATAPTR_OR_NULL: bool = true;
    fn dataptr_or_null(x: crate::SEXP) -> *const ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2);
            }
        }
        let d =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepDataptr<f64>>::dataptr_or_null(d).map(|p|
                    p.cast::<::core::ffi::c_void>()).unwrap_or(::core::ptr::null())
    }
}
impl crate::altrep_traits::AltReal for AltrepBuffer<f64> where  {
    const HAS_ELT: bool = true;
    fn elt(x: crate::SEXP, i: crate::R_xlen_t) -> f64 {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return <f64 as crate::RNativeType>::elt(data2, i.max(0));
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                crate::altrep_data::AltRealData>::elt(data, i.max(0) as usize)
    }
    const HAS_GET_REGION: bool = true;
    fn get_region(x: crate::SEXP, start: crate::R_xlen_t,
        len: crate::R_xlen_t, buf: &mut [f64]) -> crate::R_xlen_t {
        if start < 0 || len <= 0 { return 0; }
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return unsafe {
                        crate::altrep_data::materialized_altrep_region::<f64>(data2,
                            start as usize, len as usize, buf)
                    } as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <AltrepBuffer<f64> as
                    crate::altrep_data::AltRealData>::get_region(data,
                start as usize, len, buf) as crate::R_xlen_t
    }
    const HAS_IS_SORTED: bool = true;
    fn is_sorted(x: crate::SEXP) -> i32 {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::altrep_traits::UNKNOWN_SORTEDNESS;
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                        crate::altrep_data::AltRealData>::is_sorted(data).map(|s|
                    s.to_r_int()).unwrap_or(i32::MIN)
    }
    const HAS_NO_NA: bool = true;
    fn no_na(x: crate::SEXP) -> i32 {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return 0;
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                        crate::altrep_data::AltRealData>::no_na(data).map(|b|
                    if b { 1 } else { 0 }).unwrap_or(0)
    }
    const HAS_SUM: bool = true;
    fn sum(x: crate::SEXP, narm: bool) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                        crate::altrep_data::AltRealData>::sum(data,
                    narm).map(|s|
                    crate::SEXP::scalar_real(s)).unwrap_or(crate::SEXP::null())
    }
    const HAS_MIN: bool = true;
    fn min(x: crate::SEXP, narm: bool) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                        crate::altrep_data::AltRealData>::min(data,
                    narm).map(|m|
                    crate::SEXP::scalar_real(m)).unwrap_or(crate::SEXP::null())
    }
    const HAS_MAX: bool = true;
    fn max(x: crate::SEXP, narm: bool) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<f64> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<f64> as
                        crate::altrep_data::AltRealData>::max(data,
                    narm).map(|m|
                    crate::SEXP::scalar_real(m)).unwrap_or(crate::SEXP::null())
    }
}
impl crate::altrep_data::InferBase for AltrepBuffer<f64> where  {
    const BASE: crate::altrep::RBase = crate::altrep::RBase::Real;
    unsafe fn make_class(class_name: *const ::core::ffi::c_char,
        pkg_name: *const ::core::ffi::c_char)
        -> crate::sys::altrep::R_altrep_class_t {
        let dll = crate::altrep_dll_info();
        let cls =
            unsafe {
                crate::sys::altrep::R_make_altreal_class(class_name, pkg_name,
                    dll)
            };
        let name = unsafe { ::core::ffi::CStr::from_ptr(class_name) };
        crate::altrep::validate_altrep_class(cls, name,
            crate::altrep::RBase::Real)
    }
    unsafe fn install_methods(cls: crate::sys::altrep::R_altrep_class_t) {
        unsafe {
            crate::altrep_bridge::install_base::<AltrepBuffer<f64>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<AltrepBuffer<f64>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_real::<AltrepBuffer<f64>>(cls)
        };
    }
}
impl RegisterAltrep for AltrepBuffer<f64> {
    fn get_or_init_class() -> crate::sys::altrep::R_altrep_class_t {
        use std::sync::OnceLock;
        static CLASS: OnceLock<crate::sys::altrep::R_altrep_class_t> =
            OnceLock::new();
        *CLASS.get_or_init(||
                    {
                        const CLASS_NAME: &[u8] = "Buffer_f64\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <AltrepBuffer<f64> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <AltrepBuffer<f64> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Buffer_f64() {
    <AltrepBuffer<f64> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_BUFFER_F64: crate::registry::AltrepRegistration =
    {
        #[allow(clippy :: no_effect_underscore_binding)]
        unsafe fn __typecheck(_: crate::linkme::__private36::Void) {
            #[allow(clippy :: ref_option_ref)]
            let __new =
                || -> fn() -> &'static crate::registry::AltrepRegistration
                    { || &__MX_ALTREP_REG_BUFFER_F64 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Buffer_f64,
            symbol: "__mx_altrep_reg_builtin_Buffer_f64",
        }
    };buffer_class!(
50    f64,
51    f64,
52    __impl_altreal_methods,
53    impl_inferbase_real,
54    "Buffer_f64",
55    __mx_altrep_reg_builtin_Buffer_f64,
56    __MX_ALTREP_REG_BUFFER_F64
57);
58impl crate::altrep_traits::Altrep for AltrepBuffer<u8> where  {
    const GUARD: crate::altrep_traits::AltrepGuard =
        crate::altrep_traits::AltrepGuard::RUnwind;
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: crate::SEXP, _deep: bool) -> crate::SEXP {
        unsafe { super::duplicate_altrep_owner::<Self>(x) }
    }
    fn length(x: crate::SEXP) -> crate::R_xlen_t {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return crate::SexpExt::len(&data2) as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<u8> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<u8> as crate::altrep_data::AltrepLen>::altrep_len(data)
            as crate::R_xlen_t
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: crate::SEXP) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<u8> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<u8> as
                crate::altrep_data::AltrepSerialize>::serialized_state(data)
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: crate::SEXP, state: crate::SEXP) -> crate::SEXP {
        let ::core::option::Option::Some(data) =
            <AltrepBuffer<u8> as
                    crate::altrep_data::AltrepSerialize>::unserialize(state) else {
                {
                    ::core::panicking::panic_fmt(format_args!("ALTREP unserialize failed for {0}",
                            ::core::any::type_name::<AltrepBuffer<u8>>()));
                };
            };
        unsafe {
            use crate::SEXP;
            use crate::externalptr::ExternalPtr;
            use crate::sys::altrep::R_altrep_class_t;
            use crate::sys::{Rf_protect_unchecked, Rf_unprotect_unchecked};
            let ext_ptr = ExternalPtr::new_unchecked(data);
            let data1 = ext_ptr.as_sexp();
            Rf_protect_unchecked(data1);
            let cls = R_altrep_class_t::from_sexp(class);
            let out = cls.new_altrep_unchecked(data1, SEXP::nil());
            Rf_unprotect_unchecked(1);
            out
        }
    }
}
impl crate::altrep_traits::AltVec for AltrepBuffer<u8> where  {
    const HAS_DATAPTR: bool = true;
    fn dataptr(x: crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2).cast_mut();
            }
        }
        let direct =
            if writable {
                let d =
                    unsafe {
                        <AltrepBuffer<u8> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<u8> as
                            crate::altrep_data::AltrepDataptr<u8>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <AltrepBuffer<u8> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <AltrepBuffer<u8> as
                                crate::altrep_data::AltrepDataptr<u8>>::dataptr_or_null(d)
                    };
                if let ::core::option::Option::Some(p) = ro {
                    return p.cast_mut().cast::<::core::ffi::c_void>();
                }
                let d =
                    unsafe {
                        <AltrepBuffer<u8> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<u8> as
                            crate::altrep_data::AltrepDataptr<u8>>::dataptr(d,
                        false).map(|p| p.cast::<::core::ffi::c_void>())
            };
        if let ::core::option::Option::Some(p) = direct { return p; }
        unsafe { crate::altrep_data::materialize_altrep_data2::<u8>(x) }
    }
    const HAS_DATAPTR_OR_NULL: bool = true;
    fn dataptr_or_null(x: crate::SEXP) -> *const ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2);
            }
        }
        let d =
            unsafe {
                <AltrepBuffer<u8> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<u8> as
                        crate::altrep_data::AltrepDataptr<u8>>::dataptr_or_null(d).map(|p|
                    p.cast::<::core::ffi::c_void>()).unwrap_or(::core::ptr::null())
    }
}
impl crate::altrep_traits::AltRaw for AltrepBuffer<u8> where  {
    const HAS_ELT: bool = true;
    fn elt(x: crate::SEXP, i: crate::R_xlen_t) -> u8 {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return <u8 as crate::RNativeType>::elt(data2, i.max(0));
        }
        let data =
            unsafe {
                <AltrepBuffer<u8> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<u8> as
                crate::altrep_data::AltRawData>::elt(data, i.max(0) as usize)
    }
    const HAS_GET_REGION: bool = true;
    fn get_region(x: crate::SEXP, start: crate::R_xlen_t,
        len: crate::R_xlen_t, buf: &mut [u8]) -> crate::R_xlen_t {
        if start < 0 || len <= 0 { return 0; }
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return unsafe {
                        crate::altrep_data::materialized_altrep_region::<u8>(data2,
                            start as usize, len as usize, buf)
                    } as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<u8> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <AltrepBuffer<u8> as
                    crate::altrep_data::AltRawData>::get_region(data,
                start as usize, len, buf) as crate::R_xlen_t
    }
}
impl crate::altrep_data::InferBase for AltrepBuffer<u8> where  {
    const BASE: crate::altrep::RBase = crate::altrep::RBase::Raw;
    unsafe fn make_class(class_name: *const ::core::ffi::c_char,
        pkg_name: *const ::core::ffi::c_char)
        -> crate::sys::altrep::R_altrep_class_t {
        let dll = crate::altrep_dll_info();
        let cls =
            unsafe {
                crate::sys::altrep::R_make_altraw_class(class_name, pkg_name,
                    dll)
            };
        let name = unsafe { ::core::ffi::CStr::from_ptr(class_name) };
        crate::altrep::validate_altrep_class(cls, name,
            crate::altrep::RBase::Raw)
    }
    unsafe fn install_methods(cls: crate::sys::altrep::R_altrep_class_t) {
        unsafe {
            crate::altrep_bridge::install_base::<AltrepBuffer<u8>>(cls)
        };
        unsafe { crate::altrep_bridge::install_vec::<AltrepBuffer<u8>>(cls) };
        unsafe { crate::altrep_bridge::install_raw::<AltrepBuffer<u8>>(cls) };
    }
}
impl RegisterAltrep for AltrepBuffer<u8> {
    fn get_or_init_class() -> crate::sys::altrep::R_altrep_class_t {
        use std::sync::OnceLock;
        static CLASS: OnceLock<crate::sys::altrep::R_altrep_class_t> =
            OnceLock::new();
        *CLASS.get_or_init(||
                    {
                        const CLASS_NAME: &[u8] = "Buffer_u8\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <AltrepBuffer<u8> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <AltrepBuffer<u8> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Buffer_u8() {
    <AltrepBuffer<u8> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_BUFFER_U8: crate::registry::AltrepRegistration =
    {
        #[allow(clippy :: no_effect_underscore_binding)]
        unsafe fn __typecheck(_: crate::linkme::__private36::Void) {
            #[allow(clippy :: ref_option_ref)]
            let __new =
                || -> fn() -> &'static crate::registry::AltrepRegistration
                    { || &__MX_ALTREP_REG_BUFFER_U8 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Buffer_u8,
            symbol: "__mx_altrep_reg_builtin_Buffer_u8",
        }
    };buffer_class!(
59    u8,
60    u8,
61    __impl_altraw_methods,
62    impl_inferbase_raw,
63    "Buffer_u8",
64    __mx_altrep_reg_builtin_Buffer_u8,
65    __MX_ALTREP_REG_BUFFER_U8
66);
67impl crate::altrep_traits::Altrep for AltrepBuffer<crate::Rcomplex> where  {
    const GUARD: crate::altrep_traits::AltrepGuard =
        crate::altrep_traits::AltrepGuard::RUnwind;
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: crate::SEXP, _deep: bool) -> crate::SEXP {
        unsafe { super::duplicate_altrep_owner::<Self>(x) }
    }
    fn length(x: crate::SEXP) -> crate::R_xlen_t {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return crate::SexpExt::len(&data2) as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::Rcomplex> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::Rcomplex> as
                    crate::altrep_data::AltrepLen>::altrep_len(data) as
            crate::R_xlen_t
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: crate::SEXP) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::Rcomplex> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::Rcomplex> as
                crate::altrep_data::AltrepSerialize>::serialized_state(data)
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: crate::SEXP, state: crate::SEXP) -> crate::SEXP {
        let ::core::option::Option::Some(data) =
            <AltrepBuffer<crate::Rcomplex> as
                    crate::altrep_data::AltrepSerialize>::unserialize(state) else {
                {
                    ::core::panicking::panic_fmt(format_args!("ALTREP unserialize failed for {0}",
                            ::core::any::type_name::<AltrepBuffer<crate::Rcomplex>>()));
                };
            };
        unsafe {
            use crate::SEXP;
            use crate::externalptr::ExternalPtr;
            use crate::sys::altrep::R_altrep_class_t;
            use crate::sys::{Rf_protect_unchecked, Rf_unprotect_unchecked};
            let ext_ptr = ExternalPtr::new_unchecked(data);
            let data1 = ext_ptr.as_sexp();
            Rf_protect_unchecked(data1);
            let cls = R_altrep_class_t::from_sexp(class);
            let out = cls.new_altrep_unchecked(data1, SEXP::nil());
            Rf_unprotect_unchecked(1);
            out
        }
    }
}
impl crate::altrep_traits::AltVec for AltrepBuffer<crate::Rcomplex> where  {
    const HAS_DATAPTR: bool = true;
    fn dataptr(x: crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2).cast_mut();
            }
        }
        let direct =
            if writable {
                let d =
                    unsafe {
                        <AltrepBuffer<crate::Rcomplex> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<crate::Rcomplex> as
                            crate::altrep_data::AltrepDataptr<crate::Rcomplex>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <AltrepBuffer<crate::Rcomplex> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <AltrepBuffer<crate::Rcomplex> as
                                crate::altrep_data::AltrepDataptr<crate::Rcomplex>>::dataptr_or_null(d)
                    };
                if let ::core::option::Option::Some(p) = ro {
                    return p.cast_mut().cast::<::core::ffi::c_void>();
                }
                let d =
                    unsafe {
                        <AltrepBuffer<crate::Rcomplex> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<crate::Rcomplex> as
                            crate::altrep_data::AltrepDataptr<crate::Rcomplex>>::dataptr(d,
                        false).map(|p| p.cast::<::core::ffi::c_void>())
            };
        if let ::core::option::Option::Some(p) = direct { return p; }
        unsafe {
            crate::altrep_data::materialize_altrep_data2::<crate::Rcomplex>(x)
        }
    }
    const HAS_DATAPTR_OR_NULL: bool = true;
    fn dataptr_or_null(x: crate::SEXP) -> *const ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2);
            }
        }
        let d =
            unsafe {
                <AltrepBuffer<crate::Rcomplex> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::Rcomplex> as
                        crate::altrep_data::AltrepDataptr<crate::Rcomplex>>::dataptr_or_null(d).map(|p|
                    p.cast::<::core::ffi::c_void>()).unwrap_or(::core::ptr::null())
    }
}
impl crate::altrep_traits::AltComplex for AltrepBuffer<crate::Rcomplex> where
    {
    const HAS_ELT: bool = true;
    fn elt(x: crate::SEXP, i: crate::R_xlen_t) -> crate::Rcomplex {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return <crate::Rcomplex as
                        crate::RNativeType>::elt(data2, i.max(0));
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::Rcomplex> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::Rcomplex> as
                crate::altrep_data::AltComplexData>::elt(data,
            i.max(0) as usize)
    }
    const HAS_GET_REGION: bool = true;
    fn get_region(x: crate::SEXP, start: crate::R_xlen_t,
        len: crate::R_xlen_t, buf: &mut [crate::Rcomplex])
        -> crate::R_xlen_t {
        if start < 0 || len <= 0 { return 0; }
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return unsafe {
                        crate::altrep_data::materialized_altrep_region::<crate::Rcomplex>(data2,
                            start as usize, len as usize, buf)
                    } as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::Rcomplex> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <AltrepBuffer<crate::Rcomplex> as
                    crate::altrep_data::AltComplexData>::get_region(data,
                start as usize, len, buf) as crate::R_xlen_t
    }
}
impl crate::altrep_data::InferBase for AltrepBuffer<crate::Rcomplex> where  {
    const BASE: crate::altrep::RBase = crate::altrep::RBase::Complex;
    unsafe fn make_class(class_name: *const ::core::ffi::c_char,
        pkg_name: *const ::core::ffi::c_char)
        -> crate::sys::altrep::R_altrep_class_t {
        let dll = crate::altrep_dll_info();
        let cls =
            unsafe {
                crate::sys::altrep::R_make_altcomplex_class(class_name,
                    pkg_name, dll)
            };
        let name = unsafe { ::core::ffi::CStr::from_ptr(class_name) };
        crate::altrep::validate_altrep_class(cls, name,
            crate::altrep::RBase::Complex)
    }
    unsafe fn install_methods(cls: crate::sys::altrep::R_altrep_class_t) {
        unsafe {
            crate::altrep_bridge::install_base::<AltrepBuffer<crate::Rcomplex>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<AltrepBuffer<crate::Rcomplex>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_cplx::<AltrepBuffer<crate::Rcomplex>>(cls)
        };
    }
}
impl RegisterAltrep for AltrepBuffer<crate::Rcomplex> {
    fn get_or_init_class() -> crate::sys::altrep::R_altrep_class_t {
        use std::sync::OnceLock;
        static CLASS: OnceLock<crate::sys::altrep::R_altrep_class_t> =
            OnceLock::new();
        *CLASS.get_or_init(||
                    {
                        const CLASS_NAME: &[u8] = "Buffer_Rcomplex\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <AltrepBuffer<crate::Rcomplex> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <AltrepBuffer<crate::Rcomplex> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Buffer_Rcomplex() {
    <AltrepBuffer<crate::Rcomplex> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_BUFFER_RCOMPLEX: crate::registry::AltrepRegistration =
    {
        #[allow(clippy :: no_effect_underscore_binding)]
        unsafe fn __typecheck(_: crate::linkme::__private36::Void) {
            #[allow(clippy :: ref_option_ref)]
            let __new =
                || -> fn() -> &'static crate::registry::AltrepRegistration
                    { || &__MX_ALTREP_REG_BUFFER_RCOMPLEX };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Buffer_Rcomplex,
            symbol: "__mx_altrep_reg_builtin_Buffer_Rcomplex",
        }
    };buffer_class!(
68    crate::Rcomplex,
69    crate::Rcomplex,
70    __impl_altcomplex_methods,
71    impl_inferbase_complex,
72    "Buffer_Rcomplex",
73    __mx_altrep_reg_builtin_Buffer_Rcomplex,
74    __MX_ALTREP_REG_BUFFER_RCOMPLEX
75);
76impl crate::altrep_traits::Altrep for AltrepBuffer<crate::RLogical> where  {
    const GUARD: crate::altrep_traits::AltrepGuard =
        crate::altrep_traits::AltrepGuard::RUnwind;
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: crate::SEXP, _deep: bool) -> crate::SEXP {
        unsafe { super::duplicate_altrep_owner::<Self>(x) }
    }
    fn length(x: crate::SEXP) -> crate::R_xlen_t {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return crate::SexpExt::len(&data2) as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::RLogical> as
                    crate::altrep_data::AltrepLen>::altrep_len(data) as
            crate::R_xlen_t
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: crate::SEXP) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::RLogical> as
                crate::altrep_data::AltrepSerialize>::serialized_state(data)
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: crate::SEXP, state: crate::SEXP) -> crate::SEXP {
        let ::core::option::Option::Some(data) =
            <AltrepBuffer<crate::RLogical> as
                    crate::altrep_data::AltrepSerialize>::unserialize(state) else {
                {
                    ::core::panicking::panic_fmt(format_args!("ALTREP unserialize failed for {0}",
                            ::core::any::type_name::<AltrepBuffer<crate::RLogical>>()));
                };
            };
        unsafe {
            use crate::SEXP;
            use crate::externalptr::ExternalPtr;
            use crate::sys::altrep::R_altrep_class_t;
            use crate::sys::{Rf_protect_unchecked, Rf_unprotect_unchecked};
            let ext_ptr = ExternalPtr::new_unchecked(data);
            let data1 = ext_ptr.as_sexp();
            Rf_protect_unchecked(data1);
            let cls = R_altrep_class_t::from_sexp(class);
            let out = cls.new_altrep_unchecked(data1, SEXP::nil());
            Rf_unprotect_unchecked(1);
            out
        }
    }
}
impl crate::altrep_traits::AltVec for AltrepBuffer<crate::RLogical> where  {
    const HAS_DATAPTR: bool = true;
    fn dataptr(x: crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2).cast_mut();
            }
        }
        let direct =
            if writable {
                let d =
                    unsafe {
                        <AltrepBuffer<crate::RLogical> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<crate::RLogical> as
                            crate::altrep_data::AltrepDataptr<i32>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <AltrepBuffer<crate::RLogical> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <AltrepBuffer<crate::RLogical> as
                                crate::altrep_data::AltrepDataptr<i32>>::dataptr_or_null(d)
                    };
                if let ::core::option::Option::Some(p) = ro {
                    return p.cast_mut().cast::<::core::ffi::c_void>();
                }
                let d =
                    unsafe {
                        <AltrepBuffer<crate::RLogical> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <AltrepBuffer<crate::RLogical> as
                            crate::altrep_data::AltrepDataptr<i32>>::dataptr(d,
                        false).map(|p| p.cast::<::core::ffi::c_void>())
            };
        if let ::core::option::Option::Some(p) = direct { return p; }
        unsafe { crate::altrep_data::materialize_altrep_data2::<i32>(x) }
    }
    const HAS_DATAPTR_OR_NULL: bool = true;
    fn dataptr_or_null(x: crate::SEXP) -> *const ::core::ffi::c_void {
        unsafe {
            if let ::core::option::Option::Some(data2) =
                    crate::altrep_data::materialized_altrep_data2(x) {
                return crate::sys::DATAPTR_RO(data2);
            }
        }
        let d =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepDataptr<i32>>::dataptr_or_null(d).map(|p|
                    p.cast::<::core::ffi::c_void>()).unwrap_or(::core::ptr::null())
    }
}
impl crate::altrep_traits::AltLogical for AltrepBuffer<crate::RLogical> where
    {
    const HAS_ELT: bool = true;
    fn elt(x: crate::SEXP, i: crate::R_xlen_t) -> i32 {
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return <crate::RLogical as
                            crate::RNativeType>::elt(data2, i.max(0)).to_i32();
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let i = i.max(0) as usize;
        if let ::core::option::Option::Some(values) =
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltLogicalData>::as_r_slice(data) {
            return values[i];
        }
        <AltrepBuffer<crate::RLogical> as
                    crate::altrep_data::AltLogicalData>::elt(data, i).to_r_int()
    }
    const HAS_GET_REGION: bool = true;
    fn get_region(x: crate::SEXP, start: crate::R_xlen_t,
        len: crate::R_xlen_t, buf: &mut [i32]) -> crate::R_xlen_t {
        if start < 0 || len <= 0 { return 0; }
        if let ::core::option::Option::Some(data2) =
                unsafe { crate::altrep_data::materialized_altrep_data2(x) } {
            return unsafe {
                        crate::altrep_data::materialized_altrep_region::<i32>(data2,
                            start as usize, len as usize, buf)
                    } as crate::R_xlen_t;
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <AltrepBuffer<crate::RLogical> as
                    crate::altrep_data::AltLogicalData>::get_region(data,
                start as usize, len, buf) as crate::R_xlen_t
    }
    const HAS_IS_SORTED: bool = true;
    fn is_sorted(x: crate::SEXP) -> i32 {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::altrep_traits::UNKNOWN_SORTEDNESS;
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltLogicalData>::is_sorted(data).map(|s|
                    s.to_r_int()).unwrap_or(i32::MIN)
    }
    const HAS_NO_NA: bool = true;
    fn no_na(x: crate::SEXP) -> i32 {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return 0;
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltLogicalData>::no_na(data).map(|b|
                    if b { 1 } else { 0 }).unwrap_or(0)
    }
    const HAS_SUM: bool = true;
    fn sum(x: crate::SEXP, narm: bool) -> crate::SEXP {
        if unsafe { crate::altrep_data::altrep_values_written(x) } {
            return crate::SEXP::null();
        }
        let data =
            unsafe {
                <AltrepBuffer<crate::RLogical> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <AltrepBuffer<crate::RLogical> as
                    crate::altrep_data::AltLogicalData>::sum(data, narm) {
            ::core::option::Option::Some(s) => {
                if s >= i32::MIN as i64 && s <= i32::MAX as i64 {
                    crate::SEXP::scalar_integer(s as i32)
                } else { crate::SEXP::scalar_real(s as f64) }
            }
            ::core::option::Option::None => crate::SEXP::null(),
        }
    }
}
impl crate::altrep_data::InferBase for AltrepBuffer<crate::RLogical> where  {
    const BASE: crate::altrep::RBase = crate::altrep::RBase::Logical;
    unsafe fn make_class(class_name: *const ::core::ffi::c_char,
        pkg_name: *const ::core::ffi::c_char)
        -> crate::sys::altrep::R_altrep_class_t {
        let dll = crate::altrep_dll_info();
        let cls =
            unsafe {
                crate::sys::altrep::R_make_altlogical_class(class_name,
                    pkg_name, dll)
            };
        let name = unsafe { ::core::ffi::CStr::from_ptr(class_name) };
        crate::altrep::validate_altrep_class(cls, name,
            crate::altrep::RBase::Logical)
    }
    unsafe fn install_methods(cls: crate::sys::altrep::R_altrep_class_t) {
        unsafe {
            crate::altrep_bridge::install_base::<AltrepBuffer<crate::RLogical>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<AltrepBuffer<crate::RLogical>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_lgl::<AltrepBuffer<crate::RLogical>>(cls)
        };
    }
}
impl RegisterAltrep for AltrepBuffer<crate::RLogical> {
    fn get_or_init_class() -> crate::sys::altrep::R_altrep_class_t {
        use std::sync::OnceLock;
        static CLASS: OnceLock<crate::sys::altrep::R_altrep_class_t> =
            OnceLock::new();
        *CLASS.get_or_init(||
                    {
                        const CLASS_NAME: &[u8] = "Buffer_RLogical\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <AltrepBuffer<crate::RLogical> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <AltrepBuffer<crate::RLogical> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Buffer_RLogical() {
    <AltrepBuffer<crate::RLogical> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_BUFFER_RLOGICAL: crate::registry::AltrepRegistration =
    {
        #[allow(clippy :: no_effect_underscore_binding)]
        unsafe fn __typecheck(_: crate::linkme::__private36::Void) {
            #[allow(clippy :: ref_option_ref)]
            let __new =
                || -> fn() -> &'static crate::registry::AltrepRegistration
                    { || &__MX_ALTREP_REG_BUFFER_RLOGICAL };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Buffer_RLogical,
            symbol: "__mx_altrep_reg_builtin_Buffer_RLogical",
        }
    };buffer_class!(
77    crate::RLogical,
78    i32,
79    __impl_altlogical_methods,
80    impl_inferbase_logical,
81    "Buffer_RLogical",
82    __mx_altrep_reg_builtin_Buffer_RLogical,
83    __MX_ALTREP_REG_BUFFER_RLOGICAL
84);