Esempio n. 1
0
        static bool Contains31(List <TernaryTable.Tuple> tuples, uint field3, uint field1)
        {
            int low  = 0;
            int high = tuples.Count - 1;

            while (low <= high)
            {
                int mid = (int)(((long)low + (long)high) / 2);
                TernaryTable.Tuple tuple = tuples[mid];
                if (tuple.field3 > field3)
                {
                    high = mid - 1;
                }
                else if (tuple.field3 < field3)
                {
                    low = mid + 1;
                }
                else if (tuple.field1OrNext > field1)
                {
                    high = mid - 1;
                }
                else if (tuple.field1OrNext < field1)
                {
                    low = mid + 1;
                }
                else
                {
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 2
0
        public void Apply()
        {
            for (int i = 0; i < deleteList.Count; i++)
            {
                var tuple = deleteList[i];
                if (table.Contains(tuple.field1OrNext, tuple.field2OrEmptyMarker, tuple.field3))
                {
                    table.Delete(tuple.field1OrNext, tuple.field2OrEmptyMarker, tuple.field3);
                }
                else
                {
                    deleteList[i] = new TernaryTable.Tuple(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
                }
            }

            var it = insertList.GetEnumerator();

            while (it.MoveNext())
            {
                var curr = it.Current;
                if (!table.Contains(curr.field1OrNext, curr.field2OrEmptyMarker, curr.field3))
                {
                    table.Insert(curr.field1OrNext, curr.field2OrEmptyMarker, curr.field3);
                    table.store1.AddRef(curr.field1OrNext);
                    table.store2.AddRef(curr.field2OrEmptyMarker);
                    table.store3.AddRef(curr.field3);
                }
            }
        }
Esempio n. 3
0
        public bool CheckUpdates_12_23_31()
        {
            if (!CheckUpdates_12_23())
            {
                return(false);
            }

            deleteList.Sort(compare312);
            insertList.Sort(compare312);

            int count = insertList.Count;

            if (count == 0)
            {
                return(true);
            }

            TernaryTable.Tuple prev = insertList[0];
            if (!Contains31(deleteList, prev.field3, prev.field1OrNext))
            {
                if (table.Contains13(prev.field1OrNext, prev.field3))
                {
                    return(false);
                }
            }

            for (int i = 1; i < count; i++)
            {
                TernaryTable.Tuple curr = insertList[i];
                if (curr.field3 == prev.field3 &
                    curr.field1OrNext == prev.field1OrNext &
                    curr.field2OrEmptyMarker != prev.field2OrEmptyMarker
                    )
                {
                    return(false);
                }
                if (!Contains31(deleteList, curr.field3, curr.field1OrNext))
                {
                    if (table.Contains13(curr.field1OrNext, curr.field3))
                    {
                        return(false);
                    }
                }
                prev = curr;
            }

            return(true);
        }
Esempio n. 4
0
        public bool CheckUpdates_12()
        {
            deleteList.Sort(compare123);
            insertList.Sort(compare123);

            int count = insertList.Count;

            if (count == 0)
            {
                return(true);
            }

            TernaryTable.Tuple prev = insertList[0];
            if (!Contains12(deleteList, prev.field1OrNext, prev.field2OrEmptyMarker))
            {
                if (table.Contains12(prev.field1OrNext, prev.field2OrEmptyMarker))
                {
                    return(false);
                }
            }

            for (int i = 1; i < count; i++)
            {
                TernaryTable.Tuple curr = insertList[i];
                if (curr.field1OrNext == prev.field1OrNext &
                    curr.field2OrEmptyMarker == prev.field2OrEmptyMarker &
                    curr.field3 != prev.field3
                    )
                {
                    return(false);
                }
                if (!Contains12(deleteList, curr.field1OrNext, curr.field2OrEmptyMarker))
                {
                    if (table.Contains12(curr.field1OrNext, curr.field2OrEmptyMarker))
                    {
                        return(false);
                    }
                }
                prev = curr;
            }

            return(true);
        }