Skip to content

Commit dfdd9e5

Browse files
authored
Improve support for conversion (#15)
- Also fix numerous ambiguities that were not previously detected - Also test 1.6
1 parent c41f726 commit dfdd9e5

File tree

4 files changed

+26
-6
lines changed

4 files changed

+26
-6
lines changed

.github/workflows/CI.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515
version:
1616
- '0.7'
1717
- '1.0'
18+
- '1.6'
1819
- '1'
1920
# - 'nightly'
2021
os:

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "RoundingIntegers"
22
uuid = "d5f540fe-1c90-5db3-b776-2e2f362d9394"
3-
version = "1.0.0"
3+
version = "1.0.1"
44

55
[compat]
66
julia = "0.7, 1"

src/RoundingIntegers.jl

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,14 @@ Base.promote_rule(::Type{RI}, ::Type{T}) where {T<:Number,RI<:RInteger} =
6767

6868
Base.Signed(x::RSigned) = reinterpret(itype(x), x)
6969
Base.Unsigned(x::RUnsigned) = reinterpret(itype(x), x)
70+
RSigned(x::RSigned) = x
7071
RSigned(x::Signed) = reinterpret(rtype(x), x)
72+
RUnsigned(x::RUnsigned) = x
7173
RUnsigned(x::Unsigned) = reinterpret(rtype(x), x)
7274
Base.Integer(x::RSigned) = Signed(x)
7375
Base.Integer(x::RUnsigned) = Unsigned(x)
76+
Base.Integer(x::RInteger) = reinterpret(itype(x), x)
77+
RInteger(x::RInteger) = x
7478
RInteger(x::Signed) = RSigned(x)
7579
RInteger(x::Unsigned) = RUnsigned(x)
7680

@@ -94,13 +98,24 @@ RUInt128(x::UInt128) = reinterpret(RUInt128, x)
9498
(::Type{R})(x::Complex) where R<:RInteger = R(round(itype(R), x))
9599
(::Type{R})(x::AbstractFloat) where R<:RInteger = R(round(itype(R), x))
96100

97-
@inline Base.convert(::Type{T}, x::RInteger) where {T<:Number} = convert(T, Integer(x))
101+
# Ambiguity resolution
102+
(::Type{T})(x::RInteger) where {T<:RInteger} = convert(T, x)
103+
Base.Bool(x::RInteger) = Bool(Integer(x))
104+
Base.Rational(x::RInteger) = Rational(Integer(x))
105+
Base.Rational{T}(x::RInteger) where {T<:Integer} = Rational(Integer(x))
106+
Base.BigInt(x::RInteger) = BigInt(Integer(x))
107+
Base.Float16(x::RInteger) = Float16(Integer(x))
108+
Base.BigFloat(x::RInteger; kwargs...) = BigFloat(Integer(x); kwargs...)
109+
110+
(::Type{T})(x::RInteger) where {T<:Real} = convert(T, Integer(x))
111+
Base.convert(::Type{T}, x::T) where {T<:RInteger} = x
112+
Base.convert(::Type{T}, x::RInteger) where {T<:RInteger} = T(convert(itype(T), Integer(x)))
98113

99114
# rem conversions
100-
@inline Base.rem(x::T, ::Type{T}) where {T<:RInteger} = T
101-
@inline Base.rem(x::Integer, ::Type{T}) where {T<:RInteger} = RInteger(rem(x, itype(T)))
115+
Base.rem(x::T, ::Type{T}) where {T<:RInteger} = T
116+
Base.rem(x::Integer, ::Type{T}) where {T<:RInteger} = RInteger(rem(x, itype(T)))
102117
# ambs
103-
@inline Base.rem(x::BigInt, ::Type{T}) where {T<:RInteger} = error("no rounding BigInt available")
118+
Base.rem(x::BigInt, ::Type{T}) where {T<:RInteger} = error("no rounding BigInt available")
104119

105120

106121
Base.flipsign(x::RSigned, y::RSigned) = RInteger(flipsign(Integer(x), Integer(y)))

test/runtests.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Test
22
using RoundingIntegers
3-
@test isempty(detect_ambiguities(Base, Core, RoundingIntegers))
3+
@test isempty(detect_ambiguities(RoundingIntegers))
44

55
@testset "Basics" begin
66
r16 = RInt16(3)
@@ -18,6 +18,10 @@ using RoundingIntegers
1818
@test typemin(RInt32) === RInt32(typemin(Int32))
1919
@test widen(r16) === convert(RInt32, r16)
2020

21+
@test RInt16(r16) === r16
22+
@test float(r16) === Float64(r16) === 3.0
23+
@test convert(Float32, r) === 5.0f0
24+
2125
@test !(r < r)
2226
@test r <= r
2327
@test !(r > r)

0 commit comments

Comments
 (0)