}
}
- int getStart()
+ @Override
+ public int getBegin()
{
return region.getBegin();
}
- int getEnd()
+ @Override
+ public int getEnd()
{
return region.getEnd();
}
+ /**
+ * Formats the node as a bracketed list e.g.
+ *
+ *
+ * [1-100 [10-30 [10-20]], 15-30 [20-20]]
+ *
+ */
@Override
public String toString() {
StringBuilder sb = new StringBuilder(10 * size);
@@ -80,6 +121,17 @@ class NCNode
return sb.toString();
}
+ void prettyPrint(StringBuilder sb, int offset, int indent) {
+ for (int i = 0 ; i < offset ; i++) {
+ sb.append(" ");
+ }
+ sb.append(region.getBegin()).append("-").append(region.getEnd());
+ if (subregions != null)
+ {
+ sb.append(System.lineSeparator());
+ subregions.prettyPrint(sb, offset + 2, indent);
+ }
+ }
/**
* Add any ranges that overlap the from-to range to the result list
*
@@ -87,7 +139,7 @@ class NCNode
* @param to
* @param result
*/
- void addOverlaps(long from, long to, List result)
+ void findOverlaps(long from, long to, List result)
{
if (region.getBegin() <= to && region.getEnd() >= from)
{
@@ -104,7 +156,7 @@ class NCNode
*
* @param entry
*/
- public synchronized void add(V entry)
+ synchronized void add(V entry)
{
if (entry.getBegin() < region.getBegin() || entry.getEnd() > region.getEnd()) {
throw new IllegalArgumentException(String.format(
@@ -120,5 +172,104 @@ class NCNode
{
subregions.add(entry);
}
+ size++;
+ }
+
+ /**
+ * Answers true if the data held satisfy the rules of construction of an
+ * NCList, else false.
+ *
+ * @return
+ */
+ boolean isValid()
+ {
+ /*
+ * we don't handle reverse ranges
+ */
+ if (region != null && region.getBegin() > region.getEnd())
+ {
+ return false;
+ }
+ if (subregions == null)
+ {
+ return true;
+ }
+ return subregions.isValid(getBegin(), getEnd());
+ }
+
+ /**
+ * Adds all contained entries to the given list
+ *
+ * @param entries
+ */
+ void getEntries(List entries)
+ {
+ entries.add(region);
+ if (subregions != null)
+ {
+ subregions.getEntries(entries);
+ }
+ }
+
+ /**
+ * Answers true if this object contains the given entry (by object equals
+ * test), else false
+ *
+ * @param entry
+ * @return
+ */
+ boolean contains(V entry)
+ {
+ if (entry == null)
+ {
+ return false;
+ }
+ if (entry.equals(region))
+ {
+ return true;
+ }
+ return subregions == null ? false : subregions.contains(entry);
+ }
+
+ /**
+ * Answers the 'root' region modelled by this object
+ *
+ * @return
+ */
+ V getRegion()
+ {
+ return region;
+ }
+
+ /**
+ * Answers the (possibly null) contained regions within this object
+ *
+ * @return
+ */
+ NCList getSubRegions()
+ {
+ return subregions;
+ }
+
+ /**
+ * Nulls the subregion reference if it is empty (after a delete entry
+ * operation)
+ */
+ void deleteSubRegionsIfEmpty()
+ {
+ if (subregions != null && subregions.size() == 0)
+ {
+ subregions = null;
+ }
+ }
+
+ /**
+ * Answers the (deep) size of this node i.e. the number of ranges it models
+ *
+ * @return
+ */
+ int size()
+ {
+ return size;
}
}