14
14
//! * `get<T: Copyable>: [static_array<T>, prelude.usize] -> [[] + [T]]`
15
15
//! * `len<T: Copyable>: [static_array<T>] -> [prelude.usize]`
16
16
use std:: {
17
- hash, iter,
17
+ hash:: { self , Hash as _} ,
18
+ iter,
18
19
sync:: { self , Arc } ,
19
20
} ;
20
21
21
22
use crate :: {
22
23
builder:: { BuildError , Dataflow } ,
23
24
extension:: {
24
25
prelude:: { option_type, usize_t} ,
25
- resolution:: { ExtensionResolutionError , WeakExtensionRegistry } ,
26
+ resolution:: {
27
+ resolve_type_extensions, resolve_value_extensions, ExtensionResolutionError ,
28
+ WeakExtensionRegistry ,
29
+ } ,
26
30
simple_op:: {
27
31
try_from_name, HasConcrete , HasDef , MakeExtensionOp , MakeOpDef , MakeRegisteredOp ,
28
32
OpLoadError ,
29
33
} ,
30
34
ExtensionId , ExtensionSet , OpDef , SignatureError , SignatureFunc , TypeDef ,
31
35
} ,
32
36
ops:: {
33
- constant:: { CustomConst , TryHash , ValueName } ,
37
+ constant:: { maybe_hash_values , CustomConst , TryHash , ValueName } ,
34
38
ExtensionOp , NamedOp , OpName , Value ,
35
39
} ,
36
40
types:: {
@@ -41,9 +45,6 @@ use crate::{
41
45
Extension , Wire ,
42
46
} ;
43
47
44
- use super :: array:: ArrayValue ;
45
-
46
- use delegate:: delegate;
47
48
use lazy_static:: lazy_static;
48
49
49
50
/// Reported unique name of the extension
@@ -53,22 +54,25 @@ pub const STATIC_ARRAY_TYPENAME: TypeName = TypeName::new_inline("static_array")
53
54
/// Extension version.
54
55
pub const VERSION : semver:: Version = semver:: Version :: new ( 0 , 1 , 0 ) ;
55
56
56
- #[ derive( Debug , Clone , serde:: Serialize , serde:: Deserialize , PartialEq , derive_more:: From ) ]
57
+ #[ derive( Debug , Clone , PartialEq , serde:: Serialize , serde:: Deserialize , derive_more:: From ) ]
57
58
/// Statically sized array of values, all of the same [TypeBound::Copyable]
58
59
/// type.
59
60
pub struct StaticArrayValue {
60
- /// The contents of the `StaticArrayValue`.
61
- pub value : ArrayValue ,
61
+ values : Vec < Value > ,
62
+ typ : Type ,
62
63
/// The name of the `StaticArrayValue`.
63
64
pub name : String ,
64
65
}
65
66
66
67
impl StaticArrayValue {
67
- delegate ! {
68
- to self . value {
69
- /// Returns the type of values inside the `[StaticArrayValue]`.
70
- pub fn get_element_type( & self ) -> & Type ;
71
- }
68
+ /// Returns the type of values inside the `[StaticArrayValue]`.
69
+ pub fn get_element_type ( & self ) -> & Type {
70
+ & self . typ
71
+ }
72
+
73
+ /// Returns the values contained inside the `[StaticArrayValue]`.
74
+ pub fn get_contents ( & self ) -> & [ Value ] {
75
+ & self . values
72
76
}
73
77
74
78
/// Create a new [CustomConst] for an array of values of type `typ`.
@@ -85,7 +89,8 @@ impl StaticArrayValue {
85
89
. into ( ) ) ;
86
90
}
87
91
Ok ( Self {
88
- value : ArrayValue :: new ( typ, contents) ,
92
+ typ,
93
+ values : contents. into_iter ( ) . collect ( ) ,
89
94
name : name. to_string ( ) ,
90
95
} )
91
96
}
@@ -102,9 +107,12 @@ impl StaticArrayValue {
102
107
}
103
108
104
109
impl TryHash for StaticArrayValue {
105
- fn try_hash ( & self , st : & mut dyn hash:: Hasher ) -> bool {
106
- st. write ( self . name . as_bytes ( ) ) ;
107
- self . value . try_hash ( st)
110
+ fn try_hash ( & self , mut st : & mut dyn hash:: Hasher ) -> bool {
111
+ maybe_hash_values ( & self . values , & mut st) && {
112
+ self . name . hash ( & mut st) ;
113
+ self . typ . hash ( & mut st) ;
114
+ true
115
+ }
108
116
}
109
117
}
110
118
@@ -123,17 +131,18 @@ impl CustomConst for StaticArrayValue {
123
131
}
124
132
125
133
fn extension_reqs ( & self ) -> ExtensionSet {
126
- ExtensionSet :: union_over ( self . value . get_contents ( ) . iter ( ) . map ( Value :: extension_reqs) )
134
+ ExtensionSet :: union_over ( self . values . iter ( ) . map ( Value :: extension_reqs) )
127
135
. union ( EXTENSION_ID . into ( ) )
128
136
}
129
137
130
- delegate ! {
131
- to self . value {
132
- fn update_extensions (
133
- & mut self ,
134
- extensions : & WeakExtensionRegistry ,
135
- ) -> Result < ( ) , ExtensionResolutionError > ;
138
+ fn update_extensions (
139
+ & mut self ,
140
+ extensions : & WeakExtensionRegistry ,
141
+ ) -> Result < ( ) , ExtensionResolutionError > {
142
+ for val in & mut self . values {
143
+ resolve_value_extensions ( val , extensions ) ? ;
136
144
}
145
+ resolve_type_extensions ( & mut self . typ , extensions)
137
146
}
138
147
}
139
148
0 commit comments