@@ -72,17 +72,15 @@ export class Array<T> {
72
72
}
73
73
74
74
every ( callbackfn : ( element : T , index : i32 , array : Array < T > ) => bool ) : bool {
75
- var buffer = this . buffer_ ;
76
- for ( let index = 0 , toIndex = this . length_ ; index < min ( toIndex , this . length_ ) ; ++ index ) {
77
- if ( ! callbackfn ( LOAD < T > ( buffer , index ) , index , this ) ) return false ;
75
+ for ( let index = 0 , length = this . length_ ; index < min ( length , this . length_ ) ; ++ index ) {
76
+ if ( ! callbackfn ( LOAD < T > ( this . buffer_ , index ) , index , this ) ) return false ;
78
77
}
79
78
return true ;
80
79
}
81
80
82
81
findIndex ( predicate : ( element : T , index : i32 , array : Array < T > ) => bool ) : i32 {
83
- var buffer = this . buffer_ ;
84
- for ( let index = 0 , toIndex = this . length_ ; index < min ( toIndex , this . length_ ) ; ++ index ) {
85
- if ( predicate ( LOAD < T > ( buffer , index ) , index , this ) ) return index ;
82
+ for ( let index = 0 , length = this . length_ ; index < min ( length , this . length_ ) ; ++ index ) {
83
+ if ( predicate ( LOAD < T > ( this . buffer_ , index ) , index , this ) ) return index ;
86
84
}
87
85
return - 1 ;
88
86
}
@@ -193,7 +191,7 @@ export class Array<T> {
193
191
194
192
concat ( items : Array < T > ) : Array < T > {
195
193
var thisLen = this . length_ ;
196
- var otherLen = items === null ? 0 : items . length_ ;
194
+ var otherLen = select ( 0 , items . length_ , items === null ) ;
197
195
var outLen = thisLen + otherLen ;
198
196
var out = new Array < T > ( outLen ) ;
199
197
@@ -250,27 +248,25 @@ export class Array<T> {
250
248
}
251
249
252
250
forEach ( callbackfn : ( value : T , index : i32 , array : Array < T > ) => void ) : void {
253
- for ( let index = 0 , toIndex = this . length_ ; index < toIndex && index < this . length_ ; ++ index ) {
251
+ for ( let index = 0 , length = this . length_ ; index < min ( length , this . length_ ) ; ++ index ) {
254
252
callbackfn ( LOAD < T > ( this . buffer_ , index ) , index , this ) ;
255
253
}
256
254
}
257
255
258
256
map < U > ( callbackfn : ( value : T , index : i32 , array : Array < T > ) => U ) : Array < U > {
259
- var buffer = this . buffer_ ;
260
257
var length = this . length_ ;
261
258
var result = new Array < U > ( length ) ;
262
- var resultBuffer = result . buffer_ ;
259
+ var buffer = result . buffer_ ;
263
260
for ( let index = 0 ; index < min ( length , this . length_ ) ; ++ index ) {
264
- STORE < U > ( resultBuffer , index , callbackfn ( LOAD < T > ( buffer , index ) , index , this ) ) ;
261
+ STORE < U > ( buffer , index , callbackfn ( LOAD < T > ( this . buffer_ , index ) , index , this ) ) ;
265
262
}
266
263
return result ;
267
264
}
268
265
269
266
filter ( callbackfn : ( value : T , index : i32 , array : Array < T > ) => bool ) : Array < T > {
270
- var buffer = this . buffer_ ;
271
267
var result = new Array < T > ( ) ;
272
- for ( let index = 0 , toIndex = this . length_ ; index < min ( toIndex , this . length_ ) ; ++ index ) {
273
- let value = LOAD < T > ( buffer , index ) ;
268
+ for ( let index = 0 , length = this . length_ ; index < min ( length , this . length_ ) ; ++ index ) {
269
+ let value = LOAD < T > ( this . buffer_ , index ) ;
274
270
if ( callbackfn ( value , index , this ) ) result . push ( value ) ;
275
271
}
276
272
return result ;
@@ -281,9 +277,8 @@ export class Array<T> {
281
277
initialValue : U
282
278
) : U {
283
279
var accum = initialValue ;
284
- var buffer = this . buffer_ ;
285
- for ( let index = 0 , toIndex = this . length_ ; index < min ( toIndex , this . length_ ) ; ++ index ) {
286
- accum = callbackfn ( accum , LOAD < T > ( buffer , index ) , index , this ) ;
280
+ for ( let index = 0 , length = this . length_ ; index < min ( length , this . length_ ) ; ++ index ) {
281
+ accum = callbackfn ( accum , LOAD < T > ( this . buffer_ , index ) , index , this ) ;
287
282
}
288
283
return accum ;
289
284
}
@@ -293,9 +288,8 @@ export class Array<T> {
293
288
initialValue : U
294
289
) : U {
295
290
var accum = initialValue ;
296
- var buffer = this . buffer_ ;
297
- for ( let index : i32 = this . length_ - 1 ; index >= 0 ; -- index ) {
298
- accum = callbackfn ( accum , LOAD < T > ( buffer , index ) , index , this ) ;
291
+ for ( let index = this . length_ - 1 ; index >= 0 ; -- index ) {
292
+ accum = callbackfn ( accum , LOAD < T > ( this . buffer_ , index ) , index , this ) ;
299
293
}
300
294
return accum ;
301
295
}
@@ -317,9 +311,8 @@ export class Array<T> {
317
311
}
318
312
319
313
some ( callbackfn : ( element : T , index : i32 , array : Array < T > ) => bool ) : bool {
320
- var buffer = this . buffer_ ;
321
- for ( let index = 0 , toIndex = this . length_ ; index < min ( toIndex , this . length_ ) ; ++ index ) {
322
- if ( callbackfn ( LOAD < T > ( buffer , index ) , index , this ) ) return true ;
314
+ for ( let index = 0 , length = this . length_ ; index < min ( length , this . length_ ) ; ++ index ) {
315
+ if ( callbackfn ( LOAD < T > ( this . buffer_ , index ) , index , this ) ) return true ;
323
316
}
324
317
return false ;
325
318
}
@@ -348,20 +341,16 @@ export class Array<T> {
348
341
}
349
342
350
343
slice ( begin : i32 = 0 , end : i32 = i32 . MAX_VALUE ) : Array < T > {
351
- var length = this . length_ ;
352
- if ( begin < 0 ) begin = max ( length + begin , 0 ) ;
353
- else if ( begin > length ) begin = length ;
354
- if ( end < 0 ) end = length + end ; // no need to clamp
355
- else if ( end > length ) end = length ;
356
- if ( end < begin ) end = begin ; // ^
357
- var newLength = end - begin ;
358
- assert ( newLength >= 0 ) ;
359
- var sliced = new Array < T > ( newLength ) ;
360
- if ( newLength ) {
344
+ var len = this . length_ ;
345
+ begin = begin < 0 ? max ( begin + len , 0 ) : min ( begin , len ) ;
346
+ end = end < 0 ? max ( end + len , 0 ) : min ( end , len ) ;
347
+ len = end - begin ;
348
+ var sliced = new Array < T > ( len ) ;
349
+ if ( len ) {
361
350
memory . copy (
362
351
changetype < usize > ( sliced . buffer_ ) + HEADER_SIZE ,
363
352
changetype < usize > ( this . buffer_ ) + HEADER_SIZE + ( < usize > begin << alignof < T > ( ) ) ,
364
- < usize > newLength << alignof < T > ( )
353
+ < usize > len << alignof < T > ( )
365
354
) ;
366
355
}
367
356
return sliced ;
@@ -430,9 +419,8 @@ export class Array<T> {
430
419
var sepLen = separator . length ;
431
420
var hasSeparator = sepLen != 0 ;
432
421
if ( value instanceof bool ) {
433
- if ( ! lastIndex ) {
434
- return select < string > ( "true" , "false" , LOAD < T , bool > ( buffer , 0 ) ) ;
435
- }
422
+ if ( ! lastIndex ) return select < string > ( "true" , "false" , LOAD < T , bool > ( buffer , 0 ) ) ;
423
+
436
424
let valueLen = 5 ; // max possible length of element len("false")
437
425
let estLen = ( valueLen + sepLen ) * lastIndex + valueLen ;
438
426
let result = allocateUnsafeString ( estLen ) ;
@@ -459,9 +447,8 @@ export class Array<T> {
459
447
}
460
448
return out ;
461
449
} else if ( isInteger < T > ( ) ) {
462
- if ( ! lastIndex ) {
463
- return changetype < string > ( itoa < T > ( LOAD < T > ( buffer , 0 ) ) ) ;
464
- }
450
+ if ( ! lastIndex ) return changetype < string > ( itoa < T > ( LOAD < T > ( buffer , 0 ) ) ) ;
451
+
465
452
const valueLen = ( sizeof < T > ( ) <= 4 ? 10 : 20 ) + < i32 > isSigned < T > ( ) ;
466
453
let estLen = ( valueLen + sepLen ) * lastIndex + valueLen ;
467
454
let result = allocateUnsafeString ( estLen ) ;
@@ -483,9 +470,8 @@ export class Array<T> {
483
470
}
484
471
return out ;
485
472
} else if ( isFloat < T > ( ) ) {
486
- if ( ! lastIndex ) {
487
- return changetype < string > ( dtoa ( LOAD < T , f64 > ( buffer , 0 ) ) ) ;
488
- }
473
+ if ( ! lastIndex ) return changetype < string > ( dtoa ( LOAD < T , f64 > ( buffer , 0 ) ) ) ;
474
+
489
475
const valueLen = MAX_DOUBLE_LENGTH ;
490
476
let estLen = ( valueLen + sepLen ) * lastIndex + valueLen ;
491
477
let result = allocateUnsafeString ( estLen ) ;
@@ -507,9 +493,8 @@ export class Array<T> {
507
493
}
508
494
return out ;
509
495
} else if ( isString < T > ( ) ) {
510
- if ( ! lastIndex ) {
511
- return LOAD < string > ( buffer , 0 ) ;
512
- }
496
+ if ( ! lastIndex ) return LOAD < string > ( buffer , 0 ) ;
497
+
513
498
let estLen = 0 ;
514
499
for ( let i = 0 , len = lastIndex + 1 ; i < len ; ++ i ) {
515
500
estLen += LOAD < string > ( buffer , i ) . length ;
0 commit comments