Skip to content

Commit 25affc6

Browse files
authored
Merge pull request #100 from JuliaMath/sb/promote
Update reduction machinery for 0.7
2 parents 6a8aee8 + f0c718b commit 25affc6

File tree

5 files changed

+28
-13
lines changed

5 files changed

+28
-13
lines changed

src/FixedPointNumbers.jl

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Base: ==, <, <=, -, +, *, /, ~, isapprox,
1010
zero, oneunit, one, typemin, typemax, realmin, realmax, eps, sizeof, reinterpret,
1111
float, trunc, round, floor, ceil, bswap,
1212
div, fld, rem, mod, mod1, fld1, min, max, minmax,
13-
start, next, done, reducedim_init, rand
13+
start, next, done, rand
1414
if isdefined(Base, :rem1)
1515
import Base: rem1
1616
end
@@ -134,20 +134,27 @@ sizeof(::Type{T}) where {T <: FixedPoint} = sizeof(rawtype(T))
134134
# Promotions for reductions
135135
const Treduce = Float64
136136
if isdefined(Base, :r_promote)
137+
# Julia v0.6
137138
Base.r_promote(::typeof(+), x::FixedPoint{T}) where {T} = Treduce(x)
138139
Base.r_promote(::typeof(*), x::FixedPoint{T}) where {T} = Treduce(x)
140+
Base.reducedim_init(f::typeof(identity),
141+
op::typeof(+),
142+
A::AbstractArray{T}, region) where {T <: FixedPoint} =
143+
Base.reducedim_initarray(A, region, zero(Treduce))
144+
Base.reducedim_init(f::typeof(identity),
145+
op::typeof(*),
146+
A::AbstractArray{T}, region) where {T <: FixedPoint} =
147+
Base.reducedim_initarray(A, region, oneunit(Treduce))
139148
else
140-
Base.promote_sys_size(::Type{<:FixedPoint}) = Treduce
149+
# Julia v0.7
150+
Base.add_sum(x::FixedPoint, y::FixedPoint) = Treduce(x) + Treduce(y)
151+
Base.reduce_empty(::typeof(Base.add_sum), ::Type{F}) where {F<:FixedPoint} = zero(Treduce)
152+
Base.reduce_first(::typeof(Base.add_sum), x::FixedPoint) = Treduce(x)
153+
Base.mul_prod(x::FixedPoint, y::FixedPoint) = Treduce(x) * Treduce(y)
154+
Base.reduce_empty(::typeof(Base.mul_prod), ::Type{F}) where {F<:FixedPoint} = one(Treduce)
155+
Base.reduce_first(::typeof(Base.mul_prod), x::FixedPoint) = Treduce(x)
141156
end
142157

143-
reducedim_init(f::typeof(identity),
144-
op::typeof(+),
145-
A::AbstractArray{T}, region) where {T <: FixedPoint} =
146-
reducedim_initarray(A, region, zero(Treduce))
147-
reducedim_init(f::typeof(identity),
148-
op::typeof(*),
149-
A::AbstractArray{T}, region) where {T <: FixedPoint} =
150-
reducedim_initarray(A, region, oneunit(Treduce))
151158

152159
for f in (:div, :fld, :fld1)
153160
@eval begin

src/fixed.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ struct Fixed{T <: Signed,f} <: FixedPoint{T, f}
66
# selected by passing an extra dummy argument
77
Fixed{T, f}(i::Integer, _) where {T,f} = new{T, f}(i % T)
88
Fixed{T, f}(x) where {T,f} = convert(Fixed{T,f}, x)
9+
Fixed{T, f}(x::Fixed{T,f}) where {T,f} = x
910
end
1011

1112
reinterpret(::Type{Fixed{T,f}}, x::T) where {T <: Signed,f} = Fixed{T,f}(x, 0)

src/normed.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ struct Normed{T<:Unsigned,f} <: FixedPoint{T,f}
66

77
Normed{T, f}(i::Integer,_) where {T,f} = new{T, f}(i%T) # for setting by raw representation
88
Normed{T, f}(x) where {T,f} = convert(Normed{T,f}, x)
9+
Normed{T, f}(x::Normed{T,f}) where {T,f} = x
910
end
1011

1112
typechar(::Type{X}) where {X <: Normed} = 'N'

test/normed.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ end
146146
function testtrunc(inc::T) where {T}
147147
incf = convert(Float64, inc)
148148
tm = reinterpret(typemax(T))/reinterpret(one(T))
149-
x = zero(T)
149+
local x = zero(T)
150150
for i = 0 : min(1e6, reinterpret(typemax(T))-1)
151151
xf = incf*i
152152
try
@@ -305,7 +305,11 @@ end
305305
@test N0f16(Float16(1.0)) === N0f16(1.0)
306306
@test Float16(1.0) % N0f16 === N0f16(1.0)
307307

308-
if VERSION >= v"0.7.0-DEV.1790"
308+
if VERSION >= v"0.7.0-DEV.2657"
309+
a = N0f8[0.2, 0.4]
310+
@test summary(a) == "2-element Array{N0f8,1} with eltype Normed{UInt8,8}"
311+
@test summary(view(a, 1:2)) == "2-element view(::Array{N0f8,1}, 1:2) with eltype Normed{UInt8,8}"
312+
elseif VERSION >= v"0.7.0-DEV.1790"
309313
a = N0f8[0.2, 0.4]
310314
@test summary(a) == "2-element Array{N0f8,1} with eltype FixedPointNumbers.Normed{UInt8,8}"
311315
@test summary(view(a, 1:2)) == "2-element view(::Array{N0f8,1}, 1:2) with eltype FixedPointNumbers.Normed{UInt8,8}"

test/runtests.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using FixedPointNumbers, Base.Test
22

3-
@test isempty(detect_ambiguities(FixedPointNumbers, Base, Core))
3+
if VERSION < v"0.7.0-"
4+
@test isempty(detect_ambiguities(FixedPointNumbers, Base, Core))
5+
end
46

57
for f in ["normed.jl", "fixed.jl"]
68
println("Testing $f")

0 commit comments

Comments
 (0)