6
6
using System . Diagnostics ;
7
7
using System . Collections ;
8
8
using System . Collections . Generic ;
9
- using System . Windows ;
10
- using System . Diagnostics . CodeAnalysis ;
11
9
#if SYSTEM_XAML
12
10
using System . Xaml ;
13
11
#else
@@ -1284,10 +1282,6 @@ private void SetCount(int value)
1284
1282
/// </summary>
1285
1283
internal sealed class ArrayItemList < T > : FrugalListBase < T >
1286
1284
{
1287
- public ArrayItemList ( )
1288
- {
1289
- }
1290
-
1291
1285
public ArrayItemList ( int size )
1292
1286
{
1293
1287
// Make size a multiple of GROWTH
@@ -1298,74 +1292,53 @@ public ArrayItemList(int size)
1298
1292
1299
1293
public ArrayItemList ( ICollection collection )
1300
1294
{
1301
- if ( collection != null )
1302
- {
1303
- _count = collection . Count ;
1304
- _entries = new T [ _count ] ;
1305
- collection . CopyTo ( _entries , 0 ) ;
1306
- }
1295
+ Debug . Assert ( collection is not null ) ;
1296
+ _count = collection . Count ;
1297
+ _entries = new T [ _count ] ;
1298
+ collection . CopyTo ( _entries , 0 ) ;
1307
1299
}
1308
1300
1309
1301
public ArrayItemList ( ICollection < T > collection )
1310
1302
{
1311
- if ( collection != null )
1312
- {
1313
- _count = collection . Count ;
1314
- _entries = new T [ _count ] ;
1315
- collection . CopyTo ( _entries , 0 ) ;
1316
- }
1303
+ Debug . Assert ( collection is not null ) ;
1304
+ _count = collection . Count ;
1305
+ _entries = new T [ _count ] ;
1306
+ collection . CopyTo ( _entries , 0 ) ;
1317
1307
}
1318
1308
1319
1309
// Capacity of this store
1320
- public override int Capacity
1321
- {
1322
- get
1323
- {
1324
- if ( _entries != null )
1325
- {
1326
- return _entries . Length ;
1327
- }
1328
- return 0 ;
1329
- }
1330
- }
1310
+ public override int Capacity => _entries . Length ;
1331
1311
1332
1312
public override FrugalListStoreState Add ( T value )
1333
1313
{
1334
1314
// If we don't have any entries or the existing entry is being overwritten,
1335
1315
// then we can use this store. Otherwise we have to promote.
1336
- if ( ( null != _entries ) && ( _count < _entries . Length ) )
1316
+ if ( _count < _entries . Length )
1337
1317
{
1338
1318
_entries [ _count ] = value ;
1339
1319
++ _count ;
1340
1320
}
1341
1321
else
1342
1322
{
1343
- if ( null != _entries )
1344
- {
1345
- int size = _entries . Length ;
1323
+ int size = _entries . Length ;
1346
1324
1347
- // Grow the list slowly while it is small but
1348
- // faster once it reaches the LARGEGROWTH size
1349
- if ( size < LARGEGROWTH )
1350
- {
1351
- size += GROWTH ;
1352
- }
1353
- else
1354
- {
1355
- size += size >> 2 ;
1356
- }
1357
-
1358
- T [ ] destEntries = new T [ size ] ;
1359
-
1360
- // Copy old array
1361
- Array . Copy ( _entries , 0 , destEntries , 0 , _entries . Length ) ;
1362
- _entries = destEntries ;
1325
+ // Grow the list slowly while it is small but
1326
+ // faster once it reaches the LARGEGROWTH size
1327
+ if ( size < LARGEGROWTH )
1328
+ {
1329
+ size += GROWTH ;
1363
1330
}
1364
1331
else
1365
1332
{
1366
- _entries = new T [ MINSIZE ] ;
1333
+ size += size >> 2 ;
1367
1334
}
1368
1335
1336
+ T [ ] destEntries = new T [ size ] ;
1337
+
1338
+ // Copy old array
1339
+ Array . Copy ( _entries , 0 , destEntries , 0 , _entries . Length ) ;
1340
+ _entries = destEntries ;
1341
+
1369
1342
// Insert into new array
1370
1343
_entries [ _count ] = value ;
1371
1344
++ _count ;
@@ -1375,34 +1348,17 @@ public override FrugalListStoreState Add(T value)
1375
1348
1376
1349
public override void Clear ( )
1377
1350
{
1378
- // Wipe out the info.
1379
- for ( int i = 0 ; i < _count ; ++ i )
1380
- {
1381
- _entries [ i ] = default ( T ) ;
1382
- }
1351
+ _entries . AsSpan ( 0 , _count ) . Clear ( ) ;
1383
1352
_count = 0 ;
1384
1353
}
1385
1354
1386
- public override bool Contains ( T value )
1387
- {
1388
- return ( - 1 != IndexOf ( value ) ) ;
1389
- }
1355
+ public override bool Contains ( T value ) => IndexOf ( value ) >= 0 ;
1390
1356
1391
- public override int IndexOf ( T value )
1392
- {
1393
- for ( int index = 0 ; index < _count ; ++ index )
1394
- {
1395
- if ( EqualityComparer < T > . Default . Equals ( _entries [ index ] , value ) )
1396
- {
1397
- return index ;
1398
- }
1399
- }
1400
- return - 1 ;
1401
- }
1357
+ public override int IndexOf ( T value ) => Array . IndexOf ( _entries , value , 0 , _count ) ;
1402
1358
1403
1359
public override void Insert ( int index , T value )
1404
1360
{
1405
- if ( ( null != _entries ) && ( _count < _entries . Length ) )
1361
+ if ( _count < _entries . Length )
1406
1362
{
1407
1363
// Move down the required number of items
1408
1364
Array . Copy ( _entries , index , _entries , index + 1 , _count - index ) ;
@@ -1423,13 +1379,11 @@ public override void SetAt(int index, T value)
1423
1379
1424
1380
public override bool Remove ( T value )
1425
1381
{
1426
- for ( int index = 0 ; index < _count ; ++ index )
1382
+ int index = IndexOf ( value ) ;
1383
+ if ( index >= 0 )
1427
1384
{
1428
- if ( EqualityComparer < T > . Default . Equals ( _entries [ index ] , value ) )
1429
- {
1430
- RemoveAt ( index ) ;
1431
- return true ;
1432
- }
1385
+ RemoveAt ( index ) ;
1386
+ return true ;
1433
1387
}
1434
1388
1435
1389
return false ;
@@ -1543,24 +1497,9 @@ public void Promote(ArrayItemList<T> oldList)
1543
1497
}
1544
1498
}
1545
1499
1546
- public override T [ ] ToArray ( )
1547
- {
1548
- T [ ] array = new T [ _count ] ;
1500
+ public override T [ ] ToArray ( ) => _entries . AsSpan ( 0 , _count ) . ToArray ( ) ;
1549
1501
1550
- for ( int i = 0 ; i < _count ; ++ i )
1551
- {
1552
- array [ i ] = _entries [ i ] ;
1553
- }
1554
- return array ;
1555
- }
1556
-
1557
- public override void CopyTo ( T [ ] array , int index )
1558
- {
1559
- for ( int i = 0 ; i < _count ; ++ i )
1560
- {
1561
- array [ index + i ] = _entries [ i ] ;
1562
- }
1563
- }
1502
+ public override void CopyTo ( T [ ] array , int index ) => _entries . AsSpan ( 0 , _count ) . CopyTo ( array . AsSpan ( index ) ) ;
1564
1503
1565
1504
public override object Clone ( )
1566
1505
{
@@ -2032,14 +1971,15 @@ public FrugalStructList(int size)
2032
1971
2033
1972
public FrugalStructList ( ICollection collection )
2034
1973
{
2035
- if ( collection . Count > 6 )
1974
+ int count = collection . Count ;
1975
+ if ( count > 6 )
2036
1976
{
2037
1977
_listStore = new ArrayItemList < T > ( collection ) ;
2038
1978
}
2039
1979
else
2040
1980
{
2041
1981
_listStore = null ;
2042
- Capacity = collection . Count ;
1982
+ Capacity = count ;
2043
1983
foreach ( T item in collection )
2044
1984
{
2045
1985
Add ( item ) ;
@@ -2049,17 +1989,29 @@ public FrugalStructList(ICollection collection)
2049
1989
2050
1990
public FrugalStructList ( ICollection < T > collection )
2051
1991
{
2052
- if ( collection . Count > 6 )
1992
+ int count = collection . Count ;
1993
+ if ( count > 6 )
2053
1994
{
2054
1995
_listStore = new ArrayItemList < T > ( collection ) ;
2055
1996
}
2056
1997
else
2057
1998
{
2058
1999
_listStore = null ;
2059
- Capacity = collection . Count ;
2060
- foreach ( T item in collection )
2000
+ Capacity = count ;
2001
+
2002
+ if ( collection is IList < T > list )
2061
2003
{
2062
- Add ( item ) ;
2004
+ for ( int i = 0 ; i < count ; i ++ )
2005
+ {
2006
+ Add ( list [ i ] ) ;
2007
+ }
2008
+ }
2009
+ else
2010
+ {
2011
+ foreach ( T item in collection )
2012
+ {
2013
+ Add ( item ) ;
2014
+ }
2063
2015
}
2064
2016
}
2065
2017
}
0 commit comments