/* ----------------------------------------------------------------- */ /// /// CommonSequence /// /// <summary> /// オブジェクトを初期化します。 /// </summary> /// /* ----------------------------------------------------------------- */ public CommonSequence(int older, int newer, int count, CommonSequence <T> next) { OlderStart = older; NewerStart = newer; Count = count; Next = next; }
/* ----------------------------------------------------------------- */ /// /// Compare /// /// <summary> /// 差分を検出します。 /// </summary> /// /// <remarks> /// このメソッド実行時には対象となるデータが設定されている /// 必要があります。 /// </remarks> /// /* ----------------------------------------------------------------- */ 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)); }
/* ----------------------------------------------------------------- */ /// /// Reverse /// /// <summary> /// リンクリストを反転させます。 /// </summary> /// /* ----------------------------------------------------------------- */ public CommonSequence <T> Reverse() { CommonSequence <T> top = null; CommonSequence <T> current = this; while (current != null) { var next = current.Next; current.Next = top; top = current; current = next; } return(top); }