@@ -148,12 +148,12 @@ default RealRandomAccessibleView< T > realView()
148148
149149 @ Override
150150 default RandomAccess < T > randomAccess () {
151- return realRandomAccess ();
151+ return new RandomAccessOnRealRandomAccessible <>( realRandomAccess () );
152152 }
153153
154154 @ Override
155155 default RandomAccess < T > randomAccess (final Interval interval ) {
156- return realRandomAccess (interval );
156+ return new RandomAccessOnRealRandomAccessible <>( realRandomAccess (interval ) );
157157 }
158158
159159 /*
@@ -167,3 +167,168 @@ default RandomAccess< T > randomAccess(final Interval interval) {
167167// }
168168}
169169
170+ /**
171+ * It's tempting to make {@link RealRandomAccess} extends {@link RandomAccess}.
172+ * However a {@link RealRandomAccess} is not {@link Localizable}, because its
173+ * position cannot always be reported in discrete space. This class wraps a
174+ * {@link RealRandomAccess} such that all calls are in discrete space
175+ *
176+ * @author Stephan Saalfeld
177+ * @author Gabriel Selzer
178+ */
179+ final class RandomAccessOnRealRandomAccessible <T > implements RandomAccess < T >
180+ {
181+ private final RealRandomAccess < T > sourceAccess ;
182+
183+ public RandomAccessOnRealRandomAccessible ( final RealRandomAccess < T > sourceAccess )
184+ {
185+ this .sourceAccess = sourceAccess ;
186+ }
187+
188+ @ Override
189+ public void localize ( final int [] position )
190+ {
191+ for ( int d = 0 ; d < sourceAccess .numDimensions (); ++d )
192+ position [ d ] = ( int ) Math .round ( sourceAccess .getDoublePosition ( d ) );
193+ }
194+
195+ @ Override
196+ public void localize ( final long [] position )
197+ {
198+ for ( int d = 0 ; d < sourceAccess .numDimensions (); ++d )
199+ position [ d ] = Math .round ( sourceAccess .getDoublePosition ( d ) );
200+ }
201+
202+ @ Override
203+ public int getIntPosition ( final int d )
204+ {
205+ return ( int ) Math .round ( sourceAccess .getDoublePosition ( d ) );
206+ }
207+
208+ @ Override
209+ public long getLongPosition ( final int d )
210+ {
211+ return Math .round ( sourceAccess .getDoublePosition ( d ) );
212+ }
213+
214+ @ Override
215+ public void localize ( final float [] position )
216+ {
217+ sourceAccess .localize ( position );
218+ }
219+
220+ @ Override
221+ public void localize ( final double [] position )
222+ {
223+ sourceAccess .localize ( position );
224+ }
225+
226+ @ Override
227+ public float getFloatPosition ( final int d )
228+ {
229+ return sourceAccess .getFloatPosition ( d );
230+ }
231+
232+ @ Override
233+ public double getDoublePosition ( final int d )
234+ {
235+ return sourceAccess .getDoublePosition ( d );
236+ }
237+
238+ @ Override
239+ public void fwd ( final int d )
240+ {
241+ sourceAccess .fwd ( d );
242+ }
243+
244+ @ Override
245+ public void bck ( final int d )
246+ {
247+ sourceAccess .bck ( d );
248+ }
249+
250+ @ Override
251+ public void move ( final int distance , final int d )
252+ {
253+ sourceAccess .move ( distance , d );
254+ }
255+
256+ @ Override
257+ public void move ( final long distance , final int d )
258+ {
259+ sourceAccess .move ( distance , d );
260+ }
261+
262+ @ Override
263+ public void move ( final Localizable localizable )
264+ {
265+ sourceAccess .move ( localizable );
266+ }
267+
268+ @ Override
269+ public void move ( final int [] distance )
270+ {
271+ sourceAccess .move ( distance );
272+ }
273+
274+ @ Override
275+ public void move ( final long [] distance )
276+ {
277+ sourceAccess .move ( distance );
278+ }
279+
280+ @ Override
281+ public void setPosition ( final Localizable localizable )
282+ {
283+ sourceAccess .setPosition ( localizable );
284+ }
285+
286+ @ Override
287+ public void setPosition ( final int [] position )
288+ {
289+ sourceAccess .setPosition ( position );
290+ }
291+
292+ @ Override
293+ public void setPosition ( final long [] position )
294+ {
295+ sourceAccess .setPosition ( position );
296+ }
297+
298+ @ Override
299+ public void setPosition ( final int position , final int d )
300+ {
301+ sourceAccess .setPosition ( position , d );
302+ }
303+
304+ @ Override
305+ public void setPosition ( final long position , final int d )
306+ {
307+ sourceAccess .setPosition ( position , d );
308+ }
309+
310+ @ Override
311+ public T get ()
312+ {
313+ return sourceAccess .get ();
314+ }
315+
316+ @ Override
317+ public T getType ()
318+ {
319+ return sourceAccess .getType ();
320+ }
321+
322+ @ Override
323+ public RandomAccessOnRealRandomAccessible <T > copy ()
324+ {
325+ return new RandomAccessOnRealRandomAccessible <>( sourceAccess .copy () );
326+ }
327+
328+ @ Override
329+ public int numDimensions ()
330+ {
331+ return sourceAccess .numDimensions ();
332+ }
333+ }
334+
0 commit comments