Esempio n. 1
0
        public void AddCluster()
        {
            HCluster NewCluster = new HCluster(this.size);

            size = (int)(size * factor);

            NewCluster.next   = this.FirstCluster;              //New cluster is added in the beginning
            this.FirstCluster = NewCluster;

            HPosition pos = new HPosition(ref FirstCluster.next, 0);

            while (!(pos.cluster == FirstCluster && pos.offset == 0))      //rehash
            {
                if (Used(pos.cluster.Cluster[pos.offset]))
                {
                    HEntry    entry       = pos.cluster.Cluster[pos.offset];
                    HPosition newPosition = GenerateKey(entry.var, entry.low, entry.high);

                    if (newPosition.offset != pos.offset || newPosition.cluster != pos.cluster)
                    {
                        pos.cluster.Cluster[pos.offset] = HEntry.DirtyEntry();
                        this.count--;
                        Add(entry);
                    }
                }

                IncreaseKey(ref pos);
            }
        }
Esempio n. 2
0
        public System.Collections.IEnumerator GetEnumerator()
        {
            HPosition pos = new HPosition(ref FirstCluster, 0);

            while (!pos.IsLastPosition())
            {
                if (Used(pos.cluster.Cluster[pos.offset]))
                {
                    yield return(pos.cluster.Cluster[pos.offset]);
                }
                IncreaseKey(ref pos);
            }
        }
Esempio n. 3
0
        public bool ContainsKey(int var, int low, int high)
        {
            HPosition pos = GenerateKey(var, low, high);

            while (!Null(pos.cluster.Cluster[pos.offset]))
            {
                if (pos.cluster.Cluster[pos.offset].low == low && pos.cluster.Cluster[pos.offset].high == high && pos.cluster.Cluster[pos.offset].var == var)
                {
                    return(true);
                }
                IncreaseKey(ref pos);
            }
            return(false);
        }
Esempio n. 4
0
        public void Remove(int var, int low, int high)
        {
            HPosition pos = GenerateKey(var, low, high);

            while (!Null(pos.cluster.Cluster[pos.offset]))
            {
                if (pos.cluster.Cluster[pos.offset].var == var && pos.cluster.Cluster[pos.offset].low == low && pos.cluster.Cluster[pos.offset].high == high)
                {
                    count--;
                    pos.cluster.Cluster[pos.offset] = HEntry.DirtyEntry();     //Only flags dirty
                    return;
                }
                IncreaseKey(ref pos);
            }
        }
Esempio n. 5
0
        public void Add(HEntry entry)
        {
#if NoGC
            if (NeedResize())
            {
                AddCluster();
            }
#endif
            HPosition pos = GenerateKey(entry.var, entry.low, entry.high);
            while (Used(pos.cluster.Cluster[pos.offset]))
            {
                IncreaseKey(ref pos);
            }
            pos.cluster.Cluster[pos.offset] = entry;
            count++;
        }
Esempio n. 6
0
 internal void IncreaseKey(ref HPosition position)
 {
     position.offset++;
     if (position.cluster.Cluster.Length == position.offset) //treat array as a cycle
     {
         position.offset = 0;
         if (position.cluster.IsLastCluster())
         {
             position.cluster = this.FirstCluster;
         }
         else
         {
             position.cluster = position.cluster.next;
         }
     }
 }
Esempio n. 7
0
        public int this[int var, int low, int high]
        {
            get
            {
                HPosition pos = GenerateKey(var, low, high);

                while (!Null(pos.cluster.Cluster[pos.offset]))
                {
                    if (pos.cluster.Cluster[pos.offset].low == low && pos.cluster.Cluster[pos.offset].high == high && pos.cluster.Cluster[pos.offset].var == var)
                    {
                        return(pos.cluster.Cluster[pos.offset].u);
                    }

                    IncreaseKey(ref pos);
                }

                return(0);
            }
        }