Exemplo n.º 1
0
        private void PasteNodeRange(k_NodeIterator ak_Where, k_Node ak_First, k_Node ak_Last)
        {
            if (ak_Where != this.End)
            {
                k_Node lk_Next = ak_Where.Node;
                k_Node lk_Prev = lk_Next.mk_Prev;

                ak_Last.mk_Next  = lk_Next;
                ak_First.mk_Prev = lk_Prev;
                if (lk_Next != null)
                {
                    lk_Next.mk_Prev = ak_Last;
                }
                if (lk_Prev != null)
                {
                    lk_Prev.mk_Next = ak_First;
                }
            }
            else
            {
                if (mk_Tail != null)
                {
                    mk_Tail.mk_Next  = ak_First;
                    ak_First.mk_Prev = mk_Tail;
                }
                mk_Tail = ak_Last;
            }

            if (ak_Where == this.Begin)
            {
                mk_Head  = ak_First;
                mk_Begin = null;        // recalc on next get
            }
        }
Exemplo n.º 2
0
        void IList.Remove(object ak_Value)
        {
            k_NodeIterator lk_Found = (k_NodeIterator)this.Find(ak_Value);

            if (lk_Found != this.End)
            {
                Erase(lk_Found);
            }
        }
Exemplo n.º 3
0
            public override bool Equals(object ak_Obj)
            {
                k_NodeIterator lk_Iter = ak_Obj as k_NodeIterator;

                if (lk_Iter == null)
                {
                    return(false);
                }
                return(object.ReferenceEquals(mk_Current, lk_Iter.mk_Current));
            }
Exemplo n.º 4
0
        // IMap Members
        public k_Iterator FindKey(object ak_Key)
        {
            k_NodeIterator lk_Found = (k_NodeIterator)LowerBound(ak_Key);

            if (lk_Found != this.End && mk_Comparer.Compare(ak_Key, lk_Found.Node.Key) == 0)
            {
                return(lk_Found);
            }
            return(this.End);
        }
Exemplo n.º 5
0
            public override int Distance(k_Iterator ak_Iter)
            {
                k_NodeIterator lk_Iter = ak_Iter as k_NodeIterator;

                if (lk_Iter == null || !object.ReferenceEquals(lk_Iter.Collection, this.Collection))
                {
                    throw new ArgumentException("Cannot determine distance of iterators belonging to different collections.");
                }

                k_Iterator lk_End = mk_Tree.End;

                int li_KeyDiff;

                if (this == lk_End || ak_Iter == lk_End)
                {
                    li_KeyDiff = (this == lk_End && this != ak_Iter) ? 1 : 0;
                }
                else
                {
                    li_KeyDiff = mk_Tree.mk_Comparer.Compare(mk_Current.Key, lk_Iter.mk_Current.Key);
                }

                if (li_KeyDiff <= 0)
                {
                    int        li_Diff = 0;
                    k_Iterator lk_Bck  = this.Clone();
                    for (; lk_Bck != ak_Iter && lk_Bck != lk_End; lk_Bck.Next())
                    {
                        --li_Diff;
                    }

                    if (lk_Bck == ak_Iter)
                    {
                        return(li_Diff);
                    }
                }

                if (li_KeyDiff >= 0)
                {
                    int        li_Diff = 0;
                    k_Iterator lk_Fwd  = ak_Iter.Clone();
                    for (; lk_Fwd != this && lk_Fwd != lk_End; lk_Fwd.Next())
                    {
                        ++li_Diff;
                    }

                    if (lk_Fwd == this)
                    {
                        return(li_Diff);
                    }
                }

                throw new Exception("Inconsistent state. Concurrency?");
            }
Exemplo n.º 6
0
        public k_Iterator Find(object ak_Value)
        {
            DictionaryEntry lr_Item  = (DictionaryEntry)ak_Value;
            k_NodeIterator  lk_Found = (k_NodeIterator)LowerBound(lr_Item.Key);

            if (lk_Found != this.End &&
                mk_Comparer.Compare(lr_Item.Key, lk_Found.Node.Key) == 0 && mk_Comparer.Compare(lr_Item.Value, lk_Found.Node.Value) == 0)
            {
                return(lk_Found);
            }
            return(this.End);
        }
