package utils.nexus; import java.util.ArrayList; import org.apache.log4j.Logger; public class Range implements Comparable<Range>{ private static final Logger logger = Logger.getLogger(Range.class); public int start; public int end; public int startVal; public int step; public Range(int start, int end, int startVal, int step) { this.start = start; this.end = end; this.startVal = startVal; this.step = step; } public Range(int start, int end, int startVal) { this(start, end, startVal, 1); // default every pos } /* public boolean contains(int pos) { if(pos >= start && pos <= end){ return true; } else{ return false; } } */ public boolean contains(int testPos, int testStart, int testStep){ if(testPos >= start && testPos <= end){ if(step == 1 || testStep == 1){ return true; } if(step == testStep){ if(start % step == testStart % testStep){ return true; } } } return false; } public boolean contains(int testPos, Range testRange){ return contains(testPos, testRange.start, testRange.step); } public boolean contains(int testPos){ return contains(testPos, 0, 1); } public boolean containsRange(Range compare) { if(this.contains(compare.start, compare) && this.contains(compare.end, compare)){ return true; } return false; } public boolean intersects(Range compare) { // logger.info("intersect compare.start" + compare.start + " this.start" + this.start); // logger.info("intersect compare.end" + compare.end + " this.end" + this.end); if(this.contains(compare.start, compare) || this.contains(compare.end, compare) || compare.contains(this.start, this) || compare.contains(this.end, this)){ logger.info("intersects true"); return true; } // logger.info("intersects false"); return false; } public boolean partlyWithin(Range compare) { // logger.info("intersect compare.start" + compare.start + " this.start" + this.start); // logger.info("intersect compare.end" + compare.end + " this.end" + this.end); if(this.contains(compare.start, compare) || this.contains(compare.end, compare) || compare.contains(this.start, this) || compare.contains(this.end, this)){ logger.info("intersects true"); return true; } // logger.info("intersects false"); return false; } public boolean within(Range compare) { if(compare.contains(start, this) && compare.contains(end, this)){ return true; } return false; } public Range getCopy() { return new Range(start, end, startVal); } public Range crop(Range cropTemplate) { // crop front adjust template end (or not) if(this.contains(cropTemplate.end, cropTemplate)){ this.moveStart(cropTemplate.end + 1); } // crop front adjust template end (or not) if(this.contains(cropTemplate.start, cropTemplate)){ this.moveEnd(cropTemplate.start -1); } return this; } public void merge(Range additionalRange) { int start = Math.min(this.start, additionalRange.start); int end = Math.max(this.end, additionalRange.end); this.start = start; this.end = end; } public int getPosVal(int pos) { if(startVal == 0){ return 0; } int diff = pos - start; int posVal = startVal; if(diff > 0){ posVal = ( ( (startVal - 1) + diff) % 3) + 1; } if(diff < 0){ diff = Math.abs(diff); posVal = ( ( (startVal - 1) + diff) % 3) + 1; posVal = 4 - Math.abs(posVal); } return posVal; } private void moveStart(int newStart) { int newStartVal = getPosVal(newStart); this.start = newStart; this.startVal = newStartVal; } private void moveEnd(int newEnd) { this.end = newEnd; } @Override public String toString() { String out = "start=" + start + " end=" + end + " startVal=" + startVal; return out; } public Range cutOut(Range additionalRange) { Range otherPart = this.getCopy(); this.moveEnd(additionalRange.start - 1); otherPart.moveStart(additionalRange.end + 1); return otherPart; } public int compareTo(Range other) { return this.start - other.start; } public int getLength() { return end - start; } }