1
- __precompile__ (true )
2
-
3
1
module RoundingIntegers
4
2
5
- using Compat
6
- import Base: < , <= , + , - , * , ~ , & , | , $ , << , >> , >>>
3
+ import Base: < , <= , + , - , * , ~ , & , | , << , >> , >>> , xor
7
4
8
5
export RSigned, RUnsigned, RInteger
9
6
export RInt8, RUInt8, RInt16, RUInt16, RInt32, RUInt32, RInt64, RUInt64,
10
7
RInt128, RUInt128, RInt, RUInt
11
8
12
- @compat abstract type RSigned <: Signed end
13
- @compat abstract type RUnsigned <: Unsigned end
9
+ abstract type RSigned <: Signed end
10
+ abstract type RUnsigned <: Unsigned end
14
11
15
12
const RInteger = Union{RSigned,RUnsigned}
16
13
17
- @compat primitive type RInt8 <: RSigned 8 end
18
- @compat primitive type RUInt8 <: RUnsigned 8 end
19
- @compat primitive type RInt16 <: RSigned 16 end
20
- @compat primitive type RUInt16 <: RUnsigned 16 end
21
- @compat primitive type RInt32 <: RSigned 32 end
22
- @compat primitive type RUInt32 <: RUnsigned 32 end
23
- @compat primitive type RInt64 <: RSigned 64 end
24
- @compat primitive type RUInt64 <: RUnsigned 64 end
25
- @compat primitive type RInt128 <: RSigned 128 end
26
- @compat primitive type RUInt128 <: RUnsigned 128 end
14
+ primitive type RInt8 <: RSigned 8 end
15
+ primitive type RUInt8 <: RUnsigned 8 end
16
+ primitive type RInt16 <: RSigned 16 end
17
+ primitive type RUInt16 <: RUnsigned 16 end
18
+ primitive type RInt32 <: RSigned 32 end
19
+ primitive type RUInt32 <: RUnsigned 32 end
20
+ primitive type RInt64 <: RSigned 64 end
21
+ primitive type RUInt64 <: RUnsigned 64 end
22
+ primitive type RInt128 <: RSigned 128 end
23
+ primitive type RUInt128 <: RUnsigned 128 end
27
24
28
25
if Sys. WORD_SIZE == 32
29
26
const RInt = RInt32
@@ -65,67 +62,45 @@ rtype(x::Union{Signed,Unsigned}) = rtype(typeof(x))
65
62
# RIntegers are largely about assignment; for usage, we convert to
66
63
# standard integers at the drop of a hat.
67
64
68
- Base. promote_rule {T<:Number,RI<:RInteger} (:: Type{T } , :: Type{RI} ) =
65
+ Base. promote_rule (:: Type{RI } , :: Type{T} ) where {T <: Number ,RI <: RInteger } =
69
66
promote_type (T, itype (RI))
70
- # Resolve ambiguities
71
- Base. promote_rule {RI<:RInteger} (:: Type{Bool} , :: Type{RI} ) =
72
- promote_type (Bool, itype (RI))
73
- Base. promote_rule {RI<:RInteger} (:: Type{BigInt} , :: Type{RI} ) =
74
- promote_type (BigInt, itype (RI))
75
- Base. promote_rule {RI<:RInteger} (:: Type{BigFloat} , :: Type{RI} ) =
76
- promote_type (BigFloat, itype (RI))
77
- Base. promote_rule {T<:Real,RI<:RInteger} (:: Type{Complex{T}} , :: Type{RI} ) =
78
- promote_type (Complex{T}, itype (RI))
79
- Base. promote_rule {T<:Integer,RI<:RInteger} (:: Type{Rational{T}} , :: Type{RI} ) =
80
- promote_type (Rational{T}, itype (RI))
81
- @compat Base. promote_rule {RI<:RInteger} (:: Type{<:Irrational} , :: Type{RI} ) =
82
- promote_type (Float64, itype (RI))
83
-
84
- (:: Type{Signed} )(x:: RSigned ) = reinterpret (itype (x), x)
85
- (:: Type{Unsigned} )(x:: RUnsigned ) = reinterpret (itype (x), x)
86
- (:: Type{RSigned} )(x:: Signed ) = reinterpret (rtype (x), x)
87
- (:: Type{RUnsigned} )(x:: Unsigned ) = reinterpret (rtype (x), x)
88
- (:: Type{Integer} )(x:: RSigned ) = Signed (x)
89
- (:: Type{Integer} )(x:: RUnsigned ) = Unsigned (x)
90
- (:: Type{RInteger} )(x:: Signed ) = RSigned (x)
91
- (:: Type{RInteger} )(x:: Unsigned ) = RUnsigned (x)
92
-
93
- # Basic conversions
94
- # @inline Base.convert{T<:RSigned}(::Type{T}, x::T) = x
95
- # @inline Base.convert{T<:RUnsigned}(::Type{T}, x::T) = x
96
- @inline Base. convert {T<:RInteger} (:: Type{T} , x:: T ) = x
97
- @inline Base. convert {T<:RInteger} (:: Type{T} , x:: RInteger ) =
98
- RInteger (convert (itype (T), Integer (x)))
99
- @inline Base. convert {T<:RInteger} (:: Type{T} , x:: Integer ) = RInteger (convert (itype (T), x))
100
- @inline Base. convert {T<:RInteger} (:: Type{T} , x:: AbstractFloat ) =
101
- RInteger (round (itype (T), x))
102
- @inline Base. convert {T<:RInteger} (:: Type{T} , x:: Number ) =
103
- convert (T, convert (itype (T), x))
104
-
105
- @inline Base. convert {T<:Number} (:: Type{T} , x:: RInteger ) = convert (T, Integer (x))
106
-
107
- # Resolve ambiguities
108
- Base. convert (:: Type{Integer} , x:: RInteger ) = Integer (x)
109
- Base. convert (:: Type{BigInt} , x:: RInteger ) = convert (BigInt, Integer (x))
110
- Base. convert {T<:RInteger} (:: Type{T} , x:: BigInt ) = RInteger (convert (itype (T), x))
111
- Base. convert (:: Type{BigFloat} , x:: RInteger ) = convert (BigFloat, Integer (x))
112
- Base. convert {T<:RInteger} (:: Type{T} , x:: BigFloat ) = RInteger (convert (itype (T), x))
113
- Base. convert {T<:Real} (:: Type{Complex{T}} , x:: RInteger ) = convert (Complex{T}, Integer (x))
114
- Base. convert {T<:RInteger} (:: Type{T} , z:: Complex ) = RInteger (convert (itype (T), z))
115
- Base. convert (:: Type{Complex} , x:: RInteger ) = Complex (x)
116
- Base. convert {T<:RInteger} (:: Type{T} , x:: Rational ) = RInteger (convert (itype (T)), x)
117
- Base. convert {T<:Integer} (:: Type{Rational{T}} , x:: RInteger ) =
118
- convert (Rational{T}, Integer (x))
119
- Base. convert (:: Type{Rational} , x:: RInteger ) = convert (Rational{typeof (x)}, x)
120
- Base. convert (:: Type{Float16} , x:: RInteger ) = convert (Float16, Integer (x))
121
- Base. convert {T<:RInteger} (:: Type{T} , x:: Float16 ) = RInteger (convert (itype (T), x))
122
- Base. convert (:: Type{Bool} , x:: RInteger ) = convert (Bool, Integer (x))
67
+
68
+ Base. Signed (x:: RSigned ) = reinterpret (itype (x), x)
69
+ Base. Unsigned (x:: RUnsigned ) = reinterpret (itype (x), x)
70
+ RSigned (x:: Signed ) = reinterpret (rtype (x), x)
71
+ RUnsigned (x:: Unsigned ) = reinterpret (rtype (x), x)
72
+ Base. Integer (x:: RSigned ) = Signed (x)
73
+ Base. Integer (x:: RUnsigned ) = Unsigned (x)
74
+ RInteger (x:: Signed ) = RSigned (x)
75
+ RInteger (x:: Unsigned ) = RUnsigned (x)
76
+
77
+ Base. AbstractFloat (x:: RInteger ) = AbstractFloat (Integer (x))
78
+
79
+ RInt8 (x:: Int8 ) = reinterpret (RInt8, x)
80
+ RUInt8 (x:: UInt8 ) = reinterpret (RUInt8, x)
81
+ RInt16 (x:: Int16 ) = reinterpret (RInt16, x)
82
+ RUInt16 (x:: UInt16 ) = reinterpret (RUInt16, x)
83
+ RInt32 (x:: Int32 ) = reinterpret (RInt32, x)
84
+ RUInt32 (x:: UInt32 ) = reinterpret (RUInt32, x)
85
+ RInt64 (x:: Int64 ) = reinterpret (RInt64, x)
86
+ RUInt64 (x:: UInt64 ) = reinterpret (RUInt64, x)
87
+ RInt128 (x:: Int128 ) = reinterpret (RInt128, x)
88
+ RUInt128 (x:: UInt128 ) = reinterpret (RUInt128, x)
89
+
90
+ (:: Type{R} )(x:: Integer ) where R<: RInteger = R (convert (itype (R), x))
91
+ (:: Type{R} )(x:: Float16 ) where R<: RInteger = R (round (itype (R), x))
92
+ (:: Type{R} )(x:: BigFloat ) where R<: RInteger = R (round (itype (R), x))
93
+ (:: Type{R} )(x:: Rational ) where R<: RInteger = R (round (itype (R), x))
94
+ (:: Type{R} )(x:: Complex ) where R<: RInteger = R (round (itype (R), x))
95
+ (:: Type{R} )(x:: AbstractFloat ) where R<: RInteger = R (round (itype (R), x))
96
+
97
+ @inline Base. convert (:: Type{T} , x:: RInteger ) where {T<: Number } = convert (T, Integer (x))
123
98
124
99
# rem conversions
125
- @inline Base. rem {T<:RInteger} (x:: T , :: Type{T} ) = T
126
- @inline Base. rem {T<:RInteger} (x:: Integer , :: Type{T} ) = RInteger (rem (x, itype (T)))
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)))
127
102
# ambs
128
- @inline Base. rem {T<:RInteger} (x:: BigInt , :: Type{T} ) = error (" no rounding BigInt available" )
103
+ @inline Base. rem (x:: BigInt , :: Type{T} ) where {T <: RInteger } = error (" no rounding BigInt available" )
129
104
130
105
131
106
Base. flipsign (x:: RSigned , y:: RSigned ) = RInteger (flipsign (Integer (x), Integer (y)))
@@ -137,6 +112,8 @@ Base.count_ones(x::RInteger) = count_ones(Integer(x))
137
112
Base. leading_zeros (x:: RInteger ) = leading_zeros (Integer (x))
138
113
Base. trailing_zeros (x:: RInteger ) = trailing_zeros (Integer (x))
139
114
Base. ndigits0z (x:: RInteger ) = Base. ndigits0z (Integer (x))
115
+ Base. ndigits0zpb (x:: RSigned , b:: Integer ) = Base. ndigits0zpb (abs (Integer (x)), Int (b))
116
+ Base. ndigits0zpb (x:: RUnsigned , b:: Integer ) = Base. ndigits0zpb (Integer (x), Int (b))
140
117
141
118
# A few operations preserve the type
142
119
- (x:: RInteger ) = RInteger (- Integer (x))
@@ -153,23 +130,22 @@ Base.ndigits0z(x::RInteger) = Base.ndigits0z(Integer(x))
153
130
>>> (x:: RInteger , y:: Int ) = RInteger (Integer (x) >>> y)
154
131
<< (x:: RInteger , y:: Int ) = RInteger (Integer (x) << y)
155
132
156
- + {T<: RInteger }(x:: T , y:: T ) = RInteger (Integer (x) + Integer (y))
157
- - {T<: RInteger }(x:: T , y:: T ) = RInteger (Integer (x) - Integer (y))
158
- * {T<: RInteger }(x:: T , y:: T ) = RInteger (Integer (x) * Integer (y))
159
- (& ){T<: RInteger }(x:: T , y:: T ) = RInteger (Integer (x) & Integer (y))
160
- (| ){T<: RInteger }(x:: T , y:: T ) = RInteger (Integer (x) | Integer (y))
161
- # ($){T<:RInteger}(x::T, y::T) = RInteger(Integer(x) $ Integer(y))
162
- Compat. xor {T<:RInteger} (x:: T , y:: T ) = RInteger (xor (Integer (x), Integer (y)))
133
+ + (x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) + Integer (y))
134
+ - (x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) - Integer (y))
135
+ * (x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) * Integer (y))
136
+ (& )(x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) & Integer (y))
137
+ (| )(x:: T , y:: T ) where {T<: RInteger } = RInteger (Integer (x) | Integer (y))
138
+ xor (x:: T , y:: T ) where {T<: RInteger } = RInteger (xor (Integer (x), Integer (y)))
163
139
164
- Base. rem {T<:RInteger} (x:: T , y:: T ) = RInteger (rem (Integer (x), Integer (y)))
165
- Base. mod {T<:RInteger} (x:: T , y:: T ) = RInteger (mod (Integer (x), Integer (y)))
140
+ Base. rem (x:: T , y:: T ) where {T <: RInteger } = RInteger (rem (Integer (x), Integer (y)))
141
+ Base. mod (x:: T , y:: T ) where {T <: RInteger } = RInteger (mod (Integer (x), Integer (y)))
166
142
167
143
Base. unsigned (x:: RSigned ) = RInteger (unsigned (Integer (x)))
168
144
Base. signed (x:: RSigned ) = RInteger (signed (Integer (x)))
169
145
170
146
# traits
171
- Base. typemin {T<:RInteger} (:: Type{T} ) = RInteger (typemin (itype (T)))
172
- Base. typemax {T<:RInteger} (:: Type{T} ) = RInteger (typemax (itype (T)))
173
- Base. widen {T<:RInteger} (:: Type{T} ) = rtype (widen (itype (T)))
147
+ Base. typemin (:: Type{T} ) where {T <: RInteger } = RInteger (typemin (itype (T)))
148
+ Base. typemax (:: Type{T} ) where {T <: RInteger } = RInteger (typemax (itype (T)))
149
+ Base. widen (:: Type{T} ) where {T <: RInteger } = rtype (widen (itype (T)))
174
150
175
151
end # module
0 commit comments