Skip to content

Commit 901e5ff

Browse files
committed
Increase type stability of NoInverse and FunctionWithInverse
Ensures NoInverse and FunctionWithInverse are type-stable for type/constructor callables.
1 parent aaa88a7 commit 901e5ff

File tree

4 files changed

+13
-1
lines changed

4 files changed

+13
-1
lines changed

src/inverse.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ An instance `NoInverse(f)` signifies that `inverse(f)` is not defined.
6262
"""
6363
struct NoInverse{F}
6464
f::F
65+
NoInverse{F}(f) where F = new{F}(f)
66+
NoInverse(f) = new{Core.Typeof(f)}(f)
6567
end
6668
export NoInverse
6769

src/setinverse.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Do not construct directly, use [`setinverse(f, invf)`](@ref) instead.
1111
struct FunctionWithInverse{F,InvF} <: Function
1212
f::F
1313
invf::InvF
14+
FunctionWithInverse{F, InvF}(f, invf) where {F, InvF} = new{F, InvF}(f, invf)
15+
FunctionWithInverse(f, invf) = new{Core.Typeof(f),Core.Typeof(invf)}(f, invf)
1416
end
1517

1618

test/test_inverse.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ InverseFunctions.inverse(f::Bar) = Bar(inv(f.A))
3636
@test inverse(inverse(f)) == f
3737
end
3838

39+
@test @inferred(inverse(Complex)) isa NoInverse{Type{Complex}}
40+
@test @inferred(NoInverse(Complex)) isa NoInverse{Type{Complex}}
41+
@test @inferred(NoInverse{Type{Complex}}(Complex)) isa NoInverse{Type{Complex}}
42+
3943
InverseFunctions.test_inverse(inverse, log, compare = ===)
4044

4145
InverseFunctions.test_inverse(!, false)

test/test_setinverse.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ using InverseFunctions
55

66

77
@testset "setinverse" begin
8+
@test @inferred(setinverse(Complex, Real)) isa InverseFunctions.FunctionWithInverse{Type{Complex},Type{Real}}
9+
@test @inferred(InverseFunctions.FunctionWithInverse(Complex, Real)) isa InverseFunctions.FunctionWithInverse{Type{Complex},Type{Real}}
10+
@test @inferred(InverseFunctions.FunctionWithInverse{Type{Complex},Type{Real}}(Complex, Real)) isa InverseFunctions.FunctionWithInverse{Type{Complex},Type{Real}}
11+
InverseFunctions.test_inverse(setinverse(Complex, Real), 4.2)
12+
813
@test @inferred(setinverse(sin, asin)) === InverseFunctions.FunctionWithInverse(sin, asin)
914
@test @inferred(setinverse(sin, setinverse(asin, sqrt))) === InverseFunctions.FunctionWithInverse(sin, asin)
1015
@test @inferred(setinverse(setinverse(sin, sqrt), asin)) === InverseFunctions.FunctionWithInverse(sin, asin)
1116
@test @inferred(setinverse(setinverse(sin, asin), setinverse(asin, sqrt))) === InverseFunctions.FunctionWithInverse(sin, asin)
12-
1317
InverseFunctions.test_inverse(setinverse(sin, asin), π/4)
1418
InverseFunctions.test_inverse(setinverse(asin, sin), 0.5)
1519
end

0 commit comments

Comments
 (0)