Beispiel #1
0
 public static ArrayIterator <T> Merge <T>(
     this ArrayIterator <T> first1,
     ArrayIterator <T> last1,
     ArrayIterator <T> first2,
     ArrayIterator <T> last2,
     ArrayIterator <T> result,
     Func <T, T, bool> comp
     )
 {
     while (true)
     {
         if (first1.IsEqual(last1))
         {
             return(first2.Copy(last2, result));
         }
         if (first2.IsEqual(last2))
         {
             return(first1.Copy(last1, result));
         }
         if (comp(first2.GetCurrent(), first1.GetCurrent()))
         {
             result.SetCurrent(first2.GetCurrent());
             first2 = first2.GetNext();
         }
         else
         {
             result.SetCurrent(first1.GetCurrent());
             first1 = first1.GetNext();
         }
         result = result.GetNext();
     }
 }
Beispiel #2
0
        public static ArrayIterator <T> UniqueCopy <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            ArrayIterator <T> result,
            Func <T, T, bool> pred
            )
        {
            if (first.IsEqual(last))
            {
                return(last);
            }

            result.SetCurrent(first.GetCurrent());
            while ((first = first.GetNext()).NotEqual(last))
            {
                var val = first.GetCurrent();
                if (pred(result.GetCurrent(), val) == false)
                {
                    result = result.GetNext();
                    result.SetCurrent(val);
                }
            }
            result = result.GetNext();
            return(result);
        }
Beispiel #3
0
 public static void PartitionCopy <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> resultTrue,
     ArrayIterator <T> resultFalse,
     Func <T, bool> pred,
     out ArrayIterator <T> outResultTrue,
     out ArrayIterator <T> outResultFalse
     )
 {
     while (first.NotEqual(last))
     {
         if (pred(first.GetCurrent()))
         {
             resultTrue.SetCurrent(first.GetCurrent());
             resultTrue = resultTrue.GetNext();
         }
         else
         {
             resultFalse.SetCurrent(first.GetCurrent());
             resultFalse = resultFalse.GetNext();
         }
         first = first.GetNext();
     }
     outResultTrue  = resultTrue;
     outResultFalse = resultFalse;
 }
Beispiel #4
0
        public static void Swap <T>(this ArrayIterator <T> a, ArrayIterator <T> b)
        {
            var temp = a.GetCurrent();

            a.SetCurrent(b.GetCurrent());
            b.SetCurrent(temp);
        }
Beispiel #5
0
 public static ArrayIterator <T> SetDifference <T>(
     this ArrayIterator <T> first1,
     ArrayIterator <T> last1,
     ArrayIterator <T> first2,
     ArrayIterator <T> last2,
     ArrayIterator <T> result,
     Func <T, T, bool> comp
     )
 {
     while (first1.NotEqual(last1) && first2.NotEqual(last2))
     {
         if (comp(first1.GetCurrent(), first2.GetCurrent()))
         {
             result.SetCurrent(first1.GetCurrent());
             result = result.GetNext();
             first1 = first1.GetNext();
         }
         else if (comp(first2.GetCurrent(), first1.GetCurrent()))
         {
             first2 = first2.GetNext();
         }
         else
         {
             first1 = first1.GetNext();
             first2 = first2.GetNext();
         }
     }
     return(first1.Copy(last1, result));
 }
Beispiel #6
0
        public static void PushHeap <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            Func <T, T, bool> comp
            )
        {
            if (first.Distance(last) < 2)
            {
                return;
            }
            last = last.GetPrev();
            var temp   = last.GetCurrent();
            var parent = first.GetAdvanced((first.Distance(last) - 1) / 2);

            while (first.Distance(last) > 0 && comp(parent.GetCurrent(), temp))
            {
                last.SetCurrent(parent.GetCurrent());
                last   = parent;
                parent = first.GetAdvanced((first.Distance(last) - 1) / 2);
            }
            last.SetCurrent(temp);
        }
Beispiel #7
0
 public static ArrayIterator <T> ReverseCopy <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> result
     )
 {
     while (first.NotEqual(last))
     {
         last = last.GetPrev();
         result.SetCurrent(last.GetCurrent());
         result = result.GetNext();
     }
     return(result);
 }
Beispiel #8
0
 public static ArrayIterator <T> CopyBackward <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> result
     )
 {
     while (last.NotEqual(first))
     {
         result = result.GetPrev();
         last   = last.GetPrev();
         result.SetCurrent(last.GetCurrent());
     }
     return(result);
 }
Beispiel #9
0
 public static ArrayIterator <T> Transform <T>(
     this ArrayIterator <T> first1,
     ArrayIterator <T> last1,
     ArrayIterator <T> result,
     Func <T, T> op
     )
 {
     while (first1.NotEqual(last1))
     {
         result.SetCurrent(op(first1.GetCurrent()));
         result = result.GetNext();
         first1 = first1.GetNext();
     }
     return(result);
 }
Beispiel #10
0
 public static ArrayIterator <T> CopyN <T>(
     this ArrayIterator <T> first,
     int n,
     ArrayIterator <T> result
     )
 {
     while (n > 0)
     {
         result.SetCurrent(first.GetCurrent());
         result = result.GetNext();
         first  = first.GetNext();
         n--;
     }
     return(result);
 }
Beispiel #11
0
 public static ArrayIterator <T> ReplaceCopyIf <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> result,
     Func <T, bool> pred,
     T newValue
     )
 {
     while (first.NotEqual(last))
     {
         result.SetCurrent(pred(first.GetCurrent()) ? newValue : first.GetCurrent());
         first  = first.GetNext();
         result = result.GetNext();
     }
     return(result);
 }
Beispiel #12
0
 public static void ReplaceIf <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     Func <T, bool> pred,
     T newValue
     )
 {
     while (first.NotEqual(last))
     {
         if (pred(first.GetCurrent()))
         {
             first.SetCurrent(newValue);
         }
         first = first.GetNext();
     }
 }
Beispiel #13
0
 public static ArrayIterator <T> CopyIf <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> result,
     Func <T, bool> pred
     )
 {
     while (first.NotEqual(last))
     {
         if (pred(first.GetCurrent()))
         {
             result.SetCurrent(first.GetCurrent());
             result = result.GetNext();
         }
         first = first.GetNext();
     }
     return(result);
 }