1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-12 05:14:10 +02:00

Now using raw arrays

This commit is contained in:
Brian Fiete 2019-11-17 09:25:50 -08:00
parent 810c7b843b
commit 00a92dd0a7

View file

@ -23,11 +23,12 @@ namespace System.Collections.Generic
public int_cosize mNext; // Index of next entry, -1 if last public int_cosize mNext; // Index of next entry, -1 if last
} }
private int_cosize[] mBuckets ~ delete _; int_cosize* mBuckets ~ delete _;
private Entry[] mEntries ~ delete _; Entry* mEntries ~ delete _;
private int_cosize mCount; int_cosize mAllocSize;
private int_cosize mFreeList; int_cosize mCount;
private int_cosize mFreeCount; int_cosize mFreeList;
int_cosize mFreeCount;
#if VERSION_DICTIONARY #if VERSION_DICTIONARY
private int32 mVersion; private int32 mVersion;
const String cVersionError = "Dictionary changed during enumeration"; const String cVersionError = "Dictionary changed during enumeration";
@ -204,7 +205,7 @@ namespace System.Collections.Generic
{ {
if (mCount > 0) if (mCount > 0)
{ {
for (int_cosize i = 0; i < mBuckets.Count; i++) mBuckets[i] = -1; for (int_cosize i = 0; i < mAllocSize; i++) mBuckets[i] = -1;
//for (int_cosize i = 0; i < mCount; i++) //for (int_cosize i = 0; i < mCount; i++)
//mEntries[i] = default(Entry); //mEntries[i] = default(Entry);
//Array.Clear(entries, 0, count); //Array.Clear(entries, 0, count);
@ -248,12 +249,13 @@ namespace System.Collections.Generic
return Enumerator(this, Enumerator.KeyValuePair); return Enumerator(this, Enumerator.KeyValuePair);
} }
[DisableObjectAccessChecks]
private int FindEntry(TKey key) private int FindEntry(TKey key)
{ {
if (mBuckets != null) if (mBuckets != null)
{ {
int_cosize hashCode = (int_cosize)key.GetHashCode() & 0x7FFFFFFF; int_cosize hashCode = (int_cosize)key.GetHashCode() & 0x7FFFFFFF;
for (int_cosize i = mBuckets[hashCode % mBuckets.Count]; i >= 0; i = mEntries[i].mNext) for (int_cosize i = mBuckets[hashCode % mAllocSize]; i >= 0; i = mEntries[i].mNext)
{ {
if (mEntries[i].mHashCode == hashCode && (mEntries[i].mKey == key)) return i; if (mEntries[i].mHashCode == hashCode && (mEntries[i].mKey == key)) return i;
} }
@ -261,12 +263,17 @@ namespace System.Collections.Generic
return -1; return -1;
} }
public bool CheckEq(TKey key, TKey key2)
{
return key == key2;
}
private int FindEntryWith<TAltKey>(TAltKey key) where TAltKey : IOpEquals<TKey>, IHashable private int FindEntryWith<TAltKey>(TAltKey key) where TAltKey : IOpEquals<TKey>, IHashable
{ {
if (mBuckets != null) if (mBuckets != null)
{ {
int_cosize hashCode = (int_cosize)key.GetHashCode() & 0x7FFFFFFF; int_cosize hashCode = (int_cosize)key.GetHashCode() & 0x7FFFFFFF;
for (int_cosize i = mBuckets[hashCode % mBuckets.Count]; i >= 0; i = mEntries[i].mNext) for (int_cosize i = mBuckets[hashCode % mAllocSize]; i >= 0; i = mEntries[i].mNext)
{ {
if (mEntries[i].mHashCode == hashCode && (mEntries[i].mKey == key)) return i; if (mEntries[i].mHashCode == hashCode && (mEntries[i].mKey == key)) return i;
} }
@ -277,9 +284,10 @@ namespace System.Collections.Generic
private void Initialize(int capacity) private void Initialize(int capacity)
{ {
int_cosize size = GetPrimeish((int_cosize)capacity); int_cosize size = GetPrimeish((int_cosize)capacity);
mBuckets = new int_cosize[size]; mBuckets = new int_cosize[size]*;
for (int_cosize i < (int_cosize)mBuckets.Count) mBuckets[i] = -1; for (int_cosize i < (int_cosize)size) mBuckets[i] = -1;
mEntries = new Entry[size]; mEntries = new Entry[size]*;
mAllocSize = size;
mFreeList = -1; mFreeList = -1;
} }
@ -287,7 +295,7 @@ namespace System.Collections.Generic
{ {
if (mBuckets == null) Initialize(0); if (mBuckets == null) Initialize(0);
int32 hashCode = (int32)key.GetHashCode() & 0x7FFFFFFF; int32 hashCode = (int32)key.GetHashCode() & 0x7FFFFFFF;
int_cosize targetBucket = hashCode % (int_cosize)mBuckets.Count; int_cosize targetBucket = hashCode % (int_cosize)mAllocSize;
for (int_cosize i = mBuckets[targetBucket]; i >= 0; i = mEntries[i].mNext) for (int_cosize i = mBuckets[targetBucket]; i >= 0; i = mEntries[i].mNext)
{ {
@ -313,10 +321,10 @@ namespace System.Collections.Generic
} }
else else
{ {
if (mCount == mEntries.Count) if (mCount == mAllocSize)
{ {
Resize(); Resize();
targetBucket = hashCode % (int_cosize)mBuckets.Count; targetBucket = hashCode % (int_cosize)mAllocSize;
} }
index = mCount; index = mCount;
mCount++; mCount++;
@ -336,7 +344,7 @@ namespace System.Collections.Generic
{ {
if (mBuckets == null) Initialize(0); if (mBuckets == null) Initialize(0);
int32 hashCode = (int32)key.GetHashCode() & 0x7FFFFFFF; int32 hashCode = (int32)key.GetHashCode() & 0x7FFFFFFF;
int_cosize targetBucket = hashCode % (int_cosize)mBuckets.Count; int_cosize targetBucket = hashCode % (int_cosize)mAllocSize;
for (int_cosize i = mBuckets[targetBucket]; i >= 0; i = mEntries[i].mNext) for (int_cosize i = mBuckets[targetBucket]; i >= 0; i = mEntries[i].mNext)
{ {
@ -360,10 +368,10 @@ namespace System.Collections.Generic
} }
else else
{ {
if (mCount == mEntries.Count) if (mCount == mAllocSize)
{ {
Resize(); Resize();
targetBucket = hashCode % (int_cosize)mBuckets.Count; targetBucket = hashCode % (int_cosize)mAllocSize;
} }
index = mCount; index = mCount;
mCount++; mCount++;
@ -402,11 +410,13 @@ namespace System.Collections.Generic
private void Resize(int newSize, bool forceNewHashCodes) private void Resize(int newSize, bool forceNewHashCodes)
{ {
Contract.Assert(newSize >= mEntries.Count); Contract.Assert(newSize >= mAllocSize);
int_cosize[] newBuckets = new int_cosize[newSize]; int_cosize* newBuckets = new int_cosize[newSize]*;
for (int_cosize i = 0; i < newBuckets.Count; i++) newBuckets[i] = -1; for (int_cosize i = 0; i < newSize; i++) newBuckets[i] = -1;
Entry[] newEntries = new Entry[newSize]; Entry* newEntries = new Entry[newSize]*;
mEntries.CopyTo(newEntries, 0, 0, mCount); //mEntries.CopyTo(newEntries, 0, 0, mCount);
Internal.MemCpy(newEntries, mEntries, mCount * sizeof(Entry), alignof(Entry));
if (forceNewHashCodes) if (forceNewHashCodes)
{ {
for (int_cosize i = 0; i < mCount; i++) for (int_cosize i = 0; i < mCount; i++)
@ -432,6 +442,7 @@ namespace System.Collections.Generic
mBuckets = newBuckets; mBuckets = newBuckets;
mEntries = newEntries; mEntries = newEntries;
mAllocSize = (int_cosize)newSize;
} }
public bool Remove(TKey key) public bool Remove(TKey key)
@ -446,7 +457,7 @@ namespace System.Collections.Generic
{ {
int32 hashCode = (int32)key.GetHashCode() & 0x7FFFFFFF; int32 hashCode = (int32)key.GetHashCode() & 0x7FFFFFFF;
int_cosize bucket = hashCode % (int_cosize)mBuckets.Count; int_cosize bucket = hashCode % (int_cosize)mAllocSize;
int_cosize last = -1; int_cosize last = -1;
for (int_cosize i = mBuckets[bucket]; i >= 0; last = i,i = mEntries[i].mNext) for (int_cosize i = mBuckets[bucket]; i >= 0; last = i,i = mEntries[i].mNext)
{ {
@ -484,7 +495,7 @@ namespace System.Collections.Generic
{ {
int_cosize hashCode = (int_cosize)key.GetHashCode() & 0x7FFFFFFF; int_cosize hashCode = (int_cosize)key.GetHashCode() & 0x7FFFFFFF;
int_cosize bucket = hashCode % (int_cosize)mBuckets.Count; int_cosize bucket = hashCode % (int_cosize)mAllocSize;
int_cosize last = -1; int_cosize last = -1;
for (int_cosize i = mBuckets[bucket]; i >= 0; last = i,i = mEntries[i].mNext) for (int_cosize i = mBuckets[bucket]; i >= 0; last = i,i = mEntries[i].mNext)
{ {