Exemplo n.º 7
0
            public override int Distance(k_Iterator ak_Iter)
            {
                k_NodeIterator lk_Iter = (k_NodeIterator)ak_Iter;
                k_Iterator     lk_End  = mk_List.End;

                int li_KeyDiff;

                if (this == lk_End || ak_Iter == lk_End)
                {
                    li_KeyDiff = (this == lk_End && this != ak_Iter) ? 1 : 0;
                }
                else
                {
                    li_KeyDiff = mk_List.mk_Comparer.Compare(mk_Current.Key, lk_Iter.mk_Current.Key);
                }

                if (li_KeyDiff <= 0)
                {
                    int        li_Diff = 0;
                    k_Iterator lk_Bck  = this.Clone();
                    for (; lk_Bck != lk_Iter && lk_Bck != lk_End; lk_Bck.Next())
                    {
                        --li_Diff;
                    }

                    if (lk_Bck == lk_Iter)
                    {
                        return(li_Diff);
                    }
                }

                if (li_KeyDiff >= 0)
                {
                    int        li_Diff = 0;
                    k_Iterator lk_Fwd  = lk_Iter.Clone();
                    for (; lk_Fwd != this && lk_Fwd != lk_End; lk_Fwd.Next())
                    {
                        ++li_Diff;
                    }

                    if (lk_Fwd == this)
                    {
                        return(li_Diff);
                    }
                }

                throw new Exception("Inconsistent state. Concurrency?");
            }
Exemplo n.º 8
0
 public object this[object ak_Key]
 {
     get
     {
         k_NodeIterator lk_Iter = (k_NodeIterator)FindKey(ak_Key);
         if (lk_Iter == this.End)
         {
             return(null);
         }
         return(lk_Iter.Node.Value);
     }
     set
     {
         k_NodeIterator lk_Iter = (k_NodeIterator)FindKey(ak_Key);
         if (lk_Iter == this.End)
         {
             throw new ArgumentException("No element for key was found.", "ak_Key");
         }
         lk_Iter.Node.Value = value;
     }
 }
Exemplo n.º 9
0
            public override int Distance(k_Iterator ak_Iter)
            {
                k_NodeIterator lk_Iter = (k_NodeIterator)ak_Iter;

                if (!this.IsValid || !lk_Iter.IsValid)
                {
                    throw new ArgumentException("Iterator is invalid.");
                }

                int        li_Diff = 0;
                k_Iterator lk_End  = mk_List.End;
                k_Iterator lk_Fwd  = lk_Iter.Clone();

                for (; lk_Fwd != this && lk_Fwd != lk_End; lk_Fwd.Next())
                {
                    ++li_Diff;
                }

                if (lk_Fwd == this)
                {
                    return(li_Diff);
                }

                li_Diff = 0;
                k_Iterator lk_Bck = this.Clone();

                for (; lk_Bck != lk_Iter && lk_Bck != lk_End; lk_Bck.Next())
                {
                    --li_Diff;
                }

                if (lk_Bck == lk_Iter)
                {
                    return(li_Diff);
                }

                throw new Exception("Inconsistent state. Concurrency?");
            }
Exemplo n.º 10
0
        private void PasteNodeRange(k_NodeIterator ak_Where, k_Node ak_First, k_Node ak_Last)
        {
            if (ak_Where != this.End)
            {
                k_Node lk_Next = ak_Where.Node;
                k_Node lk_Prev = lk_Next.mk_Prev;

                ak_Last.mk_Next = lk_Next;
                ak_First.mk_Prev = lk_Prev;
                if (lk_Next != null)
                    lk_Next.mk_Prev = ak_Last;
                if (lk_Prev != null)
                    lk_Prev.mk_Next = ak_First;
            }
            else
            {
                if (mk_Tail != null)
                {
                    mk_Tail.mk_Next = ak_First;
                    ak_First.mk_Prev = mk_Tail;
                }
                mk_Tail = ak_Last;
            }

            if (ak_Where == this.Begin)
            {
                mk_Head = ak_First;
                mk_Begin = null;        // recalc on next get
            }
        }