Skip to content

Commit bf2e7d8

Browse files
committed
Add BlockInterval with long[] min and int[] dimensions
1 parent 7b72b54 commit bf2e7d8

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package net.imglib2.blocks;
2+
3+
import net.imglib2.Interval;
4+
import net.imglib2.util.Util;
5+
6+
import java.util.Arrays;
7+
8+
import static net.imglib2.util.Util.safeInt;
9+
10+
/**
11+
* An {@code Interval} where dimensions are {@code int[]}.
12+
* <p>
13+
* Used internally by {@code PrimitiveBlocks} and {@code BlockProcessor}.
14+
*/
15+
public final class BlockInterval implements Interval
16+
{
17+
public BlockInterval( final int numDimensions )
18+
{
19+
this( new long[ numDimensions ], new int[ numDimensions ] );
20+
}
21+
22+
public static BlockInterval wrap( final long[] min, final int[] size )
23+
{
24+
return new BlockInterval( min, size );
25+
}
26+
27+
/**
28+
* Return {@code interval} if it is a {@code BlockInterval}.
29+
* Otherwise, copy into a new {@link BlockInterval}.
30+
*/
31+
public static BlockInterval asBlockInterval( final Interval interval )
32+
{
33+
return interval instanceof BlockInterval
34+
? ( BlockInterval ) interval
35+
: new BlockInterval( interval );
36+
}
37+
38+
private final long[] min;
39+
40+
private final int[] size;
41+
42+
private BlockInterval( final long[] min, final int[] size )
43+
{
44+
this.min = min;
45+
this.size = size;
46+
}
47+
48+
private BlockInterval( final Interval interval )
49+
{
50+
this( interval.numDimensions() );
51+
interval.min( min );
52+
Arrays.setAll( size, d -> safeInt( interval.dimension( d ) ) );
53+
}
54+
55+
public void setFrom( Interval interval )
56+
{
57+
final int n = numDimensions();
58+
if ( n != interval.numDimensions() )
59+
{
60+
throw new IllegalArgumentException( "Interval dimensions mismatch" );
61+
}
62+
if ( interval instanceof BlockInterval )
63+
{
64+
System.arraycopy( ( ( BlockInterval ) interval ).min, 0, min, 0, n );
65+
System.arraycopy( ( ( BlockInterval ) interval ).size, 0, size, 0, n );
66+
}
67+
for ( int d = 0; d < n; ++d )
68+
{
69+
min[ d ] = interval.min( d );
70+
size[ d ] = Util.safeInt( interval.dimension( d ) );
71+
}
72+
}
73+
74+
/**
75+
* This returns the internal {@code long[] min}.
76+
* Modifications are reflected in this interval!
77+
*
78+
* @return the internal {@code long[]} storing the min of this interval.
79+
*/
80+
public long[] min()
81+
{
82+
return min;
83+
}
84+
85+
/**
86+
* This returns the internal {@code int[] dimensions}.
87+
* Modifications are reflected in this interval!
88+
*
89+
* @return the internal {@code int[]} storing the dimensions of this interval.
90+
*/
91+
public int[] size()
92+
{
93+
return size;
94+
}
95+
96+
@Override
97+
public int numDimensions()
98+
{
99+
return size.length;
100+
}
101+
102+
@Override
103+
public long min( final int d )
104+
{
105+
return min[ d ];
106+
}
107+
108+
@Override
109+
public long max( final int d )
110+
{
111+
return min[ d ] + size[ d ] - 1;
112+
}
113+
114+
@Override
115+
public long dimension( final int d )
116+
{
117+
return size[ d ];
118+
}
119+
}

0 commit comments

Comments
 (0)