22
33import { OBJECT , BLOCK_MAXSIZE , TOTAL_OVERHEAD } from "./rt/common" ;
44import { COMPARATOR , SORT } from "./util/sort" ;
5+ import { REVERSE } from "./util/bytes" ;
56import { idof } from "./builtins" ;
67import { Array } from "./array" ;
78import { E_INDEXOUTOFRANGE , E_INVALIDLENGTH , E_HOLEYARRAY } from "./util/error" ;
@@ -137,6 +138,51 @@ export class StaticArray<T> {
137138 }
138139 }
139140
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+
140186 includes ( value : T , fromIndex : i32 = 0 ) : bool {
141187 if ( isFloat < T > ( ) ) {
142188 let length = this . length ;
@@ -230,6 +276,85 @@ export class StaticArray<T> {
230276 return slice ;
231277 }
232278
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+
233358 sort ( comparator : ( a : T , b : T ) => i32 = COMPARATOR < T > ( ) ) : this {
234359 SORT < T > ( changetype < usize > ( this ) , this . length , comparator ) ;
235360 return this ;
@@ -247,6 +372,11 @@ export class StaticArray<T> {
247372 return < string > unreachable ( ) ;
248373 }
249374
375+ reverse ( ) : this {
376+ REVERSE < T > ( changetype < usize > ( this ) , this . length ) ;
377+ return this ;
378+ }
379+
250380 toString ( ) : string {
251381 return this . join ( ) ;
252382 }
0 commit comments