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);
 }