예제 #1
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?");
            }
예제 #2
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?");
            }