CPF/CPF.ReoGrid/Data/Index4DArray.cs
2024-06-24 10:15:59 +08:00

268 lines
4.3 KiB
C#

using System;
namespace CPF.ReoGrid.Data
{
[Serializable]
public sealed class Index4DArray<T>
{
public Index4DArray()
{
this.rows = new T[4096][][][];
}
public int MaxRow
{
get
{
return this.maxRow;
}
set
{
this.maxRow = value;
}
}
public int MaxCol
{
get
{
return this.maxCol;
}
set
{
this.maxCol = value;
}
}
public int RowCapacity
{
get
{
return 1048576;
}
}
public int ColCapacity
{
get
{
return 32768;
}
}
public T this[int row, int col]
{
get
{
int num = row >> 12;
T[][][] array = this.rows[num];
bool flag = array == null;
T result;
if (flag)
{
result = default(T);
}
else
{
int num2 = col >> 8;
T[][] array2 = array[num2];
bool flag2 = array2 == null;
if (flag2)
{
result = default(T);
}
else
{
int num3 = row & 4095;
T[] array3 = array2[num3];
bool flag3 = array3 == null;
if (flag3)
{
result = default(T);
}
else
{
int num4 = col & 255;
result = array3[num4];
}
}
}
return result;
}
set
{
int num = row >> 12;
T[][][] array = this.rows[num];
bool flag = array == null;
if (flag)
{
array = new T[256][][];
this.rows[num] = array;
}
int num2 = col >> 8;
T[][] array2 = array[num2];
bool flag2 = array2 == null;
if (flag2)
{
array2 = new T[4096][];
array[num2] = array2;
}
int num3 = row & 4095;
T[] array3 = array2[num3];
bool flag3 = array3 == null;
if (flag3)
{
array3 = new T[256];
array2[num3] = array3;
}
int num4 = col & 255;
array3[num4] = value;
bool flag4 = value != null;
if (flag4)
{
bool flag5 = this.maxRow < row;
if (flag5)
{
this.maxRow = row;
}
bool flag6 = this.maxCol < col;
if (flag6)
{
this.maxCol = col;
}
}
}
}
public void Iterate(Func<int, int, T, int> iterator)
{
this.Iterate(0, 0, this.maxRow + 1, this.maxCol + 1, true, iterator);
}
public void Iterate(int row, int col, int rows, int cols, bool ignoreNull, Func<int, int, T, int> iterator)
{
int num = row + rows;
int num2 = col + cols;
for (int i = row; i < num; i++)
{
int num3 = i >> 12;
T[][][] array = this.rows[num3];
bool flag = array == null;
if (flag)
{
bool flag2 = !ignoreNull;
if (flag2)
{
T arg = default(T);
int num4;
for (int j = col; j < num2; j += num4)
{
num4 = iterator(i, j, arg);
bool flag3 = num4 < 1;
if (flag3)
{
return;
}
}
}
}
else
{
int k = col;
while (k < num2)
{
int num5 = k >> 8;
T[][] array2 = array[num5];
bool flag4 = array2 == null;
if (flag4)
{
if (ignoreNull)
{
k++;
}
else
{
int num6 = iterator(i, k, default(T));
bool flag5 = num6 < 1;
if (flag5)
{
return;
}
k += num6;
}
}
else
{
int num7 = i % 4096;
T[] array3 = array2[num7];
bool flag6 = array3 == null;
if (flag6)
{
if (ignoreNull)
{
k++;
}
else
{
int num8 = iterator(i, k, default(T));
bool flag7 = num8 < 1;
if (flag7)
{
return;
}
k += num8;
}
}
else
{
int num9 = k % 256;
T t = array3[num9];
bool flag8 = t == null && ignoreNull;
if (flag8)
{
k++;
}
else
{
int num10 = iterator(i, k, t);
bool flag9 = num10 < 1;
if (flag9)
{
return;
}
k += num10;
}
}
}
}
}
}
}
internal void Reset()
{
this.rows = new T[4096][][][];
this.maxCol = -1;
this.maxRow = -1;
}
public const int RowSize = 4096;
public const int RowSizeBits = 12;
public const int RowSizeModBits = 4095;
public const int ColSize = 256;
public const int ColSizeBits = 8;
public const int ColSizeModBits = 255;
private T[][][][] rows;
private int maxRow = -1;
private int maxCol = -1;
}
}