com.github.difflib.algorithm.myers.PathNode Maven / Gradle / Ivy
/*
* Copyright 2009-2017 java-diff-utils.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.difflib.algorithm.myers;
/**
* A node in a diffpath.
*
* @author Juanco Anez
*/
public final class PathNode {
/**
* Position in the original sequence.
*/
public final int i;
/**
* Position in the revised sequence.
*/
public final int j;
/**
* The previous node in the path.
*/
public final PathNode prev;
public final boolean snake;
public final boolean bootstrap;
/**
* Concatenates a new path node with an existing diffpath.
*
* @param i The position in the original sequence for the new node.
* @param j The position in the revised sequence for the new node.
* @param prev The previous node in the path.
*/
public PathNode(int i, int j, boolean snake, boolean bootstrap, PathNode prev) {
this.i = i;
this.j = j;
this.bootstrap = bootstrap;
if (snake) {
this.prev = prev;
} else {
this.prev = prev == null ? null : prev.previousSnake();
}
this.snake = snake;
}
public boolean isSnake() {
return snake;
}
/**
* Is this a bootstrap node?
*
* In bottstrap nodes one of the two corrdinates is less than zero.
*
* @return tru if this is a bootstrap node.
*/
public boolean isBootstrap() {
return bootstrap;
}
/**
* Skips sequences of {@link PathNode PathNodes} until a snake or bootstrap node is found, or the end of the
* path is reached.
*
* @return The next first {@link PathNode} or bootstrap node in the path, or null
if none found.
*/
public final PathNode previousSnake() {
if (isBootstrap()) {
return null;
}
if (!isSnake() && prev != null) {
return prev.previousSnake();
}
return this;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
StringBuilder buf = new StringBuilder("[");
PathNode node = this;
while (node != null) {
buf.append("(");
buf.append(node.i);
buf.append(",");
buf.append(node.j);
buf.append(")");
node = node.prev;
}
buf.append("]");
return buf.toString();
}
}