/* ----------------------------------------------------------------- */ /// /// 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)); }