/*
* The MIT License
*
* Copyright (c) 2013 The Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package htsjdk.tribble.index;
/**
* Represents a contiguous block of bytes in a file, defined by a start position and size (in bytes)
*/
public class Block {
private final long startPosition;
private long size;
/**
* @param startPosition in bytes
* @param size in bytes
*/
public Block(final long startPosition, final long size) {
this.startPosition = startPosition;
this.size = size;
}
/**
* @return the startPosition
*/
public long getStartPosition() {
return startPosition;
}
public long getEndPosition() {
return startPosition + size;
}
/**
* This method is used to aid in consolidating blocks.
* Sets the size based on the provided {@code endPosition}
* @param endPosition Where the block ends, in bytes
*/
public void setEndPosition(final long endPosition) {
if(endPosition < startPosition)
throw new IllegalArgumentException("Attempting to set block end position to " +
endPosition + " which is before the start of " + startPosition);
size = endPosition - startPosition;
}
/**
* @return the # of bytes in this block. Note that for block-compressed files, this is not truly the
* size of the block in the file. getEndPosition should be used to determine the virtual file offset
* of the end of the region of interest.
*/
public long getSize() {
return size;
}
public boolean equals(final Object obj) {
if ( this == obj ) return true;
if ( ! (obj instanceof Block) ) return false;
final Block otherBlock = (Block)obj;
return this.startPosition == otherBlock.startPosition && this.size == otherBlock.size;
}
}