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