Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/net/imglib2/RealRandomAccess.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
* @author Stephan Preibisch
* @author Stephan Saalfeld
*/
public interface RealRandomAccess< T > extends RealLocalizable, RealPositionable, Sampler< T >
public interface RealRandomAccess< T > extends RealLocalizable, RealPositionable, Sampler<T>
{
// NB: Ideally, we would utilize covariant inheritance to narrow the return
// type of a single copy() method here, rather than needing separate methods
Expand Down
180 changes: 179 additions & 1 deletion src/main/java/net/imglib2/RealRandomAccessible.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
*
* @author Stephan Saalfeld
*/
public interface RealRandomAccessible< T > extends EuclideanSpace, Typed< T >
public interface RealRandomAccessible< T > extends RandomAccessible<T>
{
/**
* Create a random access sampler for real coordinates.
Expand Down Expand Up @@ -144,6 +144,18 @@ default RealRandomAccessibleView< T > realView()
return RealRandomAccessibleView.wrap( this );
}

/* RandomAccessible overrides*/

@Override
default RandomAccess< T > randomAccess() {
return new RandomAccessOnRealRandomAccessible<>(realRandomAccess());
}

@Override
default RandomAccess< T > randomAccess(final Interval interval) {
return new RandomAccessOnRealRandomAccessible<>(realRandomAccess(interval));
}

/*
* NB: We cannot have a default implementation here because of
* https://bugs.openjdk.org/browse/JDK-7120669
Expand All @@ -154,3 +166,169 @@ default RealRandomAccessibleView< T > realView()
// return realRandomAccess().get();
// }
}

/**
* It's tempting to make {@link RealRandomAccess} extends {@link RandomAccess}.
* However a {@link RealRandomAccess} is not {@link Localizable}, because its
* position cannot always be reported in discrete space. This class wraps a
* {@link RealRandomAccess} such that all calls are in discrete space
*
* @author Stephan Saalfeld
* @author Gabriel Selzer
*/
final class RandomAccessOnRealRandomAccessible<T> implements RandomAccess< T >
{
private final RealRandomAccess< T > sourceAccess;

public RandomAccessOnRealRandomAccessible( final RealRandomAccess< T > sourceAccess )
{
this.sourceAccess = sourceAccess;
}

@Override
public void localize( final int[] position )
{
for ( int d = 0; d < sourceAccess.numDimensions(); ++d )
position[ d ] = ( int ) Math.round( sourceAccess.getDoublePosition( d ) );
}

@Override
public void localize( final long[] position )
{
for ( int d = 0; d < sourceAccess.numDimensions(); ++d )
position[ d ] = Math.round( sourceAccess.getDoublePosition( d ) );
}

@Override
public int getIntPosition( final int d )
{
return ( int ) Math.round( sourceAccess.getDoublePosition( d ) );
}

@Override
public long getLongPosition( final int d )
{
return Math.round( sourceAccess.getDoublePosition( d ) );
}

@Override
public void localize( final float[] position )
{
sourceAccess.localize( position );
}

@Override
public void localize( final double[] position )
{
sourceAccess.localize( position );
}

@Override
public float getFloatPosition( final int d )
{
return sourceAccess.getFloatPosition( d );
}

@Override
public double getDoublePosition( final int d )
{
return sourceAccess.getDoublePosition( d );
}

@Override
public void fwd( final int d )
{
sourceAccess.fwd( d );
}

@Override
public void bck( final int d )
{
sourceAccess.bck( d );
}

@Override
public void move( final int distance, final int d )
{
sourceAccess.move( distance, d );
}

@Override
public void move( final long distance, final int d )
{
sourceAccess.move( distance, d );
}

@Override
public void move( final Localizable localizable )
{
sourceAccess.move( localizable );
}

@Override
public void move( final int[] distance )
{
sourceAccess.move( distance );
}

@Override
public void move( final long[] distance )
{
sourceAccess.move( distance );
}

@Override
public void setPosition( final Localizable localizable )
{
sourceAccess.setPosition( localizable );
}

@Override
public void setPosition( final int[] position )
{
sourceAccess.setPosition( position );
}

@Override
public void setPosition( final long[] position )
{
sourceAccess.setPosition( position );
}

@Override
public void setPosition( final int position, final int d )
{
sourceAccess.setPosition( position, d );
}

@Override
public void setPosition( final long position, final int d )
{
sourceAccess.setPosition( position, d );
}

@Override
public T get()
{
return sourceAccess.get();
}

@Override
public T getType()
{
return sourceAccess.getType();
}

@Override
public RandomAccessOnRealRandomAccessible<T> copy()
{
return new RandomAccessOnRealRandomAccessible<>( sourceAccess.copy() );
}

@Override
public int numDimensions()
{
return sourceAccess.numDimensions();
}
}

Loading