1#[macro_export]
56macro_rules! impl_altinteger_from_data {
57 ($ty:ty $(, $knob:ident)*) => {
61 $crate::impl_altinteger_from_data_generic!({} $ty {} $(, $knob)*);
62 };
63}
64
65#[macro_export]
72macro_rules! impl_altinteger_from_data_generic {
73 ({$($gen:tt)*} $ty:ty {$($whr:tt)*} $(, $knob:ident)*) => {
74 $crate::__impl_alt_family!(
75 {$($gen)*} $ty {$($whr)*},
76 __impl_altinteger_methods,
77 impl_inferbase_integer,
78 dataptr: dataptr(i32),
79 default: materializing(i32)
80 $(, $knob)*
81 );
82 };
83}
84
85#[macro_export]
107#[doc(hidden)]
108macro_rules! __impl_altrep_base {
109 ($ty:ty) => {
110 $crate::__impl_altrep_base!($ty, RUnwind);
111 };
112 ($ty:ty, with_serialize) => {
113 $crate::__impl_altrep_base!($ty, RUnwind, with_serialize);
114 };
115 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $guard:ident $(, extra = {$($extra:item)*})?) => {
124 impl<$($gen)*> $crate::altrep_traits::Altrep for $ty where $($whr)* {
125 const GUARD: $crate::altrep_traits::AltrepGuard =
126 $crate::altrep_traits::AltrepGuard::$guard;
127
128 $($($extra)*)?
129
130 fn length(x: $crate::SEXP) -> $crate::R_xlen_t {
131 if let ::core::option::Option::Some(data2) = unsafe { $crate::altrep_data::materialized_altrep_data2(x) } {
132 return $crate::SexpExt::len(&data2) as $crate::R_xlen_t;
133 }
134 let data =
135 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
136 <$ty as $crate::altrep_data::AltrepLen>::altrep_len(data) as $crate::R_xlen_t
137 }
138 }
139 };
140 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $guard:ident, with_serialize $(, extra = {$($extra:item)*})?) => {
141 impl<$($gen)*> $crate::altrep_traits::Altrep for $ty where $($whr)* {
142 const GUARD: $crate::altrep_traits::AltrepGuard =
143 $crate::altrep_traits::AltrepGuard::$guard;
144
145 $($($extra)*)?
146
147 fn length(x: $crate::SEXP) -> $crate::R_xlen_t {
148 if let ::core::option::Option::Some(data2) = unsafe { $crate::altrep_data::materialized_altrep_data2(x) } {
149 return $crate::SexpExt::len(&data2) as $crate::R_xlen_t;
150 }
151 let data =
152 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
153 <$ty as $crate::altrep_data::AltrepLen>::altrep_len(data) as $crate::R_xlen_t
154 }
155
156 const HAS_SERIALIZED_STATE: bool = true;
157
158 fn serialized_state(x: $crate::SEXP) -> $crate::SEXP {
159 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
162 return $crate::SEXP::null();
163 }
164 let data =
165 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
166 <$ty as $crate::altrep_data::AltrepSerialize>::serialized_state(data)
167 }
168
169 const HAS_UNSERIALIZE: bool = true;
170
171 fn unserialize(class: $crate::SEXP, state: $crate::SEXP) -> $crate::SEXP {
172 let ::core::option::Option::Some(data) = <$ty as $crate::altrep_data::AltrepSerialize>::unserialize(state)
173 else {
174 ::core::panic!(
175 "ALTREP unserialize failed for {}",
176 ::core::any::type_name::<$ty>()
177 );
178 };
179
180 unsafe {
182 use $crate::SEXP;
183 use $crate::externalptr::ExternalPtr;
184 use $crate::sys::altrep::R_altrep_class_t;
185 use $crate::sys::{Rf_protect_unchecked, Rf_unprotect_unchecked};
186
187 let ext_ptr = ExternalPtr::new_unchecked(data);
188 let data1 = ext_ptr.as_sexp();
189 Rf_protect_unchecked(data1);
191 let cls = R_altrep_class_t::from_sexp(class);
192 let out = cls.new_altrep_unchecked(data1, SEXP::nil());
193 Rf_unprotect_unchecked(1);
194 out
195 }
196 }
197 }
198 };
199 ($ty:ty, $guard:ident $(, extra = {$($extra:item)*})?) => {
206 $crate::__impl_altrep_base!({} $ty {}, $guard $(, extra = {$($extra)*})?);
207 };
208 ($ty:ty, $guard:ident, with_serialize $(, extra = {$($extra:item)*})?) => {
209 $crate::__impl_altrep_base!({} $ty {}, $guard, with_serialize $(, extra = {$($extra)*})?);
210 };
211}
212
213#[macro_export]
221#[doc(hidden)]
222macro_rules! __impl_altvec_dataptr {
223 ($ty:ty, $elem:ty) => {
224 $crate::__impl_altvec_dataptr!({} $ty {}, $elem);
225 };
226 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $elem:ty) => {
229 impl<$($gen)*> $crate::altrep_traits::AltVec for $ty where $($whr)* {
230 const HAS_DATAPTR: bool = true;
231
232 fn dataptr(x: $crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
233 unsafe {
235 if let ::core::option::Option::Some(data2) = $crate::altrep_data::materialized_altrep_data2(x) {
236 return $crate::sys::DATAPTR_RO(data2).cast_mut();
237 }
238 }
239
240 let direct = if writable {
242 let d = unsafe {
243 <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
244 };
245 <$ty as $crate::altrep_data::AltrepDataptr<$elem>>::dataptr(d, true)
246 .map(|p| p.cast::<::core::ffi::c_void>())
247 } else {
248 let ro = {
253 let d = unsafe {
254 <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x)
255 };
256 <$ty as $crate::altrep_data::AltrepDataptr<$elem>>::dataptr_or_null(d)
257 };
258 if let ::core::option::Option::Some(p) = ro {
259 return p.cast_mut().cast::<::core::ffi::c_void>();
260 }
261 let d = unsafe {
263 <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_mut(x)
264 };
265 <$ty as $crate::altrep_data::AltrepDataptr<$elem>>::dataptr(d, false)
266 .map(|p| p.cast::<::core::ffi::c_void>())
267 };
268
269 if let ::core::option::Option::Some(p) = direct {
270 return p;
271 }
272
273 unsafe { $crate::altrep_data::materialize_altrep_data2::<$elem>(x) }
277 }
278
279 const HAS_DATAPTR_OR_NULL: bool = true;
280
281 fn dataptr_or_null(x: $crate::SEXP) -> *const ::core::ffi::c_void {
282 unsafe {
284 if let ::core::option::Option::Some(data2) = $crate::altrep_data::materialized_altrep_data2(x) {
285 return $crate::sys::DATAPTR_RO(data2);
286 }
287 }
288 let d =
289 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
290 <$ty as $crate::altrep_data::AltrepDataptr<$elem>>::dataptr_or_null(d)
291 .map(|p| p.cast::<::core::ffi::c_void>())
292 .unwrap_or(::core::ptr::null())
293 }
294 }
295 };
296}
297
298#[macro_export]
305#[doc(hidden)]
306macro_rules! __impl_altvec_string_dataptr {
307 ($ty:ty) => {
308 $crate::__impl_altvec_string_dataptr!({} $ty {});
309 };
310 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
312 impl<$($gen)*> $crate::altrep_traits::AltVec for $ty where $($whr)* {
313 const HAS_DATAPTR: bool = true;
314
315 fn dataptr(x: $crate::SEXP, writable: bool) -> *mut ::core::ffi::c_void {
316 unsafe { $crate::altrep_impl::altstring_dataptr::<$ty>(x, writable) }
317 }
318
319 const HAS_DATAPTR_OR_NULL: bool = true;
320
321 fn dataptr_or_null(x: $crate::SEXP) -> *const ::core::ffi::c_void {
322 let _ = x;
326 ::core::ptr::null()
327 }
328 }
329 };
330}
331
332#[macro_export]
341#[doc(hidden)]
342macro_rules! __impl_altvec_materializing_dataptr {
343 ($ty:ty, $elem:ty) => {
344 $crate::__impl_altvec_materializing_dataptr!({} $ty {}, $elem);
345 };
346 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $elem:ty) => {
348 impl<$($gen)*> $crate::altrep_data::AltrepDataptr<$elem> for $ty where $($whr)* {
349 fn dataptr(&mut self, _writable: bool) -> ::core::option::Option<*mut $elem> {
350 ::core::option::Option::None
351 }
352 }
353 $crate::__impl_altvec_dataptr!({$($gen)*} $ty {$($whr)*}, $elem);
354 };
355}
356
357#[macro_export]
361#[doc(hidden)]
362macro_rules! __impl_altvec_logical_dataptr {
363 ($ty:ty) => {
364 $crate::__impl_altvec_materializing_dataptr!($ty, $crate::RLogical);
365 };
366}
367
368#[macro_export]
370#[doc(hidden)]
371macro_rules! __impl_altvec_integer_dataptr {
372 ($ty:ty) => {
373 $crate::__impl_altvec_materializing_dataptr!($ty, i32);
374 };
375}
376
377#[macro_export]
379#[doc(hidden)]
380macro_rules! __impl_altvec_real_dataptr {
381 ($ty:ty) => {
382 $crate::__impl_altvec_materializing_dataptr!($ty, f64);
383 };
384}
385
386#[macro_export]
388#[doc(hidden)]
389macro_rules! __impl_altvec_raw_dataptr {
390 ($ty:ty) => {
391 $crate::__impl_altvec_materializing_dataptr!($ty, u8);
392 };
393}
394
395#[macro_export]
397#[doc(hidden)]
398macro_rules! __impl_altvec_complex_dataptr {
399 ($ty:ty) => {
400 $crate::__impl_altvec_materializing_dataptr!($ty, $crate::Rcomplex);
401 };
402}
403
404#[macro_export]
406#[doc(hidden)]
407macro_rules! __impl_altvec_extract_subset {
408 ($ty:ty) => {
409 $crate::__impl_altvec_extract_subset!({} $ty {});
410 };
411 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
413 impl<$($gen)*> $crate::altrep_traits::AltVec for $ty where $($whr)* {
414 const HAS_EXTRACT_SUBSET: bool = true;
415
416 fn extract_subset(
417 x: $crate::SEXP,
418 indx: $crate::SEXP,
419 _call: $crate::SEXP,
420 ) -> $crate::SEXP {
421 if $crate::SexpExt::type_of(&indx) != $crate::SEXPTYPE::INTSXP {
425 return $crate::SEXP::null();
426 }
427
428 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
431 return $crate::SEXP::null();
432 }
433
434 let indices = unsafe { $crate::SexpExt::as_slice::<i32>(&indx) };
436
437 let data =
438 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
439 <$ty as $crate::altrep_data::AltrepExtractSubset>::extract_subset(data, indices)
440 .unwrap_or($crate::SEXP::null())
441 }
442 }
443 };
444}
445#[macro_export]
458#[doc(hidden)]
459macro_rules! __impl_alt_elt {
460 ($ty:ty, $trait:path, $elem:ty) => {
461 const HAS_ELT: bool = true;
462
463 fn elt(x: $crate::SEXP, i: $crate::R_xlen_t) -> $elem {
464 if let ::core::option::Option::Some(data2) =
465 unsafe { $crate::altrep_data::materialized_altrep_data2(x) }
466 {
467 return <$elem as $crate::RNativeType>::elt(data2, i.max(0));
468 }
469 let data =
470 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
471 <$ty as $trait>::elt(data, i.max(0) as usize)
472 }
473 };
474}
475
476#[macro_export]
481#[doc(hidden)]
482macro_rules! __impl_alt_get_region {
483 ($ty:ty, $trait:path, $buf_ty:ty) => {
484 const HAS_GET_REGION: bool = true;
485
486 fn get_region(
487 x: $crate::SEXP,
488 start: $crate::R_xlen_t,
489 len: $crate::R_xlen_t,
490 buf: &mut [$buf_ty],
491 ) -> $crate::R_xlen_t {
492 if start < 0 || len <= 0 {
493 return 0;
494 }
495 if let ::core::option::Option::Some(data2) =
496 unsafe { $crate::altrep_data::materialized_altrep_data2(x) }
497 {
498 return unsafe {
499 $crate::altrep_data::materialized_altrep_region::<$buf_ty>(
500 data2,
501 start as usize,
502 len as usize,
503 buf,
504 )
505 } as $crate::R_xlen_t;
506 }
507 let data =
508 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
509 let len = len as usize;
510 <$ty as $trait>::get_region(data, start as usize, len, buf) as $crate::R_xlen_t
511 }
512 };
513}
514
515#[macro_export]
520#[doc(hidden)]
521macro_rules! __impl_alt_is_sorted {
522 ($ty:ty, $trait:path) => {
523 const HAS_IS_SORTED: bool = true;
524
525 fn is_sorted(x: $crate::SEXP) -> i32 {
526 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
527 return $crate::altrep_traits::UNKNOWN_SORTEDNESS;
528 }
529 let data =
530 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
531 <$ty as $trait>::is_sorted(data)
532 .map(|s| s.to_r_int())
533 .unwrap_or(i32::MIN)
534 }
535 };
536}
537
538#[macro_export]
543#[doc(hidden)]
544macro_rules! __impl_alt_no_na {
545 ($ty:ty, $trait:path) => {
546 const HAS_NO_NA: bool = true;
547
548 fn no_na(x: $crate::SEXP) -> i32 {
549 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
550 return 0;
551 }
552 let data =
553 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
554 <$ty as $trait>::no_na(data)
555 .map(|b| if b { 1 } else { 0 })
556 .unwrap_or(0)
557 }
558 };
559}
560#[macro_export]
588#[doc(hidden)]
589macro_rules! __impl_altvec_flavor {
590 ($ty:ty, dataptr($elem:ty)) => {
591 $crate::__impl_altvec_dataptr!($ty, $elem);
592 };
593 ($ty:ty, materializing($elem:ty)) => {
594 $crate::__impl_altvec_materializing_dataptr!($ty, $elem);
595 };
596 ($ty:ty, string_dataptr) => {
597 $crate::__impl_altvec_string_dataptr!($ty);
598 };
599 ($ty:ty, subset) => {
600 $crate::__impl_altvec_extract_subset!($ty);
601 };
602 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, dataptr($elem:ty)) => {
604 $crate::__impl_altvec_dataptr!({$($gen)*} $ty {$($whr)*}, $elem);
605 };
606 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, materializing($elem:ty)) => {
607 $crate::__impl_altvec_materializing_dataptr!({$($gen)*} $ty {$($whr)*}, $elem);
608 };
609 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, string_dataptr) => {
610 $crate::__impl_altvec_string_dataptr!({$($gen)*} $ty {$($whr)*});
611 };
612 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, subset) => {
613 $crate::__impl_altvec_extract_subset!({$($gen)*} $ty {$($whr)*});
614 };
615}
616
617#[macro_export]
623#[doc(hidden)]
624macro_rules! __impl_alt_from_data {
625 ($ty:ty, $methods:ident, $inferbase:ident, $flavor:ident $(($elem:ty))?) => {
626 $crate::__impl_altrep_base!($ty);
627 $crate::__impl_altvec_flavor!($ty, $flavor $(($elem))?);
628 $crate::$methods!($ty);
629 $crate::$inferbase!($ty);
630 };
631 ($ty:ty, $methods:ident, $inferbase:ident, $flavor:ident $(($elem:ty))?, serialize) => {
632 $crate::__impl_altrep_base!($ty, with_serialize);
633 $crate::__impl_altvec_flavor!($ty, $flavor $(($elem))?);
634 $crate::$methods!($ty);
635 $crate::$inferbase!($ty);
636 };
637 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident, $flavor:ident $(($elem:ty))?) => {
639 $crate::__impl_altrep_base!({$($gen)*} $ty {$($whr)*}, RUnwind);
640 $crate::__impl_altvec_flavor!({$($gen)*} $ty {$($whr)*}, $flavor $(($elem))?);
641 $crate::$methods!({$($gen)*} $ty {$($whr)*});
642 $crate::$inferbase!({$($gen)*} $ty {$($whr)*});
643 };
644 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident, $flavor:ident $(($elem:ty))?, serialize) => {
645 $crate::__impl_altrep_base!({$($gen)*} $ty {$($whr)*}, RUnwind, with_serialize);
646 $crate::__impl_altvec_flavor!({$($gen)*} $ty {$($whr)*}, $flavor $(($elem))?);
647 $crate::$methods!({$($gen)*} $ty {$($whr)*});
648 $crate::$inferbase!({$($gen)*} $ty {$($whr)*});
649 };
650}
651
652#[macro_export]
672#[doc(hidden)]
673macro_rules! __impl_alt_family {
674 ($ty:ty, $methods:ident, $inferbase:ident,
675 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?) => {
676 $crate::__impl_alt_from_data!($ty, $methods, $inferbase, $dff $(($dfe))?);
677 };
678 ($ty:ty, $methods:ident, $inferbase:ident,
679 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, dataptr) => {
680 $crate::__impl_alt_from_data!($ty, $methods, $inferbase, $dpf $(($dpe))?);
681 };
682 ($ty:ty, $methods:ident, $inferbase:ident,
683 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, serialize) => {
684 $crate::__impl_alt_from_data!($ty, $methods, $inferbase, $dff $(($dfe))?, serialize);
685 };
686 ($ty:ty, $methods:ident, $inferbase:ident,
687 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, subset) => {
688 $crate::__impl_alt_from_data!($ty, $methods, $inferbase, subset);
689 };
690 ($ty:ty, $methods:ident, $inferbase:ident,
691 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, dataptr, serialize) => {
692 $crate::__impl_alt_from_data!($ty, $methods, $inferbase, $dpf $(($dpe))?, serialize);
693 };
694 ($ty:ty, $methods:ident, $inferbase:ident,
695 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, subset, serialize) => {
696 $crate::__impl_alt_from_data!($ty, $methods, $inferbase, subset, serialize);
697 };
698 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident,
700 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?) => {
701 $crate::__impl_alt_from_data!({$($gen)*} $ty {$($whr)*}, $methods, $inferbase, $dff $(($dfe))?);
702 };
703 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident,
704 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, dataptr) => {
705 $crate::__impl_alt_from_data!({$($gen)*} $ty {$($whr)*}, $methods, $inferbase, $dpf $(($dpe))?);
706 };
707 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident,
708 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, serialize) => {
709 $crate::__impl_alt_from_data!({$($gen)*} $ty {$($whr)*}, $methods, $inferbase, $dff $(($dfe))?, serialize);
710 };
711 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident,
712 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, subset) => {
713 $crate::__impl_alt_from_data!({$($gen)*} $ty {$($whr)*}, $methods, $inferbase, subset);
714 };
715 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident,
716 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, dataptr, serialize) => {
717 $crate::__impl_alt_from_data!({$($gen)*} $ty {$($whr)*}, $methods, $inferbase, $dpf $(($dpe))?, serialize);
718 };
719 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $methods:ident, $inferbase:ident,
720 dataptr: $dpf:ident $(($dpe:ty))?, default: $dff:ident $(($dfe:ty))?, subset, serialize) => {
721 $crate::__impl_alt_from_data!({$($gen)*} $ty {$($whr)*}, $methods, $inferbase, subset, serialize);
722 };
723}
724#[macro_export]
730#[doc(hidden)]
731macro_rules! __impl_altinteger_methods {
732 ($ty:ty) => {
733 $crate::__impl_altinteger_methods!({} $ty {});
734 };
735 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
737 impl<$($gen)*> $crate::altrep_traits::AltInteger for $ty where $($whr)* {
738 $crate::__impl_alt_elt!($ty, $crate::altrep_data::AltIntegerData, i32);
739 $crate::__impl_alt_get_region!($ty, $crate::altrep_data::AltIntegerData, i32);
740 $crate::__impl_alt_is_sorted!($ty, $crate::altrep_data::AltIntegerData);
741 $crate::__impl_alt_no_na!($ty, $crate::altrep_data::AltIntegerData);
742
743 const HAS_SUM: bool = true;
744
745 fn sum(x: $crate::SEXP, narm: bool) -> $crate::SEXP {
747 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
748 return $crate::SEXP::null();
749 }
750 let data =
751 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
752 match <$ty as $crate::altrep_data::AltIntegerData>::sum(data, narm) {
753 ::core::option::Option::Some(s) => {
754 if s >= i32::MIN as i64 && s <= i32::MAX as i64 {
755 $crate::SEXP::scalar_integer(s as i32)
756 } else {
757 $crate::SEXP::scalar_real(s as f64)
758 }
759 }
760 ::core::option::Option::None => $crate::SEXP::null(),
761 }
762 }
763
764 const HAS_MIN: bool = true;
765
766 fn min(x: $crate::SEXP, narm: bool) -> $crate::SEXP {
767 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
768 return $crate::SEXP::null();
769 }
770 let data =
771 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
772 <$ty as $crate::altrep_data::AltIntegerData>::min(data, narm)
773 .map(|m| $crate::SEXP::scalar_integer(m))
774 .unwrap_or($crate::SEXP::null())
775 }
776
777 const HAS_MAX: bool = true;
778
779 fn max(x: $crate::SEXP, narm: bool) -> $crate::SEXP {
780 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
781 return $crate::SEXP::null();
782 }
783 let data =
784 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
785 <$ty as $crate::altrep_data::AltIntegerData>::max(data, narm)
786 .map(|m| $crate::SEXP::scalar_integer(m))
787 .unwrap_or($crate::SEXP::null())
788 }
789 }
790 };
791}
792
793#[macro_export]
815macro_rules! impl_altreal_from_data {
816 ($ty:ty $(, $knob:ident)*) => {
817 $crate::impl_altreal_from_data_generic!({} $ty {} $(, $knob)*);
818 };
819}
820
821#[macro_export]
824macro_rules! impl_altreal_from_data_generic {
825 ({$($gen:tt)*} $ty:ty {$($whr:tt)*} $(, $knob:ident)*) => {
826 $crate::__impl_alt_family!(
827 {$($gen)*} $ty {$($whr)*},
828 __impl_altreal_methods,
829 impl_inferbase_real,
830 dataptr: dataptr(f64),
831 default: materializing(f64)
832 $(, $knob)*
833 );
834 };
835}
836
837#[macro_export]
839#[doc(hidden)]
840macro_rules! __impl_altreal_methods {
841 ($ty:ty) => {
842 $crate::__impl_altreal_methods!({} $ty {});
843 };
844 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
846 impl<$($gen)*> $crate::altrep_traits::AltReal for $ty where $($whr)* {
847 $crate::__impl_alt_elt!($ty, $crate::altrep_data::AltRealData, f64);
848 $crate::__impl_alt_get_region!($ty, $crate::altrep_data::AltRealData, f64);
849 $crate::__impl_alt_is_sorted!($ty, $crate::altrep_data::AltRealData);
850 $crate::__impl_alt_no_na!($ty, $crate::altrep_data::AltRealData);
851
852 const HAS_SUM: bool = true;
853
854 fn sum(x: $crate::SEXP, narm: bool) -> $crate::SEXP {
856 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
857 return $crate::SEXP::null();
858 }
859 let data =
860 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
861 <$ty as $crate::altrep_data::AltRealData>::sum(data, narm)
862 .map(|s| $crate::SEXP::scalar_real(s))
863 .unwrap_or($crate::SEXP::null())
864 }
865
866 const HAS_MIN: bool = true;
867
868 fn min(x: $crate::SEXP, narm: bool) -> $crate::SEXP {
869 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
870 return $crate::SEXP::null();
871 }
872 let data =
873 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
874 <$ty as $crate::altrep_data::AltRealData>::min(data, narm)
875 .map(|m| $crate::SEXP::scalar_real(m))
876 .unwrap_or($crate::SEXP::null())
877 }
878
879 const HAS_MAX: bool = true;
880
881 fn max(x: $crate::SEXP, narm: bool) -> $crate::SEXP {
882 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
883 return $crate::SEXP::null();
884 }
885 let data =
886 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
887 <$ty as $crate::altrep_data::AltRealData>::max(data, narm)
888 .map(|m| $crate::SEXP::scalar_real(m))
889 .unwrap_or($crate::SEXP::null())
890 }
891 }
892 };
893}
894
895#[macro_export]
917macro_rules! impl_altlogical_from_data {
918 ($ty:ty $(, $knob:ident)*) => {
921 $crate::impl_altlogical_from_data_generic!({} $ty {} $(, $knob)*);
922 };
923}
924
925#[macro_export]
928macro_rules! impl_altlogical_from_data_generic {
929 ({$($gen:tt)*} $ty:ty {$($whr:tt)*} $(, $knob:ident)*) => {
930 $crate::__impl_alt_family!(
931 {$($gen)*} $ty {$($whr)*},
932 __impl_altlogical_methods,
933 impl_inferbase_logical,
934 dataptr: dataptr(i32),
935 default: materializing($crate::RLogical)
936 $(, $knob)*
937 );
938 };
939}
940
941#[macro_export]
943#[doc(hidden)]
944macro_rules! __impl_altlogical_methods {
945 ($ty:ty) => {
946 $crate::__impl_altlogical_methods!({} $ty {});
947 };
948 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
950 impl<$($gen)*> $crate::altrep_traits::AltLogical for $ty where $($whr)* {
951 const HAS_ELT: bool = true;
953
954 fn elt(x: $crate::SEXP, i: $crate::R_xlen_t) -> i32 {
955 if let ::core::option::Option::Some(data2) = unsafe { $crate::altrep_data::materialized_altrep_data2(x) } {
956 return <$crate::RLogical as $crate::RNativeType>::elt(data2, i.max(0)).to_i32();
957 }
958 let data =
959 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
960 let i = i.max(0) as usize;
961 if let ::core::option::Option::Some(values) = <$ty as $crate::altrep_data::AltLogicalData>::as_r_slice(data) {
962 return values[i];
963 }
964 <$ty as $crate::altrep_data::AltLogicalData>::elt(data, i).to_r_int()
965 }
966
967 $crate::__impl_alt_get_region!($ty, $crate::altrep_data::AltLogicalData, i32);
968 $crate::__impl_alt_is_sorted!($ty, $crate::altrep_data::AltLogicalData);
969 $crate::__impl_alt_no_na!($ty, $crate::altrep_data::AltLogicalData);
970
971 const HAS_SUM: bool = true;
972
973 fn sum(x: $crate::SEXP, narm: bool) -> $crate::SEXP {
975 if unsafe { $crate::altrep_data::altrep_values_written(x) } {
976 return $crate::SEXP::null();
977 }
978 let data =
979 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
980 match <$ty as $crate::altrep_data::AltLogicalData>::sum(data, narm) {
981 ::core::option::Option::Some(s) => {
982 if s >= i32::MIN as i64 && s <= i32::MAX as i64 {
983 $crate::SEXP::scalar_integer(s as i32)
984 } else {
985 $crate::SEXP::scalar_real(s as f64)
986 }
987 }
988 ::core::option::Option::None => $crate::SEXP::null(),
989 }
990 }
991 }
992 };
993}
994
995#[macro_export]
1017macro_rules! impl_altraw_from_data {
1018 ($ty:ty $(, $knob:ident)*) => {
1019 $crate::impl_altraw_from_data_generic!({} $ty {} $(, $knob)*);
1020 };
1021}
1022
1023#[macro_export]
1026macro_rules! impl_altraw_from_data_generic {
1027 ({$($gen:tt)*} $ty:ty {$($whr:tt)*} $(, $knob:ident)*) => {
1028 $crate::__impl_alt_family!(
1029 {$($gen)*} $ty {$($whr)*},
1030 __impl_altraw_methods,
1031 impl_inferbase_raw,
1032 dataptr: dataptr(u8),
1033 default: materializing(u8)
1034 $(, $knob)*
1035 );
1036 };
1037}
1038
1039#[macro_export]
1041#[doc(hidden)]
1042macro_rules! __impl_altraw_methods {
1043 ($ty:ty) => {
1044 $crate::__impl_altraw_methods!({} $ty {});
1045 };
1046 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
1048 impl<$($gen)*> $crate::altrep_traits::AltRaw for $ty where $($whr)* {
1049 $crate::__impl_alt_elt!($ty, $crate::altrep_data::AltRawData, u8);
1050 $crate::__impl_alt_get_region!($ty, $crate::altrep_data::AltRawData, u8);
1051 }
1052 };
1053}
1054
1055#[macro_export]
1077macro_rules! impl_altstring_from_data {
1078 ($ty:ty $(, $knob:ident)*) => {
1081 $crate::impl_altstring_from_data_generic!({} $ty {} $(, $knob)*);
1082 };
1083}
1084
1085#[macro_export]
1088macro_rules! impl_altstring_from_data_generic {
1089 ({$($gen:tt)*} $ty:ty {$($whr:tt)*} $(, $knob:ident)*) => {
1090 $crate::__impl_alt_family!(
1091 {$($gen)*} $ty {$($whr)*},
1092 __impl_altstring_methods,
1093 impl_inferbase_string,
1094 dataptr: string_dataptr,
1095 default: string_dataptr
1096 $(, $knob)*
1097 );
1098 };
1099}
1100
1101#[macro_export]
1103#[doc(hidden)]
1104macro_rules! __impl_altstring_methods {
1105 ($ty:ty) => {
1106 $crate::__impl_altstring_methods!({} $ty {});
1107 };
1108 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
1110 impl<$($gen)*> $crate::altrep_traits::AltString for $ty where $($whr)* {
1111 fn elt(x: $crate::SEXP, i: $crate::R_xlen_t) -> $crate::SEXP {
1114 unsafe { $crate::altrep_impl::altstring_elt::<$ty>(x, i) }
1115 }
1116
1117 const HAS_SET_ELT: bool = true;
1118
1119 fn set_elt(x: $crate::SEXP, i: $crate::R_xlen_t, v: $crate::SEXP) {
1120 unsafe { $crate::altrep_impl::altstring_set_elt::<$ty>(x, i, v) }
1121 }
1122
1123 $crate::__impl_alt_is_sorted!($ty, $crate::altrep_data::AltStringData);
1124 $crate::__impl_alt_no_na!($ty, $crate::altrep_data::AltStringData);
1125 }
1126 };
1127}
1128
1129#[macro_export]
1131macro_rules! impl_altlist_from_data {
1132 ($ty:ty) => {
1133 $crate::impl_altlist_from_data!($ty, RUnwind);
1134 };
1135 ($ty:ty, $guard:ident) => {
1136 $crate::impl_altlist_from_data_generic!({} $ty {}, $guard);
1137 };
1138}
1139
1140#[macro_export]
1145macro_rules! impl_altlist_from_data_generic {
1146 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
1147 $crate::impl_altlist_from_data_generic!({$($gen)*} $ty {$($whr)*}, RUnwind);
1148 };
1149 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}, $guard:ident) => {
1150 impl<$($gen)*> $crate::altrep_traits::Altrep for $ty where $($whr)* {
1151 const GUARD: $crate::altrep_traits::AltrepGuard =
1152 $crate::altrep_traits::AltrepGuard::$guard;
1153
1154 fn length(x: $crate::SEXP) -> $crate::R_xlen_t {
1155 let data =
1156 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
1157 <$ty as $crate::altrep_data::AltrepLen>::altrep_len(data) as $crate::R_xlen_t
1158 }
1159 }
1160
1161 impl<$($gen)*> $crate::altrep_traits::AltVec for $ty where $($whr)* {}
1162
1163 impl<$($gen)*> $crate::altrep_traits::AltList for $ty where $($whr)* {
1164 fn elt(x: $crate::SEXP, i: $crate::R_xlen_t) -> $crate::SEXP {
1165 if let ::core::option::Option::Some(data2) = unsafe { $crate::altrep_data::materialized_altrep_data2(x) } {
1166 return $crate::SexpExt::vector_elt(&data2, i);
1167 }
1168 let data =
1169 unsafe { <$ty as $crate::altrep_data::AltrepExtract>::altrep_extract_ref(x) };
1170 <$ty as $crate::altrep_data::AltListData>::elt(data, i.max(0) as usize)
1171 }
1172
1173 const HAS_SET_ELT: bool = true;
1174
1175 fn set_elt(x: $crate::SEXP, i: $crate::R_xlen_t, v: $crate::SEXP) {
1176 unsafe { $crate::altrep_impl::altlist_set_elt::<$ty>(x, i, v) }
1177 }
1178 }
1179
1180 $crate::impl_inferbase_list!({$($gen)*} $ty {$($whr)*});
1181 };
1182}
1183
1184#[macro_export]
1186#[doc(hidden)]
1187macro_rules! __impl_altcomplex_methods {
1188 ($ty:ty) => {
1189 $crate::__impl_altcomplex_methods!({} $ty {});
1190 };
1191 ({$($gen:tt)*} $ty:ty {$($whr:tt)*}) => {
1193 impl<$($gen)*> $crate::altrep_traits::AltComplex for $ty where $($whr)* {
1194 $crate::__impl_alt_elt!($ty, $crate::altrep_data::AltComplexData, $crate::Rcomplex);
1195 $crate::__impl_alt_get_region!(
1196 $ty,
1197 $crate::altrep_data::AltComplexData,
1198 $crate::Rcomplex
1199 );
1200 }
1201 };
1202}
1203
1204#[macro_export]
1211macro_rules! impl_altcomplex_from_data {
1212 ($ty:ty $(, $knob:ident)*) => {
1213 $crate::impl_altcomplex_from_data_generic!({} $ty {} $(, $knob)*);
1214 };
1215}
1216
1217#[macro_export]
1220macro_rules! impl_altcomplex_from_data_generic {
1221 ({$($gen:tt)*} $ty:ty {$($whr:tt)*} $(, $knob:ident)*) => {
1222 $crate::__impl_alt_family!(
1223 {$($gen)*} $ty {$($whr)*},
1224 __impl_altcomplex_methods,
1225 impl_inferbase_complex,
1226 dataptr: dataptr($crate::Rcomplex),
1227 default: materializing($crate::Rcomplex)
1228 $(, $knob)*
1229 );
1230 };
1231}
1232