Esempio n. 1
0
 /* ----------------------------------------------------------------- */
 ///
 /// CommonSequence
 ///
 /// <summary>
 /// Initializes a new instance of the CommonSequence class with
 /// the specified arguments.
 /// </summary>
 ///
 /// <param name="older">Start position of the older content.</param>
 /// <param name="newer">Start position of the newer content.</param>
 /// <param name="count">Number of elements.</param>
 /// <param name="next">Next sequence.</param>
 ///
 /* ----------------------------------------------------------------- */
 public CommonSequence(int older, int newer, int count, CommonSequence <T> next)
 {
     OlderStart = older;
     NewerStart = newer;
     Count      = count;
     Next       = next;
 }
        /* ----------------------------------------------------------------- */
        ///
        /// Compare
        ///
        /// <summary>
        /// Compares the sequence.
        /// </summary>
        ///
        /* ----------------------------------------------------------------- */
        private IEnumerable <Result <T> > Compare(Condition mask)
        {
            Debug.Assert(_older != null && _newer != null && _older.Length <= _newer.Length);

            _fp = new Snake[_older.Length + _newer.Length + 3];

            var d = _newer.Length - _older.Length;
            var p = 0;

            do
            {
                for (var k = -p; k < d; ++k)
                {
                    SearchSnake(k);
                }
                for (var k = d + p; k >= d; --k)
                {
                    SearchSnake(k);
                }
                ++p;
            }while (_fp[_newer.Length + 1].Position != _newer.Length + 1);

            var tail = new CommonSequence <T>(_older.Length, _newer.Length, 0, _fp[_newer.Length + 1].Sequence);

            return(tail.Reverse().ToResult(_older, _newer, mask, _swap));
        }