using System; namespace CPF.ReoGrid.Data { [Serializable] public sealed class Index4DArray { 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 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 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; } }