Skip to content

Commit 327cdb8

Browse files
authored
Specialize literal_pow for Fun (#115)
* specialize literal_pow for Fun * better inference in f^0 * version bump to v0.6.11
1 parent 7453b41 commit 327cdb8

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ApproxFunBase"
22
uuid = "fbd15aa5-315a-5a7d-a8a4-24992e37be05"
3-
version = "0.6.10"
3+
version = "0.6.11"
44

55
[deps]
66
AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c"

src/Fun.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,12 @@ function intpow(f::Fun,k::Integer)
368368
end
369369

370370
^(f::Fun, k::Integer) = intpow(f,k)
371+
# some common cases
372+
Base.literal_pow(::typeof(^), x::Fun, ::Val{0}) = ones(cfstype(x), space(x))
373+
Base.literal_pow(::typeof(^), x::Fun, ::Val{1}) = x
374+
Base.literal_pow(::typeof(^), x::Fun, ::Val{2}) = x * x
375+
Base.literal_pow(::typeof(^), x::Fun, ::Val{3}) = x * x * x
376+
Base.literal_pow(::typeof(^), x::Fun, ::Val{4}) = x * x * x * x
371377

372378
inv(f::Fun) = 1/f
373379

test/SpacesTest.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,23 @@ using ApproxFunOrthogonalPolynomials
9494
M2 = M + M
9595
infty = ApproxFunBase.InfiniteCardinal{0}()
9696
@test (@inferred size(M2)) == (infty, infty)
97+
98+
@testset "literal pow" begin
99+
local f = Fun(PointSpace(1:3), Float64[1:3;])
100+
@test (@inferred (x -> x^0)(f)) == ApproxFunBase.intpow(f,0)
101+
@test (@inferred (x -> x^1)(f)) == ApproxFunBase.intpow(f,1)
102+
@test (@inferred (x -> x^2)(f)) == ApproxFunBase.intpow(f,2)
103+
@test (@inferred (x -> x^3)(f)) == ApproxFunBase.intpow(f,3)
104+
@test (@inferred (x -> x^4)(f)) == ApproxFunBase.intpow(f,4)
105+
106+
local f = Fun(PointSpace(Float32[1:3;]), Float32[1:3;])
107+
g = @inferred (x -> x^0)(f)
108+
@test eltype(coefficients(g)) == Float32
109+
g = @inferred (x -> x^1)(f)
110+
@test eltype(coefficients(g)) == Float32
111+
g = @inferred (x -> x^2)(f)
112+
@test eltype(coefficients(g)) == Float32
113+
end
97114
end
98115

99116
@testset "Derivative operator for HeavisideSpace" begin

0 commit comments

Comments
 (0)