mirror of
				https://gitlab.com/artofrev/smallint.git
				synced 2025-10-31 06:51:12 -04:00 
			
		
		
		
	make heap_heap_return_* compatible with BigInt
This commit is contained in:
		
							parent
							
								
									b04ccea008
								
							
						
					
					
						commit
						1b4407ab45
					
				
							
								
								
									
										38
									
								
								src/logic.rs
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								src/logic.rs
									
									
									
									
									
								
							| @ -1,5 +1,6 @@ | ||||
| use crate::smallint::SmallUintType; | ||||
| use crate::SmallUint; | ||||
| use crate::smallint::{SmallIntType, SmallUintType}; | ||||
| use crate::{SmallInt, SmallUint}; | ||||
| use core::cmp::Ordering; | ||||
| use core::mem::ManuallyDrop; | ||||
| use core::ops::{BitAnd, BitOr, BitXor}; | ||||
| use core::ops::{BitAndAssign, BitOrAssign, BitXorAssign}; | ||||
| @ -154,7 +155,7 @@ macro_rules! heap_heap_create_res_longest { | ||||
| macro_rules! heap_heap_return_heap { | ||||
|     ($typ:ident, $typ_inner:ident; $res:ident) => { | ||||
|         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)) | ||||
|         } else { | ||||
|             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"), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user