Skip to content

Commit e25a4ee

Browse files
committed
Add No-Op UnaryBlockOperator that is used when converting type to itself
1 parent 98795b6 commit e25a4ee

File tree

4 files changed

+115
-2
lines changed

4 files changed

+115
-2
lines changed

src/main/java/net/imglib2/algorithm/blocks/BlockSupplier.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import net.imglib2.Typed;
4646
import net.imglib2.blocks.PrimitiveBlocks;
4747
import net.imglib2.type.NativeType;
48+
import net.imglib2.util.Cast;
4849
import net.imglib2.util.Util;
4950

5051
public interface BlockSupplier< T extends NativeType< T > > extends Typed< T >, EuclideanSpace
@@ -144,12 +145,19 @@ default BlockSupplier< T > tile( int... tileSize )
144145
*/
145146
default < U extends NativeType< U > > BlockSupplier< U > andThen( UnaryBlockOperator< T, U > operator )
146147
{
147-
return new ConcatenatedBlockSupplier<>( this.independentCopy(), operator.independentCopy() );
148+
if ( operator instanceof NoOpUnaryBlockOperator )
149+
return Cast.unchecked( this );
150+
else
151+
return new ConcatenatedBlockSupplier<>( this.independentCopy(), operator.independentCopy() );
148152
}
149153

150154
default < U extends NativeType< U > > BlockSupplier< U > andThen( Function< BlockSupplier< T >, UnaryBlockOperator< T, U > > function )
151155
{
152-
return new ConcatenatedBlockSupplier<>( this.independentCopy(), function.apply( this ) );
156+
final UnaryBlockOperator< T, U > op = function.apply( this );
157+
if ( op instanceof NoOpUnaryBlockOperator )
158+
return Cast.unchecked( this );
159+
else
160+
return new ConcatenatedBlockSupplier<>( this.independentCopy(), op );
153161
}
154162

155163
/**
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*-
2+
* #%L
3+
* ImgLib2: a general-purpose, multidimensional image processing library.
4+
* %%
5+
* Copyright (C) 2009 - 2024 Tobias Pietzsch, Stephan Preibisch, Stephan Saalfeld,
6+
* John Bogovic, Albert Cardona, Barry DeZonia, Christian Dietz, Jan Funke,
7+
* Aivar Grislis, Jonathan Hale, Grant Harris, Stefan Helfrich, Mark Hiner,
8+
* Martin Horn, Steffen Jaensch, Lee Kamentsky, Larry Lindsey, Melissa Linkert,
9+
* Mark Longair, Brian Northan, Nick Perry, Curtis Rueden, Johannes Schindelin,
10+
* Jean-Yves Tinevez and Michael Zinsmaier.
11+
* %%
12+
* Redistribution and use in source and binary forms, with or without
13+
* modification, are permitted provided that the following conditions are met:
14+
*
15+
* 1. Redistributions of source code must retain the above copyright notice,
16+
* this list of conditions and the following disclaimer.
17+
* 2. Redistributions in binary form must reproduce the above copyright notice,
18+
* this list of conditions and the following disclaimer in the documentation
19+
* and/or other materials provided with the distribution.
20+
*
21+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
25+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31+
* POSSIBILITY OF SUCH DAMAGE.
32+
* #L%
33+
*/
34+
package net.imglib2.algorithm.blocks;
35+
36+
import java.util.function.Supplier;
37+
38+
import net.imglib2.type.NativeType;
39+
import net.imglib2.util.Cast;
40+
import net.imglib2.util.CloseableThreadLocal;
41+
42+
/**
43+
* Does nothing. This should be eliminated when concatenating through
44+
* {@link UnaryBlockOperator#andThen(UnaryBlockOperator)} or {@link BlockSupplier#andThen(UnaryBlockOperator)}.
45+
*
46+
* @param <T>
47+
*/
48+
public class NoOpUnaryBlockOperator< S extends NativeType< S >, T extends NativeType< T > > implements UnaryBlockOperator< S, T >
49+
{
50+
@Override
51+
public < I, O > BlockProcessor< I, O > blockProcessor()
52+
{
53+
throw new UnsupportedOperationException();
54+
}
55+
56+
@Override
57+
public < U extends NativeType< U > > UnaryBlockOperator< S, U > andThen( UnaryBlockOperator< T, U > op )
58+
{
59+
return Cast.unchecked( op );
60+
}
61+
62+
@Override
63+
public S getSourceType()
64+
{
65+
throw new UnsupportedOperationException();
66+
}
67+
68+
@Override
69+
public T getTargetType()
70+
{
71+
throw new UnsupportedOperationException();
72+
}
73+
74+
@Override
75+
public int numSourceDimensions()
76+
{
77+
return 0;
78+
}
79+
80+
@Override
81+
public int numTargetDimensions()
82+
{
83+
return 0;
84+
}
85+
86+
@Override
87+
public UnaryBlockOperator< S, T > independentCopy()
88+
{
89+
return this;
90+
}
91+
92+
@Override
93+
public UnaryBlockOperator< S, T > threadSafe()
94+
{
95+
return this;
96+
}
97+
}

src/main/java/net/imglib2/algorithm/blocks/UnaryBlockOperator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ public interface UnaryBlockOperator< S extends NativeType< S >, T extends Native
120120
*/
121121
default < U extends NativeType< U > > UnaryBlockOperator< S, U > andThen( UnaryBlockOperator< T, U > op )
122122
{
123+
if ( op instanceof NoOpUnaryBlockOperator )
124+
return Cast.unchecked( this );
125+
123126
final boolean thisHasDimensions = numSourceDimensions() > 0;
124127
final boolean opHasDimensions = op.numSourceDimensions() > 0;
125128
if ( opHasDimensions && thisHasDimensions && numTargetDimensions() != op.numSourceDimensions() ) {

src/main/java/net/imglib2/algorithm/blocks/convert/Convert.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@
3333
*/
3434
package net.imglib2.algorithm.blocks.convert;
3535

36+
import java.util.Objects;
3637
import java.util.function.Function;
3738
import java.util.function.Supplier;
3839

3940
import net.imglib2.algorithm.blocks.BlockSupplier;
4041
import net.imglib2.algorithm.blocks.ClampType;
4142
import net.imglib2.algorithm.blocks.DefaultUnaryBlockOperator;
43+
import net.imglib2.algorithm.blocks.NoOpUnaryBlockOperator;
4244
import net.imglib2.algorithm.blocks.UnaryBlockOperator;
4345
import net.imglib2.converter.Converter;
4446
import net.imglib2.type.NativeType;
@@ -167,6 +169,9 @@ UnaryBlockOperator< S, T > createOperator( final S sourceType, final T targetTyp
167169
public static < S extends NativeType< S >, T extends NativeType< T > >
168170
UnaryBlockOperator< S, T > createOperator( final S sourceType, final T targetType, final ClampType clamp )
169171
{
172+
if ( Objects.equals( sourceType.getClass(), targetType.getClass() ) )
173+
return new NoOpUnaryBlockOperator<>();
174+
170175
return new DefaultUnaryBlockOperator<>(
171176
sourceType, targetType, 0, 0,
172177
new ConvertBlockProcessor<>( sourceType, targetType, clamp ) );

0 commit comments

Comments
 (0)