2
2
3
3
import { OBJECT , BLOCK_MAXSIZE , TOTAL_OVERHEAD } from "./rt/common" ;
4
4
import { COMPARATOR , SORT } from "./util/sort" ;
5
+ import { REVERSE } from "./util/bytes" ;
5
6
import { idof } from "./builtins" ;
6
7
import { Array } from "./array" ;
7
8
import { E_INDEXOUTOFRANGE , E_INVALIDLENGTH , E_HOLEYARRAY } from "./util/error" ;
@@ -137,6 +138,51 @@ export class StaticArray<T> {
137
138
}
138
139
}
139
140
141
+ fill ( value : T , start : i32 = 0 , end : i32 = i32 . MAX_VALUE ) : this {
142
+ var ptr = changetype < usize > ( this ) ;
143
+ var len = this . length ;
144
+ start = start < 0 ? max ( len + start , 0 ) : min ( start , len ) ;
145
+ end = end < 0 ? max ( len + end , 0 ) : min ( end , len ) ;
146
+ if ( isManaged < T > ( ) ) {
147
+ for ( ; start < end ; ++ start ) {
148
+ store < usize > ( ptr + ( < usize > start << alignof < T > ( ) ) , changetype < usize > ( value ) ) ;
149
+ __link ( changetype < usize > ( this ) , changetype < usize > ( value ) , true ) ;
150
+ }
151
+ } else if ( sizeof < T > ( ) == 1 ) {
152
+ if ( start < end ) {
153
+ memory . fill (
154
+ ptr + < usize > start ,
155
+ u8 ( value ) ,
156
+ < usize > ( end - start )
157
+ ) ;
158
+ }
159
+ } else {
160
+ for ( ; start < end ; ++ start ) {
161
+ store < T > ( ptr + ( < usize > start << alignof < T > ( ) ) , value ) ;
162
+ }
163
+ }
164
+ return this ;
165
+ }
166
+
167
+ copyWithin ( target : i32 , start : i32 , end : i32 = i32 . MAX_VALUE ) : this {
168
+ var ptr = changetype < usize > ( this ) ;
169
+ var len = this . length ;
170
+
171
+ end = min < i32 > ( end , len ) ;
172
+
173
+ var to = target < 0 ? max ( len + target , 0 ) : min ( target , len ) ;
174
+ var from = start < 0 ? max ( len + start , 0 ) : min ( start , len ) ;
175
+ var last = end < 0 ? max ( len + end , 0 ) : min ( end , len ) ;
176
+ var count = min ( last - from , len - to ) ;
177
+
178
+ memory . copy ( // is memmove
179
+ ptr + ( < usize > to << alignof < T > ( ) ) ,
180
+ ptr + ( < usize > from << alignof < T > ( ) ) ,
181
+ < usize > count << alignof < T > ( )
182
+ ) ;
183
+ return this ;
184
+ }
185
+
140
186
includes ( value : T , fromIndex : i32 = 0 ) : bool {
141
187
if ( isFloat < T > ( ) ) {
142
188
let length = this . length ;
@@ -230,6 +276,85 @@ export class StaticArray<T> {
230
276
return slice ;
231
277
}
232
278
279
+ findIndex ( fn : ( value : T , index : i32 , array : StaticArray < T > ) => bool ) : i32 {
280
+ for ( let i = 0 , len = this . length ; i < len ; ++ i ) {
281
+ if ( fn ( load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ) return i ;
282
+ }
283
+ return - 1 ;
284
+ }
285
+
286
+ findLastIndex ( fn : ( value : T , index : i32 , array : StaticArray < T > ) => bool ) : i32 {
287
+ for ( let i = this . length - 1 ; i >= 0 ; -- i ) {
288
+ if ( fn ( load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ) return i ;
289
+ }
290
+ return - 1 ;
291
+ }
292
+
293
+ forEach ( fn : ( value : T , index : i32 , array : StaticArray < T > ) => void ) : void {
294
+ for ( let i = 0 , len = this . length ; i < len ; ++ i ) {
295
+ fn ( load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ;
296
+ }
297
+ }
298
+
299
+ map < U > ( fn : ( value : T , index : i32 , array : StaticArray < T > ) => U ) : Array < U > {
300
+ var len = this . length ;
301
+ var out = changetype < Array < U > > ( __newArray ( len , alignof < U > ( ) , idof < Array < U > > ( ) ) ) ;
302
+ var outStart = out . dataStart ;
303
+ for ( let i = 0 ; i < len ; ++ i ) {
304
+ let result = fn ( load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ;
305
+ store < U > ( outStart + ( < usize > i << alignof < U > ( ) ) , result ) ;
306
+ if ( isManaged < U > ( ) ) {
307
+ __link ( changetype < usize > ( out ) , changetype < usize > ( result ) , true ) ;
308
+ }
309
+ }
310
+ return out ;
311
+ }
312
+
313
+ filter ( fn : ( value : T , index : i32 , array : StaticArray < T > ) => bool ) : Array < T > {
314
+ var result = changetype < Array < T > > ( __newArray ( 0 , alignof < T > ( ) , idof < Array < T > > ( ) ) ) ;
315
+ for ( let i = 0 , len = this . length ; i < len ; ++ i ) {
316
+ let value = load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) ;
317
+ if ( fn ( value , i , this ) ) result . push ( value ) ;
318
+ }
319
+ return result ;
320
+ }
321
+
322
+ reduce < U > (
323
+ fn : ( previousValue : U , currentValue : T , currentIndex : i32 , array : StaticArray < T > ) => U ,
324
+ initialValue : U
325
+ ) : U {
326
+ var acc = initialValue ;
327
+ for ( let i = 0 , len = this . length ; i < len ; ++ i ) {
328
+ acc = fn ( acc , load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ;
329
+ }
330
+ return acc ;
331
+ }
332
+
333
+ reduceRight < U > (
334
+ fn : ( previousValue : U , currentValue : T , currentIndex : i32 , array : StaticArray < T > ) => U ,
335
+ initialValue : U
336
+ ) : U {
337
+ var acc = initialValue ;
338
+ for ( let i = this . length - 1 ; i >= 0 ; -- i ) {
339
+ acc = fn ( acc , load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ;
340
+ }
341
+ return acc ;
342
+ }
343
+
344
+ every ( fn : ( value : T , index : i32 , array : StaticArray < T > ) => bool ) : bool {
345
+ for ( let i = 0 , len = this . length ; i < len ; ++ i ) {
346
+ if ( ! fn ( load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ) return false ;
347
+ }
348
+ return true ;
349
+ }
350
+
351
+ some ( fn : ( value : T , index : i32 , array : StaticArray < T > ) => bool ) : bool {
352
+ for ( let i = 0 , len = this . length ; i < len ; ++ i ) {
353
+ if ( fn ( load < T > ( changetype < usize > ( this ) + ( < usize > i << alignof < T > ( ) ) ) , i , this ) ) return true ;
354
+ }
355
+ return false ;
356
+ }
357
+
233
358
sort ( comparator : ( a : T , b : T ) => i32 = COMPARATOR < T > ( ) ) : this {
234
359
SORT < T > ( changetype < usize > ( this ) , this . length , comparator ) ;
235
360
return this ;
@@ -247,6 +372,11 @@ export class StaticArray<T> {
247
372
return < string > unreachable ( ) ;
248
373
}
249
374
375
+ reverse ( ) : this {
376
+ REVERSE < T > ( changetype < usize > ( this ) , this . length ) ;
377
+ return this ;
378
+ }
379
+
250
380
toString ( ) : string {
251
381
return this . join ( ) ;
252
382
}
0 commit comments