Skip to main content

miniextendr_api/altrep_impl/
shared_slices.rs

1//! Shared slice owners with coordinated COW and duplicate policies.
2//!
3//! Element/region reads share Rc/Arc storage. A native contiguous pointer request
4//! establishes unique ownership, including detaching any Weak references. Once
5//! unique, duplication copies the allocation instead of re-sharing it, preserving
6//! exposed pointers. This conservatively copies even an unexposed unique owner.
7//!
8//! bool and String keep R's values in data2 (a logical vector or the string
9//! element cache). Duplication copies data2 when present, through
10//! `duplicate_altrep_data2`, and serialization falls back to an ordinary vector
11//! once R has written to it.
12
13use std::rc::Rc;
14use std::sync::Arc;
15
16use crate::altrep::RegisterAltrep;
17use crate::altrep_data::{AltrepExtract, altrep_values_written, materialized_altrep_data2};
18use crate::altrep_ext::AltrepSexpExt;
19use crate::altrep_traits::Altrep;
20use crate::{IntoR, OwnedProtect, SEXP, SexpExt, TryFromSexp};
21
22macro_rules! impl_shared_slice {
23    ($owner:ident, $elem:ty, $class:literal, $register:ident, $entry:ident) => {
24        impl Altrep for $owner<[$elem]> {
25            fn length(x: SEXP) -> crate::R_xlen_t {
26                if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
27                    return cache
28                        .len()
29                        .try_into()
30                        .expect("ALTREP length exceeds R_xlen_t");
31                }
32                unsafe { Self::altrep_extract_ref(x) }
33                    .len()
34                    .try_into()
35                    .expect("ALTREP length exceeds R_xlen_t")
36            }
37
38            const HAS_DUPLICATE: bool = true;
39            fn duplicate(x: SEXP, _deep: bool) -> SEXP {
40                let data = unsafe { Self::altrep_extract_ref(x) };
41                let owner = if $owner::strong_count(data) == 1 && $owner::weak_count(data) == 0 {
42                    // This allocation may have an outstanding R pointer.
43                    $owner::<[$elem]>::from(data.as_ref())
44                } else {
45                    $owner::clone(data)
46                };
47                let out = unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
48                if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
49                    // R may have written into data2: copy its current values
50                    // rather than rebuild them from data1.
51                    unsafe {
52                        let copy = super::duplicate_altrep_data2(data2);
53                        AltrepSexpExt::set_altrep_data2(&out.get(), copy);
54                    }
55                }
56                out.get()
57            }
58
59            const HAS_SERIALIZED_STATE: bool = true;
60            fn serialized_state(x: SEXP) -> SEXP {
61                if unsafe { altrep_values_written(x) } {
62                    return SEXP::null();
63                }
64                unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
65            }
66
67            const HAS_UNSERIALIZE: bool = true;
68            fn unserialize(class: SEXP, state: SEXP) -> SEXP {
69                let values = Vec::<$elem>::try_from_sexp(state)
70                    .expect("invalid shared-slice ALTREP serialized state");
71                let owner = $owner::<[$elem]>::from(values);
72                unsafe {
73                    let ptr = crate::ExternalPtr::new_unchecked(owner);
74                    let data1 = OwnedProtect::new(ptr.as_sexp());
75                    crate::sys::altrep::R_altrep_class_t::from_sexp(class)
76                        .new_altrep_unchecked(data1.get(), SEXP::nil())
77                }
78            }
79        }
80
81        super::builtins::impl_register_altrep_builtin!($owner<[$elem]>, $class);
82
83        #[doc(hidden)]
84        #[unsafe(no_mangle)]
85        pub extern "C-unwind" fn $register() {
86            <$owner<[$elem]> as RegisterAltrep>::get_or_init_class();
87        }
88        #[cfg_attr(
89                    not(target_arch = "wasm32"),
90                    crate::linkme::distributed_slice(crate::registry::MX_ALTREP_REGISTRATIONS),
91                    linkme(crate = crate::linkme)
92                )]
93        static $entry: crate::registry::AltrepRegistration = crate::registry::AltrepRegistration {
94            register: $register,
95            symbol: stringify!($register),
96        };
97    };
98}
99
100macro_rules! impl_shared_native {
101    ($owner:ident, $elem:ty, $storage:ty, $methods:ident, $infer:ident) => {
102        crate::__impl_altvec_dataptr!($owner<[$elem]>, $storage);
103        crate::$methods!($owner<[$elem]>);
104        crate::$infer!($owner<[$elem]>);
105    };
106}
107
108impl crate::altrep_traits::AltVec for Rc<[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 {
                        <Rc<[i32]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[i32]> as
                            crate::altrep_data::AltrepDataptr<i32>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Rc<[i32]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Rc<[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 {
                        <Rc<[i32]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 Rc<[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::<Rc<[i32]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Rc<[i32]>>(cls) };
        unsafe { crate::altrep_bridge::install_int::<Rc<[i32]>>(cls) };
    }
}impl_shared_native!(
109    Rc,
110    i32,
111    i32,
112    __impl_altinteger_methods,
113    impl_inferbase_integer
114);
115impl crate::altrep_traits::AltVec for Rc<[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 {
                        <Rc<[f64]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[f64]> as
                            crate::altrep_data::AltrepDataptr<f64>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Rc<[f64]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Rc<[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 {
                        <Rc<[f64]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 Rc<[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::<Rc<[f64]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Rc<[f64]>>(cls) };
        unsafe { crate::altrep_bridge::install_real::<Rc<[f64]>>(cls) };
    }
}impl_shared_native!(Rc, f64, f64, __impl_altreal_methods, impl_inferbase_real);
116impl crate::altrep_traits::AltVec for Rc<[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 {
                        <Rc<[u8]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[u8]> as
                            crate::altrep_data::AltrepDataptr<u8>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Rc<[u8]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Rc<[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 {
                        <Rc<[u8]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[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 {
                <Rc<[u8]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 Rc<[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 {
                <Rc<[u8]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[u8]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Rc<[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 Rc<[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::<Rc<[u8]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Rc<[u8]>>(cls) };
        unsafe { crate::altrep_bridge::install_raw::<Rc<[u8]>>(cls) };
    }
}impl_shared_native!(Rc, u8, u8, __impl_altraw_methods, impl_inferbase_raw);
117impl crate::altrep_traits::AltVec for Rc<[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 {
                        <Rc<[crate::Rcomplex]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[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 {
                                <Rc<[crate::Rcomplex]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Rc<[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 {
                        <Rc<[crate::Rcomplex]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[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 {
                <Rc<[crate::Rcomplex]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 Rc<[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 {
                <Rc<[crate::Rcomplex]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[crate::Rcomplex]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Rc<[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 Rc<[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::<Rc<[crate::Rcomplex]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<Rc<[crate::Rcomplex]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_cplx::<Rc<[crate::Rcomplex]>>(cls)
        };
    }
}impl_shared_native!(
118    Rc,
119    crate::Rcomplex,
120    crate::Rcomplex,
121    __impl_altcomplex_methods,
122    impl_inferbase_complex
123);
124impl crate::altrep_traits::AltVec for Rc<[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 {
                        <Rc<[crate::RLogical]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[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 {
                                <Rc<[crate::RLogical]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Rc<[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 {
                        <Rc<[crate::RLogical]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[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 {
                <Rc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 Rc<[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 {
                <Rc<[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) =
                <Rc<[crate::RLogical]> as
                        crate::altrep_data::AltLogicalData>::as_r_slice(data) {
            return values[i];
        }
        <Rc<[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 {
                <Rc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Rc<[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 {
                <Rc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[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 {
                <Rc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <Rc<[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 Rc<[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::<Rc<[crate::RLogical]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<Rc<[crate::RLogical]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_lgl::<Rc<[crate::RLogical]>>(cls)
        };
    }
}impl_shared_native!(
125    Rc,
126    crate::RLogical,
127    i32,
128    __impl_altlogical_methods,
129    impl_inferbase_logical
130);
131impl crate::altrep_data::AltrepDataptr<crate::RLogical> for Rc<[bool]> where
    {
    fn dataptr(&mut self, _writable: bool)
        -> ::core::option::Option<*mut crate::RLogical> {
        ::core::option::Option::None
    }
}
impl crate::altrep_traits::AltVec for Rc<[bool]> 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 {
                        <Rc<[bool]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[bool]> as
                            crate::altrep_data::AltrepDataptr<crate::RLogical>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Rc<[bool]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Rc<[bool]> as
                                crate::altrep_data::AltrepDataptr<crate::RLogical>>::dataptr_or_null(d)
                    };
                if let ::core::option::Option::Some(p) = ro {
                    return p.cast_mut().cast::<::core::ffi::c_void>();
                }
                let d =
                    unsafe {
                        <Rc<[bool]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Rc<[bool]> as
                            crate::altrep_data::AltrepDataptr<crate::RLogical>>::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::RLogical>(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 {
                <Rc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[bool]> as
                        crate::altrep_data::AltrepDataptr<crate::RLogical>>::dataptr_or_null(d).map(|p|
                    p.cast::<::core::ffi::c_void>()).unwrap_or(::core::ptr::null())
    }
}crate::__impl_altvec_logical_dataptr!(Rc<[bool]>);
132impl crate::altrep_traits::AltLogical for Rc<[bool]> 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 {
                <Rc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let i = i.max(0) as usize;
        if let ::core::option::Option::Some(values) =
                <Rc<[bool]> as
                        crate::altrep_data::AltLogicalData>::as_r_slice(data) {
            return values[i];
        }
        <Rc<[bool]> 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 {
                <Rc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Rc<[bool]> 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 {
                <Rc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[bool]> 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 {
                <Rc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[bool]> 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 {
                <Rc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <Rc<[bool]> 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(),
        }
    }
}crate::__impl_altlogical_methods!(Rc<[bool]>);
133impl crate::altrep_data::InferBase for Rc<[bool]> 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::<Rc<[bool]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Rc<[bool]>>(cls) };
        unsafe { crate::altrep_bridge::install_lgl::<Rc<[bool]>>(cls) };
    }
}crate::impl_inferbase_logical!(Rc<[bool]>);
134impl crate::altrep_traits::AltVec for Rc<[String]> where  {
    const HAS_DATAPTR: bool = true;
    fn dataptr(x: crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
        unsafe {
            crate::altrep_impl::altstring_dataptr::<Rc<[String]>>(x, writable)
        }
    }
    const HAS_DATAPTR_OR_NULL: bool = true;
    fn dataptr_or_null(x: crate::SEXP) -> *const ::core::ffi::c_void {
        let _ = x;
        ::core::ptr::null()
    }
}crate::__impl_altvec_string_dataptr!(Rc<[String]>);
135impl crate::altrep_traits::AltString for Rc<[String]> where  {
    fn elt(x: crate::SEXP, i: crate::R_xlen_t) -> crate::SEXP {
        unsafe { crate::altrep_impl::altstring_elt::<Rc<[String]>>(x, i) }
    }
    const HAS_SET_ELT: bool = true;
    fn set_elt(x: crate::SEXP, i: crate::R_xlen_t, v: crate::SEXP) {
        unsafe {
            crate::altrep_impl::altstring_set_elt::<Rc<[String]>>(x, i, v)
        }
    }
    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 {
                <Rc<[String]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[String]> as
                        crate::altrep_data::AltStringData>::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 {
                <Rc<[String]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Rc<[String]> as
                        crate::altrep_data::AltStringData>::no_na(data).map(|b|
                    if b { 1 } else { 0 }).unwrap_or(0)
    }
}crate::__impl_altstring_methods!(Rc<[String]>);
136impl crate::altrep_data::InferBase for Rc<[String]> where  {
    const BASE: crate::altrep::RBase = crate::altrep::RBase::String;
    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_altstring_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::String)
    }
    unsafe fn install_methods(cls: crate::sys::altrep::R_altrep_class_t) {
        unsafe { crate::altrep_bridge::install_base::<Rc<[String]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Rc<[String]>>(cls) };
        unsafe { crate::altrep_bridge::install_str::<Rc<[String]>>(cls) };
    }
}crate::impl_inferbase_string!(Rc<[String]>);
137impl Altrep for Rc<[i32]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Rc::strong_count(data) == 1 && Rc::weak_count(data) == 0 {
                Rc::<[i32]>::from(data.as_ref())
            } else { Rc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<i32>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Rc::<[i32]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Rc<[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] = "Rc_i32\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Rc<[i32]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Rc<[i32]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Rc_i32() {
    <Rc<[i32]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_RC_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_SHARED_RC_I32 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Rc_i32,
            symbol: "__mx_altrep_reg_builtin_Rc_i32",
        }
    };impl_shared_slice!(
138    Rc,
139    i32,
140    "Rc_i32",
141    __mx_altrep_reg_builtin_Rc_i32,
142    __MX_ALTREP_REG_SHARED_RC_I32
143);
144impl Altrep for Rc<[f64]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Rc::strong_count(data) == 1 && Rc::weak_count(data) == 0 {
                Rc::<[f64]>::from(data.as_ref())
            } else { Rc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<f64>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Rc::<[f64]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Rc<[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] = "Rc_f64\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Rc<[f64]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Rc<[f64]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Rc_f64() {
    <Rc<[f64]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_RC_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_SHARED_RC_F64 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Rc_f64,
            symbol: "__mx_altrep_reg_builtin_Rc_f64",
        }
    };impl_shared_slice!(
145    Rc,
146    f64,
147    "Rc_f64",
148    __mx_altrep_reg_builtin_Rc_f64,
149    __MX_ALTREP_REG_SHARED_RC_F64
150);
151impl Altrep for Rc<[u8]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Rc::strong_count(data) == 1 && Rc::weak_count(data) == 0 {
                Rc::<[u8]>::from(data.as_ref())
            } else { Rc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<u8>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Rc::<[u8]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Rc<[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] = "Rc_u8\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Rc<[u8]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Rc<[u8]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Rc_u8() {
    <Rc<[u8]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_RC_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_SHARED_RC_U8 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Rc_u8,
            symbol: "__mx_altrep_reg_builtin_Rc_u8",
        }
    };impl_shared_slice!(
152    Rc,
153    u8,
154    "Rc_u8",
155    __mx_altrep_reg_builtin_Rc_u8,
156    __MX_ALTREP_REG_SHARED_RC_U8
157);
158impl Altrep for Rc<[crate::Rcomplex]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Rc::strong_count(data) == 1 && Rc::weak_count(data) == 0 {
                Rc::<[crate::Rcomplex]>::from(data.as_ref())
            } else { Rc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<crate::Rcomplex>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Rc::<[crate::Rcomplex]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Rc<[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] = "Rc_Rcomplex\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Rc<[crate::Rcomplex]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Rc<[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_Rc_Rcomplex() {
    <Rc<[crate::Rcomplex]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_RC_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_SHARED_RC_RCOMPLEX };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Rc_Rcomplex,
            symbol: "__mx_altrep_reg_builtin_Rc_Rcomplex",
        }
    };impl_shared_slice!(
159    Rc,
160    crate::Rcomplex,
161    "Rc_Rcomplex",
162    __mx_altrep_reg_builtin_Rc_Rcomplex,
163    __MX_ALTREP_REG_SHARED_RC_RCOMPLEX
164);
165impl Altrep for Rc<[crate::RLogical]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Rc::strong_count(data) == 1 && Rc::weak_count(data) == 0 {
                Rc::<[crate::RLogical]>::from(data.as_ref())
            } else { Rc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<crate::RLogical>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Rc::<[crate::RLogical]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Rc<[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] = "Rc_RLogical\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Rc<[crate::RLogical]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Rc<[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_Rc_RLogical() {
    <Rc<[crate::RLogical]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_RC_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_SHARED_RC_RLOGICAL };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Rc_RLogical,
            symbol: "__mx_altrep_reg_builtin_Rc_RLogical",
        }
    };impl_shared_slice!(
166    Rc,
167    crate::RLogical,
168    "Rc_RLogical",
169    __mx_altrep_reg_builtin_Rc_RLogical,
170    __MX_ALTREP_REG_SHARED_RC_RLOGICAL
171);
172impl Altrep for Rc<[bool]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Rc::strong_count(data) == 1 && Rc::weak_count(data) == 0 {
                Rc::<[bool]>::from(data.as_ref())
            } else { Rc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<bool>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Rc::<[bool]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Rc<[bool]> {
    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] = "Rc_bool\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Rc<[bool]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Rc<[bool]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Rc_bool() {
    <Rc<[bool]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_RC_BOOL: 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_SHARED_RC_BOOL };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Rc_bool,
            symbol: "__mx_altrep_reg_builtin_Rc_bool",
        }
    };impl_shared_slice!(
173    Rc,
174    bool,
175    "Rc_bool",
176    __mx_altrep_reg_builtin_Rc_bool,
177    __MX_ALTREP_REG_SHARED_RC_BOOL
178);
179impl Altrep for Rc<[String]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Rc::strong_count(data) == 1 && Rc::weak_count(data) == 0 {
                Rc::<[String]>::from(data.as_ref())
            } else { Rc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<String>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Rc::<[String]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Rc<[String]> {
    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] = "Rc_String\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Rc<[String]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Rc<[String]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Rc_String() {
    <Rc<[String]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_RC_STRING: 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_SHARED_RC_STRING };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Rc_String,
            symbol: "__mx_altrep_reg_builtin_Rc_String",
        }
    };impl_shared_slice!(
180    Rc,
181    String,
182    "Rc_String",
183    __mx_altrep_reg_builtin_Rc_String,
184    __MX_ALTREP_REG_SHARED_RC_STRING
185);
186impl crate::altrep_traits::AltVec for Arc<[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 {
                        <Arc<[i32]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[i32]> as
                            crate::altrep_data::AltrepDataptr<i32>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Arc<[i32]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Arc<[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 {
                        <Arc<[i32]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[i32]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 Arc<[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::<Arc<[i32]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Arc<[i32]>>(cls) };
        unsafe { crate::altrep_bridge::install_int::<Arc<[i32]>>(cls) };
    }
}impl_shared_native!(
187    Arc,
188    i32,
189    i32,
190    __impl_altinteger_methods,
191    impl_inferbase_integer
192);
193impl crate::altrep_traits::AltVec for Arc<[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 {
                        <Arc<[f64]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[f64]> as
                            crate::altrep_data::AltrepDataptr<f64>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Arc<[f64]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Arc<[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 {
                        <Arc<[f64]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[f64]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 Arc<[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::<Arc<[f64]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Arc<[f64]>>(cls) };
        unsafe { crate::altrep_bridge::install_real::<Arc<[f64]>>(cls) };
    }
}impl_shared_native!(Arc, f64, f64, __impl_altreal_methods, impl_inferbase_real);
194impl crate::altrep_traits::AltVec for Arc<[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 {
                        <Arc<[u8]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[u8]> as
                            crate::altrep_data::AltrepDataptr<u8>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Arc<[u8]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Arc<[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 {
                        <Arc<[u8]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[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 {
                <Arc<[u8]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 Arc<[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 {
                <Arc<[u8]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[u8]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Arc<[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 Arc<[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::<Arc<[u8]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Arc<[u8]>>(cls) };
        unsafe { crate::altrep_bridge::install_raw::<Arc<[u8]>>(cls) };
    }
}impl_shared_native!(Arc, u8, u8, __impl_altraw_methods, impl_inferbase_raw);
195impl crate::altrep_traits::AltVec for Arc<[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 {
                        <Arc<[crate::Rcomplex]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[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 {
                                <Arc<[crate::Rcomplex]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Arc<[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 {
                        <Arc<[crate::Rcomplex]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[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 {
                <Arc<[crate::Rcomplex]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 Arc<[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 {
                <Arc<[crate::Rcomplex]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[crate::Rcomplex]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Arc<[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 Arc<[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::<Arc<[crate::Rcomplex]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<Arc<[crate::Rcomplex]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_cplx::<Arc<[crate::Rcomplex]>>(cls)
        };
    }
}impl_shared_native!(
196    Arc,
197    crate::Rcomplex,
198    crate::Rcomplex,
199    __impl_altcomplex_methods,
200    impl_inferbase_complex
201);
202impl crate::altrep_traits::AltVec for Arc<[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 {
                        <Arc<[crate::RLogical]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[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 {
                                <Arc<[crate::RLogical]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Arc<[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 {
                        <Arc<[crate::RLogical]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[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 {
                <Arc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 Arc<[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 {
                <Arc<[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) =
                <Arc<[crate::RLogical]> as
                        crate::altrep_data::AltLogicalData>::as_r_slice(data) {
            return values[i];
        }
        <Arc<[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 {
                <Arc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Arc<[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 {
                <Arc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[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 {
                <Arc<[crate::RLogical]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <Arc<[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 Arc<[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::<Arc<[crate::RLogical]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_vec::<Arc<[crate::RLogical]>>(cls)
        };
        unsafe {
            crate::altrep_bridge::install_lgl::<Arc<[crate::RLogical]>>(cls)
        };
    }
}impl_shared_native!(
203    Arc,
204    crate::RLogical,
205    i32,
206    __impl_altlogical_methods,
207    impl_inferbase_logical
208);
209impl crate::altrep_data::AltrepDataptr<crate::RLogical> for Arc<[bool]> where
    {
    fn dataptr(&mut self, _writable: bool)
        -> ::core::option::Option<*mut crate::RLogical> {
        ::core::option::Option::None
    }
}
impl crate::altrep_traits::AltVec for Arc<[bool]> 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 {
                        <Arc<[bool]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[bool]> as
                            crate::altrep_data::AltrepDataptr<crate::RLogical>>::dataptr(d,
                        true).map(|p| p.cast::<::core::ffi::c_void>())
            } else {
                let ro =
                    {
                        let d =
                            unsafe {
                                <Arc<[bool]> as
                                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
                            };
                        <Arc<[bool]> as
                                crate::altrep_data::AltrepDataptr<crate::RLogical>>::dataptr_or_null(d)
                    };
                if let ::core::option::Option::Some(p) = ro {
                    return p.cast_mut().cast::<::core::ffi::c_void>();
                }
                let d =
                    unsafe {
                        <Arc<[bool]> as
                                crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
                    };
                <Arc<[bool]> as
                            crate::altrep_data::AltrepDataptr<crate::RLogical>>::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::RLogical>(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 {
                <Arc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[bool]> as
                        crate::altrep_data::AltrepDataptr<crate::RLogical>>::dataptr_or_null(d).map(|p|
                    p.cast::<::core::ffi::c_void>()).unwrap_or(::core::ptr::null())
    }
}crate::__impl_altvec_logical_dataptr!(Arc<[bool]>);
210impl crate::altrep_traits::AltLogical for Arc<[bool]> 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 {
                <Arc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let i = i.max(0) as usize;
        if let ::core::option::Option::Some(values) =
                <Arc<[bool]> as
                        crate::altrep_data::AltLogicalData>::as_r_slice(data) {
            return values[i];
        }
        <Arc<[bool]> 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 {
                <Arc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        let len = len as usize;
        <Arc<[bool]> 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 {
                <Arc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[bool]> 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 {
                <Arc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[bool]> 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 {
                <Arc<[bool]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        match <Arc<[bool]> 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(),
        }
    }
}crate::__impl_altlogical_methods!(Arc<[bool]>);
211impl crate::altrep_data::InferBase for Arc<[bool]> 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::<Arc<[bool]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Arc<[bool]>>(cls) };
        unsafe { crate::altrep_bridge::install_lgl::<Arc<[bool]>>(cls) };
    }
}crate::impl_inferbase_logical!(Arc<[bool]>);
212impl crate::altrep_traits::AltVec for Arc<[String]> where  {
    const HAS_DATAPTR: bool = true;
    fn dataptr(x: crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
        unsafe {
            crate::altrep_impl::altstring_dataptr::<Arc<[String]>>(x,
                writable)
        }
    }
    const HAS_DATAPTR_OR_NULL: bool = true;
    fn dataptr_or_null(x: crate::SEXP) -> *const ::core::ffi::c_void {
        let _ = x;
        ::core::ptr::null()
    }
}crate::__impl_altvec_string_dataptr!(Arc<[String]>);
213impl crate::altrep_traits::AltString for Arc<[String]> where  {
    fn elt(x: crate::SEXP, i: crate::R_xlen_t) -> crate::SEXP {
        unsafe { crate::altrep_impl::altstring_elt::<Arc<[String]>>(x, i) }
    }
    const HAS_SET_ELT: bool = true;
    fn set_elt(x: crate::SEXP, i: crate::R_xlen_t, v: crate::SEXP) {
        unsafe {
            crate::altrep_impl::altstring_set_elt::<Arc<[String]>>(x, i, v)
        }
    }
    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 {
                <Arc<[String]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[String]> as
                        crate::altrep_data::AltStringData>::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 {
                <Arc<[String]> as
                        crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
            };
        <Arc<[String]> as
                        crate::altrep_data::AltStringData>::no_na(data).map(|b|
                    if b { 1 } else { 0 }).unwrap_or(0)
    }
}crate::__impl_altstring_methods!(Arc<[String]>);
214impl crate::altrep_data::InferBase for Arc<[String]> where  {
    const BASE: crate::altrep::RBase = crate::altrep::RBase::String;
    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_altstring_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::String)
    }
    unsafe fn install_methods(cls: crate::sys::altrep::R_altrep_class_t) {
        unsafe { crate::altrep_bridge::install_base::<Arc<[String]>>(cls) };
        unsafe { crate::altrep_bridge::install_vec::<Arc<[String]>>(cls) };
        unsafe { crate::altrep_bridge::install_str::<Arc<[String]>>(cls) };
    }
}crate::impl_inferbase_string!(Arc<[String]>);
215impl Altrep for Arc<[i32]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Arc::strong_count(data) == 1 && Arc::weak_count(data) == 0 {
                Arc::<[i32]>::from(data.as_ref())
            } else { Arc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<i32>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Arc::<[i32]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Arc<[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] = "Arc_i32\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Arc<[i32]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Arc<[i32]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Arc_i32() {
    <Arc<[i32]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_ARC_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_SHARED_ARC_I32 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Arc_i32,
            symbol: "__mx_altrep_reg_builtin_Arc_i32",
        }
    };impl_shared_slice!(
216    Arc,
217    i32,
218    "Arc_i32",
219    __mx_altrep_reg_builtin_Arc_i32,
220    __MX_ALTREP_REG_SHARED_ARC_I32
221);
222impl Altrep for Arc<[f64]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Arc::strong_count(data) == 1 && Arc::weak_count(data) == 0 {
                Arc::<[f64]>::from(data.as_ref())
            } else { Arc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<f64>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Arc::<[f64]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Arc<[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] = "Arc_f64\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Arc<[f64]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Arc<[f64]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Arc_f64() {
    <Arc<[f64]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_ARC_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_SHARED_ARC_F64 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Arc_f64,
            symbol: "__mx_altrep_reg_builtin_Arc_f64",
        }
    };impl_shared_slice!(
223    Arc,
224    f64,
225    "Arc_f64",
226    __mx_altrep_reg_builtin_Arc_f64,
227    __MX_ALTREP_REG_SHARED_ARC_F64
228);
229impl Altrep for Arc<[u8]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Arc::strong_count(data) == 1 && Arc::weak_count(data) == 0 {
                Arc::<[u8]>::from(data.as_ref())
            } else { Arc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<u8>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Arc::<[u8]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Arc<[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] = "Arc_u8\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Arc<[u8]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Arc<[u8]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Arc_u8() {
    <Arc<[u8]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_ARC_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_SHARED_ARC_U8 };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Arc_u8,
            symbol: "__mx_altrep_reg_builtin_Arc_u8",
        }
    };impl_shared_slice!(
230    Arc,
231    u8,
232    "Arc_u8",
233    __mx_altrep_reg_builtin_Arc_u8,
234    __MX_ALTREP_REG_SHARED_ARC_U8
235);
236impl Altrep for Arc<[crate::Rcomplex]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Arc::strong_count(data) == 1 && Arc::weak_count(data) == 0 {
                Arc::<[crate::Rcomplex]>::from(data.as_ref())
            } else { Arc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<crate::Rcomplex>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Arc::<[crate::Rcomplex]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Arc<[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] = "Arc_Rcomplex\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Arc<[crate::Rcomplex]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Arc<[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_Arc_Rcomplex() {
    <Arc<[crate::Rcomplex]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_ARC_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_SHARED_ARC_RCOMPLEX };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Arc_Rcomplex,
            symbol: "__mx_altrep_reg_builtin_Arc_Rcomplex",
        }
    };impl_shared_slice!(
237    Arc,
238    crate::Rcomplex,
239    "Arc_Rcomplex",
240    __mx_altrep_reg_builtin_Arc_Rcomplex,
241    __MX_ALTREP_REG_SHARED_ARC_RCOMPLEX
242);
243impl Altrep for Arc<[crate::RLogical]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Arc::strong_count(data) == 1 && Arc::weak_count(data) == 0 {
                Arc::<[crate::RLogical]>::from(data.as_ref())
            } else { Arc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<crate::RLogical>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Arc::<[crate::RLogical]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Arc<[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] = "Arc_RLogical\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Arc<[crate::RLogical]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Arc<[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_Arc_RLogical() {
    <Arc<[crate::RLogical]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_ARC_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_SHARED_ARC_RLOGICAL };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Arc_RLogical,
            symbol: "__mx_altrep_reg_builtin_Arc_RLogical",
        }
    };impl_shared_slice!(
244    Arc,
245    crate::RLogical,
246    "Arc_RLogical",
247    __mx_altrep_reg_builtin_Arc_RLogical,
248    __MX_ALTREP_REG_SHARED_ARC_RLOGICAL
249);
250impl Altrep for Arc<[bool]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Arc::strong_count(data) == 1 && Arc::weak_count(data) == 0 {
                Arc::<[bool]>::from(data.as_ref())
            } else { Arc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<bool>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Arc::<[bool]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Arc<[bool]> {
    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] = "Arc_bool\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Arc<[bool]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Arc<[bool]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Arc_bool() {
    <Arc<[bool]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_ARC_BOOL: 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_SHARED_ARC_BOOL };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Arc_bool,
            symbol: "__mx_altrep_reg_builtin_Arc_bool",
        }
    };impl_shared_slice!(
251    Arc,
252    bool,
253    "Arc_bool",
254    __mx_altrep_reg_builtin_Arc_bool,
255    __MX_ALTREP_REG_SHARED_ARC_BOOL
256);
257impl Altrep for Arc<[String]> {
    fn length(x: SEXP) -> crate::R_xlen_t {
        if let Some(cache) = unsafe { materialized_altrep_data2(x) } {
            return cache.len().try_into().expect("ALTREP length exceeds R_xlen_t");
        }
        unsafe {
                        Self::altrep_extract_ref(x)
                    }.len().try_into().expect("ALTREP length exceeds R_xlen_t")
    }
    const HAS_DUPLICATE: bool = true;
    fn duplicate(x: SEXP, _deep: bool) -> SEXP {
        let data = unsafe { Self::altrep_extract_ref(x) };
        let owner =
            if Arc::strong_count(data) == 1 && Arc::weak_count(data) == 0 {
                Arc::<[String]>::from(data.as_ref())
            } else { Arc::clone(data) };
        let out =
            unsafe { OwnedProtect::new(crate::Altrep(owner).into_sexp()) };
        if let Some(data2) = unsafe { materialized_altrep_data2(x) } {
            unsafe {
                let copy = super::duplicate_altrep_data2(data2);
                AltrepSexpExt::set_altrep_data2(&out.get(), copy);
            }
        }
        out.get()
    }
    const HAS_SERIALIZED_STATE: bool = true;
    fn serialized_state(x: SEXP) -> SEXP {
        if unsafe { altrep_values_written(x) } { return SEXP::null(); }
        unsafe { Self::altrep_extract_ref(x) }.to_vec().into_sexp()
    }
    const HAS_UNSERIALIZE: bool = true;
    fn unserialize(class: SEXP, state: SEXP) -> SEXP {
        let values =
            Vec::<String>::try_from_sexp(state).expect("invalid shared-slice ALTREP serialized state");
        let owner = Arc::<[String]>::from(values);
        unsafe {
            let ptr = crate::ExternalPtr::new_unchecked(owner);
            let data1 = OwnedProtect::new(ptr.as_sexp());
            crate::sys::altrep::R_altrep_class_t::from_sexp(class).new_altrep_unchecked(data1.get(),
                SEXP::nil())
        }
    }
}
impl RegisterAltrep for Arc<[String]> {
    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] = "Arc_String\u{0}".as_bytes();
                        let cls =
                            unsafe {
                                <Arc<[String]> as
                                        crate::altrep_data::InferBase>::make_class(CLASS_NAME.as_ptr().cast::<std::ffi::c_char>(),
                                    crate::AltrepPkgName::as_ptr())
                            };
                        unsafe {
                            <Arc<[String]> as
                                    crate::altrep_data::InferBase>::install_methods(cls);
                        }
                        cls
                    })
    }
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub extern "C-unwind" fn __mx_altrep_reg_builtin_Arc_String() {
    <Arc<[String]> as RegisterAltrep>::get_or_init_class();
}
#[used]
#[unsafe(link_section = "linkme_MX_ALTREP_REGISTRATIONS")]
static __MX_ALTREP_REG_SHARED_ARC_STRING: 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_SHARED_ARC_STRING };
            unsafe {
                crate::linkme::DistributedSlice::private_typecheck(crate::registry::MX_ALTREP_REGISTRATIONS,
                    __new());
            }
        }
        crate::registry::AltrepRegistration {
            register: __mx_altrep_reg_builtin_Arc_String,
            symbol: "__mx_altrep_reg_builtin_Arc_String",
        }
    };impl_shared_slice!(
258    Arc,
259    String,
260    "Arc_String",
261    __mx_altrep_reg_builtin_Arc_String,
262    __MX_ALTREP_REG_SHARED_ARC_STRING
263);