Skip to content

Commit 4fd04c2

Browse files
authored
Type stability in promote spaces (#124)
* type stability in promote spaces * Add tests
1 parent 2474a70 commit 4fd04c2

File tree

3 files changed

+20
-22
lines changed

3 files changed

+20
-22
lines changed

src/Operators/Operator.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export domainspace,rangespace
99
abstract type Operator{T} end #T is the entry type, Float64 or Complex{Float64}
1010

1111
eltype(::Operator{T}) where {T} = T
12-
eltype(::Type{Operator{T}}) where {T} = T
12+
eltype(::Type{<:Operator{T}}) where {T} = T
1313
eltype(::Type{OT}) where {OT<:Operator} = eltype(supertype(OT))
1414

1515

src/Operators/spacepromotion.jl

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,12 @@ rangespace(S::SpaceOperator) = S.rangespace
4747

4848

4949
##TODO: Do we need both max and min?
50-
function findmindomainspace(ops::AbstractVector)::Any
51-
sp = UnsetSpace()
52-
53-
for op in ops
54-
sp = union(sp,domainspace(op))
55-
end
56-
57-
sp
50+
function findmindomainspace(ops::AbstractVector)
51+
mapreduce(domainspace, union, ops, init = UnsetSpace())
5852
end
5953

60-
function findmaxrangespace(ops::AbstractVector)::Any
61-
sp = UnsetSpace()
62-
63-
for op in ops
64-
sp = maxspace(sp,rangespace(op))
65-
end
66-
67-
sp
54+
function findmaxrangespace(ops::AbstractVector)
55+
mapreduce(rangespace, maxspace, ops, init = UnsetSpace())
6856
end
6957

7058

@@ -80,31 +68,31 @@ promoterangespace(P::Operator,sp::Space) = promoterangespace(P,sp,rangespace(P))
8068
promotedomainspace(P::Operator,sp::Space) = promotedomainspace(P,sp,domainspace(P))
8169

8270

83-
promoterangespace(P::Operator,sp::Space,cursp::Space)::Any =
71+
promoterangespace(P::Operator,sp::Space,cursp::Space) =
8472
(sp==cursp) ? P : Conversion(cursp,sp)*P
85-
promotedomainspace(P::Operator,sp::Space,cursp::Space)::Any =
73+
promotedomainspace(P::Operator,sp::Space,cursp::Space) =
8674
(sp==cursp) ? P : P*Conversion(sp,cursp)
8775

8876

8977

9078

9179

9280
function promoterangespace(ops::AbstractVector{O}) where O<:Operator
93-
isempty(ops) && return ops
81+
isempty(ops) && return convert(Vector{Operator{eltype(O)}}, ops)
9482
k=findmaxrangespace(ops)
9583
#TODO: T might be incorrect
9684
T=mapreduce(eltype,promote_type,ops)
9785
Operator{T}[promoterangespace(op,k) for op in ops]
9886
end
9987
function promotedomainspace(ops::AbstractVector{O}) where O<:Operator
100-
isempty(ops) && return ops
88+
isempty(ops) && return convert(Vector{Operator{eltype(O)}}, ops)
10189
k=findmindomainspace(ops)
10290
#TODO: T might be incorrect
10391
T=mapreduce(eltype,promote_type,ops)
10492
Operator{T}[promotedomainspace(op,k) for op in ops]
10593
end
10694
function promotedomainspace(ops::AbstractVector{O},S::Space) where O<:Operator
107-
isempty(ops) && return ops
95+
isempty(ops) && return convert(Vector{Operator{eltype(O)}}, ops)
10896
k=conversion_type(findmindomainspace(ops),S)
10997
#TODO: T might be incorrect
11098
T=promote_type(mapreduce(eltype,promote_type,ops),prectype(S))

test/SpacesTest.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,14 @@ import ApproxFunBase: PointSpace, HeavisideSpace, PiecewiseSegment, dimension, V
131131
f = Fun(2)
132132
@test (@inferred convert(Fun{typeof(space(f))}, 2)) == f
133133
end
134+
135+
@testset "promotion" begin
136+
M = Multiplication(Fun(PointSpace(1:3), [1:3;]));
137+
D = Derivative()
138+
for v in Any[[M, M], [D, D], [D, M]]
139+
@test (@inferred ApproxFunBase.promotedomainspace(v)) == v
140+
@test (@inferred ApproxFunBase.promoterangespace(v)) == v
141+
@test (@inferred ApproxFunBase.promotespaces(v)) == v
142+
end
143+
end
134144
end

0 commit comments

Comments
 (0)