package utils.nexus; import org.apache.commons.lang.ArrayUtils; import org.apache.log4j.Logger; public class NexusBoolArray{ private static final Logger logger = Logger.getLogger(NexusBoolArray.class); private boolean[] backend; public NexusBoolArray(int length) { backend = new boolean[length]; } public NexusBoolArray(boolean[] positions) { this.backend = positions; } public boolean[] getBooleanArray() { return backend; } public NexusBoolArray getCopy() { return new NexusBoolArray(ArrayUtils.clone(backend)); } public void reverse() { ArrayUtils.reverse(backend); } public int getLength() { if(backend != null){ return backend.length; }else{ return 0; } } public boolean valueAt(int position) { if(!rangeCheck(position)){ return false; } return backend[position]; } public boolean containsValue(boolean value) { if(backend != null){ for(boolean position: backend){ if(position == value){ return true; } } } return false; } public void removePosition(int index){ if(rangeCheck(index)){ backend = ArrayUtils.remove(backend, index); } } public void set(int pos, boolean b) { backend[pos] = b; } private boolean rangeCheck(int index) { if(backend == null){ return false; } if(backend.length <= index){ return false; } return true; } public int countValue(boolean value) { int size = 0; if(backend != null){ for(boolean position: backend){ if(position == value){ size ++; } } } return size; } public void setTrueFromNexusRange(NexusRange range) { for(int n = range.getMinimumInt(); n <= range.getMaximumInt(); n++){ if(rangeCheck(n - 1)){ backend[n - 1] = true; // always minus one because alignment start with pos 1 in exset (but 0 internally in program) } } } public void debug() { logger.info(backend); for(boolean val: backend){ // logger.info(val); } } public void append(NexusBoolArray morePositions) { int newSize = backend.length + morePositions.getBooleanArray().length; boolean[] newPositions = new boolean[newSize]; System.arraycopy(backend, 0, newPositions, 0, backend.length); System.arraycopy(morePositions.getBooleanArray(), 0, newPositions, backend.length, morePositions.getBooleanArray().length); this.backend = newPositions; } public void insertPosition(int n) { if(this.backend != null){ this.backend = ArrayUtils.add(this.backend, n, false); } } public boolean isTrueValContinous() { boolean searchVal = true; boolean firstFound = false; boolean isInterruptedOnce = false; boolean isContinous = false; if(backend != null){ for(int n = 0; n + 1 < backend.length; n++){ boolean positionVal = backend[n]; boolean nextPosVal = backend[n + 1]; if(positionVal == searchVal && firstFound == false){ firstFound = true; isContinous = true; } if(positionVal != searchVal && firstFound == true){ isInterruptedOnce = true; } if(positionVal == true && firstFound == true && isInterruptedOnce == true){ isContinous = false; } } } return isContinous; } }