mirror of
				https://gitlab.com/artofrev/smallint.git
				synced 2025-10-31 06:51:12 -04:00 
			
		
		
		
	refactor macro structure
This commit is contained in:
		
							parent
							
								
									8cf2d6b870
								
							
						
					
					
						commit
						06ce35aa69
					
				
							
								
								
									
										90
									
								
								src/logic.rs
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								src/logic.rs
									
									
									
									
									
								
							| @ -4,8 +4,29 @@ use core::mem::ManuallyDrop; | ||||
| use core::ops::{BitAnd, BitOr, BitXor}; | ||||
| use core::ops::{BitAndAssign, BitOrAssign, BitXorAssign}; | ||||
| 
 | ||||
| macro_rules! basic_op { | ||||
|     ($imp:ident, $typ:ty, $fun:ident) => { | ||||
| macro_rules! logic_op { | ||||
|     ( | ||||
|         $imp:ident, $imp_assign:ident, $typ:ident, $typ_inner:ident, $fun:ident, $fun_assign:ident; | ||||
|         $i:ident, $j:ident, $r:ident, $s:ident; | ||||
|         $inline_heap:tt, $heap_heap:tt | ||||
|     ) => { | ||||
|         fn $fun(a: &$typ, b: &$typ) -> $typ { | ||||
|             match (&a.0, &b.0) { | ||||
|                 (&$typ_inner::Inline($i), &$typ_inner::Inline($j)) => { | ||||
|                     $typ($typ_inner::Inline($i.$fun($j))) | ||||
|                 } | ||||
| 
 | ||||
|                 (&$typ_inner::Inline($i), &$typ_inner::Heap(($r, $s))) | ||||
|                 | (&$typ_inner::Heap(($r, $s)), &$typ_inner::Inline($i)) => { | ||||
|                     $inline_heap | ||||
|                 } | ||||
| 
 | ||||
|                 (&$typ_inner::Heap(($r, $s)), &$typ_inner::Heap(($i, $j))) => { | ||||
|                     $heap_heap | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         impl<'a, 'b> $imp<&'a $typ> for &'b $typ { | ||||
|             type Output = $typ; | ||||
| 
 | ||||
| @ -37,43 +58,6 @@ macro_rules! basic_op { | ||||
|                 (&self).$fun(&rhs) | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| macro_rules! logic_op { | ||||
|     ( | ||||
|         $imp:ident, $imp_assign:ident, $typ:ident, $typ_inner:ident, $fun:ident, $fun_assign:ident; | ||||
|         $i:ident, $j:ident, $r:ident, $s:ident, $slice:ident, $slice1:ident, $slice2:ident, $min:ident, $res:ident; | ||||
|         $inline_heap:tt, $heap_heap_create_res:tt, $heap_heap_return:tt | ||||
|     ) => { | ||||
|         fn $fun(a: &$typ, b: &$typ) -> $typ { | ||||
|             match (&a.0, &b.0) { | ||||
|                 (&$typ_inner::Inline($i), &$typ_inner::Inline($j)) => { | ||||
|                     $typ($typ_inner::Inline($i.$fun($j))) | ||||
|                 } | ||||
| 
 | ||||
|                 (&$typ_inner::Inline($i), &$typ_inner::Heap(($r, $s))) | ||||
|                 | (&$typ_inner::Heap(($r, $s)), &$typ_inner::Inline($i)) => { | ||||
|                     let $slice = unsafe { core::slice::from_raw_parts($r, $s) }; | ||||
| 
 | ||||
|                     $inline_heap | ||||
|                 } | ||||
| 
 | ||||
|                 (&$typ_inner::Heap(($r, $s)), &$typ_inner::Heap(($i, $j))) => { | ||||
|                     let $slice1 = unsafe { core::slice::from_raw_parts($r, $s) }; | ||||
|                     let $slice2 = unsafe { core::slice::from_raw_parts($i, $j) }; | ||||
| 
 | ||||
|                     let $min = std::cmp::min($slice1.len(), $slice2.len()); | ||||
| 
 | ||||
|                     #[allow(unused_mut)] | ||||
|                     let mut $res = $heap_heap_create_res; | ||||
| 
 | ||||
|                     $heap_heap_return | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         basic_op!($imp, $typ, $fun); | ||||
| 
 | ||||
|         impl<'a> $imp_assign<&'a SmallUint> for $typ { | ||||
|             fn $fun_assign(&mut self, rhs: &'a $typ) { | ||||
| @ -86,7 +70,33 @@ macro_rules! logic_op { | ||||
|                 *self = (&*self).$fun(rhs); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }; | ||||
|     ( | ||||
|         $imp:ident, $imp_assign:ident, $typ:ident, $typ_inner:ident, $fun:ident, $fun_assign:ident; | ||||
|         $i:ident, $j:ident, $r:ident, $s:ident, $slice:ident, $slice1:ident, $slice2:ident, $min:ident, $res:ident; | ||||
|         $inline_heap_inner:tt, $heap_heap_create_res:tt, $heap_heap_return:tt | ||||
|     ) => { | ||||
|         logic_op! { | ||||
|             $imp, $imp_assign, $typ, $typ_inner, $fun, $fun_assign; | ||||
|             $i, $j, $r, $s; | ||||
|             { | ||||
|                 let $slice = unsafe { core::slice::from_raw_parts($r, $s) }; | ||||
| 
 | ||||
|                 $inline_heap_inner | ||||
|             }, | ||||
|             { | ||||
|                 let $slice1 = unsafe { core::slice::from_raw_parts($r, $s) }; | ||||
|                 let $slice2 = unsafe { core::slice::from_raw_parts($i, $j) }; | ||||
| 
 | ||||
|                 let $min = std::cmp::min($slice1.len(), $slice2.len()); | ||||
| 
 | ||||
|                 #[allow(unused_mut)] | ||||
|                 let mut $res = $heap_heap_create_res; | ||||
| 
 | ||||
|                 $heap_heap_return | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user