Skip to content

Commit 0c46c8e

Browse files
committed
Add Range to represent (offset, length) pair
1 parent 27e5645 commit 0c46c8e

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package org.janelia.saalfeldlab.n5.readdata;
2+
3+
import java.util.Comparator;
4+
5+
/**
6+
* A range specified as a {@link #offset}, {@link #length} pair.
7+
*/
8+
public interface Range {
9+
10+
/**
11+
* Order {@code Range}s by {@link #offset}.
12+
* Ranges with the same offset are ordered by {@link #length}.
13+
*/
14+
Comparator<Range> COMPARATOR = Comparator
15+
.comparingLong(Range::offset)
16+
.thenComparingLong(Range::length);
17+
18+
/**
19+
* @return start index (inclusive)
20+
*/
21+
long offset();
22+
23+
/**
24+
* @return number of elements
25+
*/
26+
long length();
27+
28+
/**
29+
* @return end index (exclusive)
30+
*/
31+
default long end() {
32+
return offset() + length();
33+
}
34+
35+
static boolean equals(final Range r0, final Range r1) {
36+
if (r0 == null && r1==null) {
37+
return true;
38+
} else if (r0 == null || r1 == null) {
39+
return false;
40+
} else {
41+
return r0.offset() == r1.offset() && r0.length() == r1.length();
42+
}
43+
}
44+
45+
static Range at(final long offset, final long length) {
46+
47+
class DefaultRange implements Range {
48+
49+
private final long offset;
50+
private final long length;
51+
52+
public DefaultRange(final long offset, final long length) {
53+
this.offset = offset;
54+
this.length = length;
55+
}
56+
57+
@Override
58+
public long offset() {
59+
return offset;
60+
}
61+
62+
@Override
63+
public long length() {
64+
return length;
65+
}
66+
67+
@Override
68+
public final boolean equals(final Object o) {
69+
if (!(o instanceof DefaultRange))
70+
return false;
71+
72+
final DefaultRange that = (DefaultRange) o;
73+
return offset == that.offset && length == that.length;
74+
}
75+
76+
@Override
77+
public int hashCode() {
78+
int result = Long.hashCode(offset);
79+
result = 31 * result + Long.hashCode(length);
80+
return result;
81+
}
82+
83+
@Override
84+
public String toString() {
85+
return "Range{" +
86+
"offset=" + offset +
87+
", length=" + length +
88+
'}';
89+
}
90+
}
91+
92+
return new DefaultRange(offset, length);
93+
}
94+
}

src/main/java/org/janelia/saalfeldlab/n5/readdata/ReadData.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ default ReadData slice(final long offset, final long length) throws N5IOExceptio
105105
return materialize().slice(offset, length);
106106
}
107107

108+
/**
109+
* Returns a new {@link ReadData} representing a slice, or subset
110+
* of this ReadData.
111+
*
112+
* @param range a range in this ReadData
113+
* @return a slice
114+
* @throws N5IOException an exception
115+
*/
116+
default ReadData slice(final Range range) throws N5IOException {
117+
return slice(range.offset(), range.length());
118+
}
119+
108120
/**
109121
* Open a {@code InputStream} on this data.
110122
* <p>

0 commit comments

Comments
 (0)