private FastSparseSet(FastSparseSetFactory <E> factory, int[] data, int[] next) { this.factory = factory; this.colValuesInternal = factory.GetInternalValuesCollection(); this.data = data; this.next = next; }
internal FastSparseSet(FastSparseSetFactory <E> factory) { this.factory = factory; this.colValuesInternal = factory.GetInternalValuesCollection(); int length = factory.GetLastBlock() + 1; this.data = new int[length]; this.next = new int[length]; }
public virtual void RemoveAllFields() { FastSparseSetFactory <int> .FastSparseSet <int>[] arr = elements[2]; int[] arrnext = next[2]; for (int i = arr.Length - 1; i >= 0; i--) { FastSparseSetFactory <int> .FastSparseSet <int> val = arr[i]; if (val != null) { arr[i] = null; size__--; } arrnext[i] = 0; } }
public virtual void Intersection(FastSparseSetFactory <E> .FastSparseSet <E> set) { int[] extdata = set.GetData(); int[] intdata = data; int minlength = System.Math.Min(extdata.Length, intdata.Length); for (int i = minlength - 1; i >= 0; i--) { intdata[i] &= extdata[i]; } for (int i = intdata.Length - 1; i >= minlength; i--) { intdata[i] = 0; } SetNext(); }
public SFormsFastMapDirect(SFormsFastMapDirect map) { for (int i = 2; i >= 0; i--) { FastSparseSetFactory <int> .FastSparseSet <int>[] arr = map.elements[i]; int[] arrnext = map.next[i]; int length = arr.Length; FastSparseSetFactory <int> .FastSparseSet <int>[] arrnew = new FastSparseSetFactory <int> .FastSparseSet <int> [length]; int[] arrnextnew = new int[length]; System.Array.Copy(arr, 0, arrnew, 0, length); System.Array.Copy(arrnext, 0, arrnextnew, 0, length); elements[i] = arrnew; next[i] = arrnextnew; size__ = map.Size(); } }
public virtual void PutInternal(int key, FastSparseSetFactory <int> .FastSparseSet <int> value, bool remove) { int index = 0; int ikey = key; if (ikey < 0) { index = 2; ikey = -ikey; } else if (ikey >= VarExprent.Stack_Base) { index = 1; ikey -= VarExprent.Stack_Base; } FastSparseSetFactory <int> .FastSparseSet <int>[] arr = elements[index]; if (ikey >= arr.Length) { if (remove) { elements[index] = null; return; } else { arr = EnsureCapacity(index, ikey + 1, false); } } FastSparseSetFactory <int> .FastSparseSet <int> oldval = arr[ikey]; arr[ikey] = value; int[] arrnext = next[index]; if (oldval == null && value != null) { size__++; ChangeNext(arrnext, ikey, arrnext[ikey], ikey); } else if (oldval != null && value == null) { size__--; ChangeNext(arrnext, ikey, ikey, arrnext[ikey]); } }
public virtual void Complement(FastSparseSetFactory <E> .FastSparseSet <E> set) { int[] extdata = set.GetData(); int[] intdata = data; int extlength = extdata.Length; int pointer = 0; do { if (pointer >= extlength) { break; } intdata[pointer] &= ~extdata[pointer]; if (intdata[pointer] == 0) { ChangeNext(next, pointer, pointer, next[pointer]); } pointer = next[pointer]; }while (pointer != 0); }
public virtual SFormsFastMapDirect GetCopy() { SFormsFastMapDirect map = new SFormsFastMapDirect(false); map.size__ = size__; FastSparseSetFactory <int> .FastSparseSet <int>[][] mapelements = map.elements; int[][] mapnext = map.next; for (int i = 2; i >= 0; i--) { FastSparseSetFactory <int> .FastSparseSet <int>[] arr = elements[i]; int length = arr.Length; if (length > 0) { int[] arrnext = next[i]; FastSparseSetFactory <int> .FastSparseSet <int>[] arrnew = new FastSparseSetFactory <int> .FastSparseSet <int> [length]; int[] arrnextnew = new int[length]; System.Array.Copy(arrnext, 0, arrnextnew, 0, length); mapelements[i] = arrnew; mapnext[i] = arrnextnew; int pointer = 0; do { FastSparseSetFactory <int> .FastSparseSet <int> set = arr[pointer]; if (set != null) { arrnew[pointer] = set.GetCopy(); } pointer = arrnext[pointer]; }while (pointer != 0); } else { mapelements[i] = FastSparseSetFactory <int> .FastSparseSet <int> .Empty_Array; mapnext[i] = InterpreterUtil.Empty_Int_Array; } } return(map); }
public virtual void Union(SFormsFastMapDirect map) { for (int i = 2; i >= 0; i--) { FastSparseSetFactory <int> .FastSparseSet <int>[] lstExtern = map.elements[i]; if (lstExtern.Length == 0) { continue; } FastSparseSetFactory <int> .FastSparseSet <int>[] lstOwn = elements[i]; int[] arrnext = next[i]; int[] arrnextExtern = map.next[i]; int pointer = 0; do { if (pointer >= lstOwn.Length) { lstOwn = EnsureCapacity(i, lstExtern.Length, true); arrnext = next[i]; } FastSparseSetFactory <int> .FastSparseSet <int> second = lstExtern[pointer]; if (second != null) { FastSparseSetFactory <int> .FastSparseSet <int> first = lstOwn[pointer]; if (first == null) { lstOwn[pointer] = second.GetCopy(); size__++; ChangeNext(arrnext, pointer, arrnext[pointer], pointer); } else { first.Union(second); } } pointer = arrnextExtern[pointer]; }while (pointer != 0); } }
public virtual void Union(FastSparseSetFactory <E> .FastSparseSet <E> set) { int[] extdata = set.GetData(); int[] extnext = set.GetNext(); int[] intdata = data; int intlength = intdata.Length; int pointer = 0; do { if (pointer >= intlength) { intdata = EnsureCapacity(extdata.Length - 1); } bool nextrec = (intdata[pointer] == 0); intdata[pointer] |= extdata[pointer]; if (nextrec) { ChangeNext(next, pointer, next[pointer], pointer); } pointer = extnext[pointer]; }while (pointer != 0); }
public virtual void Intersection(SFormsFastMapDirect map) { for (int i = 2; i >= 0; i--) { FastSparseSetFactory <int> .FastSparseSet <int>[] lstOwn = elements[i]; if (lstOwn.Length == 0) { continue; } FastSparseSetFactory <int> .FastSparseSet <int>[] lstExtern = map.elements[i]; int[] arrnext = next[i]; int pointer = 0; do { FastSparseSetFactory <int> .FastSparseSet <int> first = lstOwn[pointer]; if (first != null) { FastSparseSetFactory <int> .FastSparseSet <int> second = null; if (pointer < lstExtern.Length) { second = lstExtern[pointer]; } if (second != null) { first.Intersection(second); } if (second == null || first.IsEmpty()) { lstOwn[pointer] = null; size__--; ChangeNext(arrnext, pointer, pointer, arrnext[pointer]); } } pointer = arrnext[pointer]; }while (pointer != 0); } }
private FastSparseSetFactory <int> .FastSparseSet <int>[] EnsureCapacity(int index, int size , bool exact) { FastSparseSetFactory <int> .FastSparseSet <int>[] arr = elements[index]; int[] arrnext = next[index]; int minsize = size; if (!exact) { minsize = 2 * arr.Length / 3 + 1; if (size > minsize) { minsize = size; } } FastSparseSetFactory <int> .FastSparseSet <int>[] arrnew = new FastSparseSetFactory <int> .FastSparseSet <int> [minsize]; System.Array.Copy(arr, 0, arrnew, 0, arr.Length); int[] arrnextnew = new int[minsize]; System.Array.Copy(arrnext, 0, arrnextnew, 0, arrnext.Length); elements[index] = arrnew; next[index] = arrnextnew; return(arrnew); }
public virtual void Put(int key, FastSparseSetFactory <int> .FastSparseSet <int> value) { PutInternal(key, value, false); }