268 lines
4.3 KiB
C#
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;
|
|||
|
}
|
|||
|
}
|