1use 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 $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 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);