Пример #1
0
 public static void Copy(string src, Tape dest)
 {
     using (StreamReader reader = new StreamReader(src))
     {
         string line;
         while ((line = reader.ReadLine()) != null)
         {
             dest.Append(line);
         }
     }
 }
Пример #2
0
        public static void Merge(Tape dest, CyclicList<Tape> tapes)
        {
            //Log.WriteMergeMessage("Merge start");
            //Log.WriteMergeMessage("A: " + tapes[0].ShowFile(), 5);
            //Log.WriteMergeMessage("B: " + tapes[1].ShowFile(), 5);
            dest.Clean();
            tapes.Prepare();

            double a1 = (double)tapes.Current.GetNextValue();

            double b1 = -1;

            while (!tapes.Current.IsFinished)
            {
                double? nextValue = tapes.Next.GetNextValue();
                double b2;
                if (nextValue != null)
                    b2 = (double)nextValue;
                else
                    break; // przepisz resztę taśmy
                if (b2 >= b1) // czy ciągle na tym samym run-ie
                {
                    if (b2 <= a1)
                    {
                        b1 = b2;
                        dest.Append(b1);
                    }
                    else
                    {
                        dest.Append(a1);
                        tapes.MoveNext();
                        b1 = a1;
                        a1 = b2;
                    }
                }
                else // przepisz resztę run-a
                {
                    b1 = b2;
                    double a2 = a1;
                    var value = tapes.Current.GetNextValue();
                    if (value != null) a1 = (double)value;
                    else
                    {
                        dest.Append(a2);
                        tapes.MoveNext();
                        break;
                    }
                    while (a1 >= a2)
                    {
                        dest.Append(a2);
                        a2 = a1;
                        double? d = tapes.Current.GetNextValue();
                        if (d != null) a1 = (double)d;
                        else
                            break;
                    }

                    dest.Append(a2);
                    tapes.Next.StepBack();
                }
            }
            double? v;
            //dest.Append(a1);
            tapes.Current.StepBack();
            while ((v = tapes.Current.GetNextValue()) != null)
            {
                dest.Append((double)v);
            }
            //Log.WriteMergeMessage("Result:", 5);
            Log.WriteMergeMessage("C: " + dest.ShowFile());
            //Log.WriteMergeMessage("Merge end");
        }