forked from libre-chip/fayalite
		
	make [T; N]: ToExpr for any N instead of a fixed list
This commit is contained in:
		
							parent
							
								
									7963f0a5cd
								
							
						
					
					
						commit
						ef4b3b4081
					
				
					 1 changed files with 6 additions and 55 deletions
				
			
		|  | @ -548,70 +548,21 @@ impl<E: ToExpr<Type = T>, T: FixedType> ToExpr for Vec<E> { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<E: ToExpr<Type = T>, T: FixedType> ToExpr for [E; 0] { | ||||
|     type Type = ArrayType<[T::Value; 0]>; | ||||
| impl<E: ToExpr<Type = T>, T: FixedType, const N: usize> ToExpr for [E; N] { | ||||
|     type Type = ArrayType<[T::Value; N]>; | ||||
| 
 | ||||
|     fn ty(&self) -> Self::Type { | ||||
|         ArrayType::new_with_len_type(FixedType::fixed_type(), ()) | ||||
|     } | ||||
| 
 | ||||
|     fn to_expr(&self) -> Expr<<Self::Type as Type>::Value> { | ||||
|         Array::new(FixedType::fixed_type(), Arc::new([])).to_expr() | ||||
|         let elements = Intern::intern_owned(Vec::from_iter( | ||||
|             self.iter().map(|v| v.to_expr().to_canonical_dyn()), | ||||
|         )); | ||||
|         ArrayLiteral::new_unchecked(elements, self.ty()).to_expr() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| macro_rules! impl_to_expr_for_non_empty_array { | ||||
|     ($N:literal) => { | ||||
|         impl<E: ToExpr<Type = T>, T: Type> ToExpr for [E; $N] { | ||||
|             type Type = ArrayType<[T::Value; $N]>; | ||||
| 
 | ||||
|             fn ty(&self) -> Self::Type { | ||||
|                 ArrayType::new_with_len_type(self[0].ty(), ()) | ||||
|             } | ||||
| 
 | ||||
|             fn to_expr(&self) -> Expr<<Self::Type as Type>::Value> { | ||||
|                 let elements = Intern::intern_owned(Vec::from_iter( | ||||
|                     self.iter().map(|v| v.to_expr().to_canonical_dyn()), | ||||
|                 )); | ||||
|                 ArrayLiteral::new_unchecked(elements, self.ty()).to_expr() | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| impl_to_expr_for_non_empty_array!(1); | ||||
| impl_to_expr_for_non_empty_array!(2); | ||||
| impl_to_expr_for_non_empty_array!(3); | ||||
| impl_to_expr_for_non_empty_array!(4); | ||||
| impl_to_expr_for_non_empty_array!(5); | ||||
| impl_to_expr_for_non_empty_array!(6); | ||||
| impl_to_expr_for_non_empty_array!(7); | ||||
| impl_to_expr_for_non_empty_array!(8); | ||||
| impl_to_expr_for_non_empty_array!(9); | ||||
| impl_to_expr_for_non_empty_array!(10); | ||||
| impl_to_expr_for_non_empty_array!(11); | ||||
| impl_to_expr_for_non_empty_array!(12); | ||||
| impl_to_expr_for_non_empty_array!(13); | ||||
| impl_to_expr_for_non_empty_array!(14); | ||||
| impl_to_expr_for_non_empty_array!(15); | ||||
| impl_to_expr_for_non_empty_array!(16); | ||||
| impl_to_expr_for_non_empty_array!(17); | ||||
| impl_to_expr_for_non_empty_array!(18); | ||||
| impl_to_expr_for_non_empty_array!(19); | ||||
| impl_to_expr_for_non_empty_array!(20); | ||||
| impl_to_expr_for_non_empty_array!(21); | ||||
| impl_to_expr_for_non_empty_array!(22); | ||||
| impl_to_expr_for_non_empty_array!(23); | ||||
| impl_to_expr_for_non_empty_array!(24); | ||||
| impl_to_expr_for_non_empty_array!(25); | ||||
| impl_to_expr_for_non_empty_array!(26); | ||||
| impl_to_expr_for_non_empty_array!(27); | ||||
| impl_to_expr_for_non_empty_array!(28); | ||||
| impl_to_expr_for_non_empty_array!(29); | ||||
| impl_to_expr_for_non_empty_array!(30); | ||||
| impl_to_expr_for_non_empty_array!(31); | ||||
| impl_to_expr_for_non_empty_array!(32); | ||||
| 
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct ArrayIntoIter<VA: ValueArrayOrSlice> { | ||||
|     array: Arc<VA>, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue