make heap_heap_return_* compatible with BigInt

This commit is contained in:
Solomon Ucko 2022-08-10 21:27:09 -04:00
parent b04ccea008
commit 1b4407ab45

View File

@ -1,5 +1,6 @@
use crate::smallint::SmallUintType; use crate::smallint::{SmallIntType, SmallUintType};
use crate::SmallUint; use crate::{SmallInt, SmallUint};
use core::cmp::Ordering;
use core::mem::ManuallyDrop; use core::mem::ManuallyDrop;
use core::ops::{BitAnd, BitOr, BitXor}; use core::ops::{BitAnd, BitOr, BitXor};
use core::ops::{BitAndAssign, BitOrAssign, BitXorAssign}; use core::ops::{BitAndAssign, BitOrAssign, BitXorAssign};
@ -154,7 +155,7 @@ macro_rules! heap_heap_create_res_longest {
macro_rules! heap_heap_return_heap { macro_rules! heap_heap_return_heap {
($typ:ident, $typ_inner:ident; $res:ident) => { ($typ:ident, $typ_inner:ident; $res:ident) => {
let mut slice = ManuallyDrop::new($res.into_boxed_slice()); let mut slice = ManuallyDrop::new($res.into_boxed_slice());
$typ($typ_inner::Heap((slice.as_mut_ptr(), slice.len()))) $typ($typ_inner::Heap((slice.as_mut_ptr(), slice.len().try_into().unwrap())))
} }
} }
@ -173,7 +174,7 @@ macro_rules! heap_heap_return_any {
$typ($typ_inner::Inline(r)) $typ($typ_inner::Inline(r))
} else { } else {
let mut slice = ManuallyDrop::new($res.into_boxed_slice()); let mut slice = ManuallyDrop::new($res.into_boxed_slice());
$typ($typ_inner::Heap((slice.as_mut_ptr(), slice.len()))) $typ($typ_inner::Heap((slice.as_mut_ptr(), slice.len().try_into().unwrap())))
} }
} }
} }
@ -203,3 +204,32 @@ logic_op! {
} }
logic_op! {
BitXor, BitXorAssign, SmallInt, SmallIntType, bitxor, bitxor_assign;
i, j, p, q, s, t;
{
todo!()
},
{
match (s.cmp(&0), t.cmp(&0)) {
(Ordering::Greater, Ordering::Greater) => {
// as usize is equivalent to abs for non-negative isize
let slice1 = unsafe { core::slice::from_raw_parts(p, s as usize) };
let slice2 = unsafe { core::slice::from_raw_parts(q, t as usize) };
let min = std::cmp::min(slice1.len(), slice2.len());
#[allow(unused_mut)]
let mut res = { heap_heap_create_res_longest! { bitxor; slice1, slice2, min } };
heap_heap_return_any! { SmallInt, SmallIntType, i128; res }
},
(Ordering::Greater, Ordering::Less) => todo!(),
(Ordering::Less, Ordering::Greater) => todo!(),
(Ordering::Less, Ordering::Less) => todo!(),
(Ordering::Equal, _) | (_, Ordering::Equal) => unreachable!("0 must be inline"),
}
}
}