get #[hdl] struct S<A: KnownSize, B: KnownSize> to work
All checks were successful
/ test (push) Successful in 39m2s
All checks were successful
/ test (push) Successful in 39m2s
This commit is contained in:
parent
4909724995
commit
d0229fbcfb
|
@ -85,7 +85,7 @@ impl<T: Type, Len: Size> ArrayType<T, Len> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T: Type, Len: KnownSize> ArrayType<T, Len> {
|
||||
impl<T: Type, Len: KnownSize + Size<SizeType = Len>> ArrayType<T, Len> {
|
||||
pub fn new_static(element: T) -> Self {
|
||||
Self::new(element, Len::SizeType::default())
|
||||
}
|
||||
|
|
|
@ -32,8 +32,23 @@ mod sealed {
|
|||
pub const DYN_SIZE: usize = !0;
|
||||
pub type DynSize = ConstUsize<DYN_SIZE>;
|
||||
|
||||
pub trait KnownSize: GenericConstUsize + Size<SizeType = Self> {
|
||||
pub trait KnownSize:
|
||||
GenericConstUsize + sealed::SizeTypeSealed + sealed::SizeSealed + Default
|
||||
{
|
||||
const SIZE: Self;
|
||||
type ArrayMatch<Element: Type>: AsRef<[Expr<Element>]>
|
||||
+ AsMut<[Expr<Element>]>
|
||||
+ BorrowMut<[Expr<Element>]>
|
||||
+ 'static
|
||||
+ Send
|
||||
+ Sync
|
||||
+ Eq
|
||||
+ Clone
|
||||
+ std::hash::Hash
|
||||
+ std::fmt::Debug
|
||||
+ IntoIterator<Item = Expr<Element>>
|
||||
+ TryFrom<Vec<Expr<Element>>>
|
||||
+ Into<Vec<Expr<Element>>>;
|
||||
}
|
||||
|
||||
macro_rules! known_widths {
|
||||
|
@ -44,6 +59,7 @@ macro_rules! known_widths {
|
|||
v
|
||||
}> {
|
||||
const SIZE: Self = Self;
|
||||
type ArrayMatch<Element: Type> = [Expr<Element>; Self::VALUE];
|
||||
}
|
||||
};
|
||||
([2 $($rest:tt)*] $($bits:literal)+) => {
|
||||
|
@ -55,6 +71,7 @@ macro_rules! known_widths {
|
|||
known_widths!([$($rest)*] 1);
|
||||
impl KnownSize for ConstUsize<{2 $(* $rest)*}> {
|
||||
const SIZE: Self = Self;
|
||||
type ArrayMatch<Element: Type> = [Expr<Element>; Self::VALUE];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -124,30 +141,24 @@ impl<const VALUE: usize> sealed::SizeSealed for ConstUsize<VALUE> {}
|
|||
|
||||
impl<const VALUE: usize> sealed::SizeTypeSealed for ConstUsize<VALUE> {}
|
||||
|
||||
impl<const VALUE: usize> SizeType for ConstUsize<VALUE>
|
||||
where
|
||||
ConstUsize<VALUE>: KnownSize,
|
||||
{
|
||||
type Size = ConstUsize<VALUE>;
|
||||
impl<T: KnownSize> SizeType for T {
|
||||
type Size = T;
|
||||
}
|
||||
|
||||
impl<const VALUE: usize> Size for ConstUsize<VALUE>
|
||||
where
|
||||
ConstUsize<VALUE>: KnownSize,
|
||||
{
|
||||
type ArrayMatch<Element: Type> = [Expr<Element>; VALUE];
|
||||
impl<T: KnownSize> Size for T {
|
||||
type ArrayMatch<Element: Type> = <T as KnownSize>::ArrayMatch<Element>;
|
||||
|
||||
const KNOWN_VALUE: Option<usize> = Some(VALUE);
|
||||
const KNOWN_VALUE: Option<usize> = Some(T::VALUE);
|
||||
|
||||
type SizeType = ConstUsize<VALUE>;
|
||||
type SizeType = T;
|
||||
|
||||
fn as_usize(_size_type: Self::SizeType) -> usize {
|
||||
VALUE
|
||||
T::VALUE
|
||||
}
|
||||
|
||||
fn try_from_usize(v: usize) -> Option<Self::SizeType> {
|
||||
if v == VALUE {
|
||||
Some(ConstUsize)
|
||||
if v == T::VALUE {
|
||||
Some(T::SIZE)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
@ -252,9 +263,7 @@ macro_rules! impl_int {
|
|||
|
||||
impl<Width: KnownSize> $name<Width> {
|
||||
pub fn new_static() -> Self {
|
||||
Self {
|
||||
width: Width::SizeType::default(),
|
||||
}
|
||||
Self { width: Width::SIZE }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -526,9 +535,9 @@ pub trait BoolOrIntType: Type + sealed::BoolOrIntTypeSealed {
|
|||
fn new(width: <Self::Width as Size>::SizeType) -> Self;
|
||||
fn new_static() -> Self
|
||||
where
|
||||
Self::Width: KnownSize,
|
||||
Self::Width: KnownSize + Size<SizeType = Self::Width>,
|
||||
{
|
||||
Self::new(<Self::Width as Size>::SizeType::default())
|
||||
Self::new(Self::Width::default())
|
||||
}
|
||||
fn as_same_width_sint(self) -> SIntType<Self::Width> {
|
||||
SIntType::new(Self::Width::from_usize(self.width()))
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
// See Notices.txt for copyright information
|
||||
use fayalite::prelude::*;
|
||||
#[cfg(todo)]
|
||||
use fayalite::{
|
||||
bundle::BundleType,
|
||||
enum_::EnumType,
|
||||
int::{BoolOrIntType, IntType},
|
||||
prelude::*,
|
||||
ty::StaticType,
|
||||
};
|
||||
use std::marker::PhantomData;
|
||||
|
@ -121,7 +120,6 @@ mod bound_kind {
|
|||
|
||||
macro_rules! check_bounds {
|
||||
($name:ident<$(#[$field:ident, $kind:ident] $var:ident: $($bound:ident +)*),*>) => {
|
||||
#[cfg(todo)]
|
||||
#[hdl(outline_generated)]
|
||||
struct $name<$($var: $($bound +)*,)*> {
|
||||
$($field: bound_kind::$kind<$var>,)*
|
||||
|
|
Loading…
Reference in a new issue