@@ -3,7 +3,7 @@ use std::{collections::VecDeque, mem::take};
3
3
use ecow:: EcoVec ;
4
4
5
5
use crate :: {
6
- algorithm:: { pervade:: * , FillContext , MultiOutput } ,
6
+ algorithm:: { pervade:: * , validate_size , FillContext , MultiOutput } ,
7
7
cowslice:: extend_repeat,
8
8
val_as_arr, Array , ArrayValue , Boxed , Node , Primitive , Shape , SigNode , Uiua , UiuaResult , Value ,
9
9
} ;
78
78
Default ( MultiOutput < Vec < Value > > , EcoVec < T > ) ,
79
79
}
80
80
81
+ // Determine shape stuff
82
+ let mut shape_prefix = Shape :: SCALAR ;
83
+ for ( d, s) in dims. iter ( ) . zip ( & arr. shape ) {
84
+ let total_len = * s + 2 * d. fill * d. stride ;
85
+ shape_prefix. push ( ( total_len + d. stride ) . saturating_sub ( d. size ) / d. stride ) ;
86
+ }
87
+ let window_shape = Shape :: from_iter (
88
+ dims. iter ( )
89
+ . map ( |d| d. size )
90
+ . chain ( arr. shape . iter ( ) . skip ( dims. len ( ) ) . copied ( ) ) ,
91
+ ) ;
92
+ if shape_prefix. contains ( & 0 ) {
93
+ let mut shape = shape_prefix;
94
+ shape. extend ( window_shape) ;
95
+ env. push ( Array :: new ( shape, EcoVec :: new ( ) ) ) ;
96
+ return Ok ( ( ) ) ;
97
+ }
98
+
99
+ // Initialize action
81
100
let mut action: WindowAction < T > = match & f. node {
82
- Node :: Prim ( Primitive :: Identity , _) => WindowAction :: Id ( EcoVec :: new ( ) ) ,
101
+ Node :: Prim ( Primitive :: Identity , _) => {
102
+ let size = validate_size :: < T > (
103
+ ( shape_prefix. iter ( ) . copied ( ) ) . chain ( window_shape. iter ( ) . copied ( ) ) ,
104
+ env,
105
+ ) ?;
106
+ WindowAction :: Id ( EcoVec :: with_capacity ( size) )
107
+ }
83
108
Node :: Prim ( Primitive :: Box , _) => WindowAction :: Box ( EcoVec :: new ( ) , EcoVec :: new ( ) ) ,
84
109
_ => WindowAction :: Default ( multi_output ( f. sig . outputs , Vec :: new ( ) ) , EcoVec :: new ( ) ) ,
85
110
} ;
@@ -143,22 +168,6 @@ where
143
168
let mut corner = corner_starts. clone ( ) ;
144
169
let mut curr = corner. clone ( ) ;
145
170
let mut offset = vec ! [ 0usize ; corner. len( ) ] ;
146
- let mut shape_prefix = Shape :: SCALAR ;
147
- for ( d, s) in dims. iter ( ) . zip ( & arr. shape ) {
148
- let total_len = * s + 2 * d. fill * d. stride ;
149
- shape_prefix. push ( ( total_len + d. stride ) . saturating_sub ( d. size ) / d. stride ) ;
150
- }
151
- let window_shape = Shape :: from_iter (
152
- dims. iter ( )
153
- . map ( |d| d. size )
154
- . chain ( arr. shape . iter ( ) . skip ( dims. len ( ) ) . copied ( ) ) ,
155
- ) ;
156
- if shape_prefix. contains ( & 0 ) {
157
- let mut shape = shape_prefix;
158
- shape. extend ( window_shape) ;
159
- env. push ( Array :: new ( shape, EcoVec :: new ( ) ) ) ;
160
- return Ok ( ( ) ) ;
161
- }
162
171
let cell_shape = Shape :: from ( & arr. shape [ dims. len ( ) ..] ) ;
163
172
let cell_len = cell_shape. elements ( ) ;
164
173
let fill = fill. unwrap_or_else ( T :: proxy) ;
0 commit comments