176 |
207 |
|
for op in (:+, :-, :*, :/, :%, :&, :|, :^, :<<, :>>, :min, :max) |
177 |
208 |
|
@eval begin |
178 |
209 |
|
import Base.$(op) |
179 |
|
- |
$op(a::DataValue{T1},b::DataValue{T2}) where {T1 <: Number,T2 <: Number} = isna(a) || isna(b) ? DataValue{promote_type(T1,T2)}() : DataValue{promote_type(T1,T2)}($op(get(a), get(b))) |
180 |
|
- |
$op(x::DataValue{T1},y::T2) where {T1 <: Number,T2 <: Number} = isna(x) ? DataValue{promote_type(T1,T2)}() : DataValue{promote_type(T1,T2)}($op(get(x), y)) |
181 |
|
- |
$op(x::T1,y::DataValue{T2}) where {T1 <: Number,T2 <: Number} = isna(y) ? DataValue{promote_type(T1,T2)}() : DataValue{promote_type(T1,T2)}($op(x, get(y))) |
|
210 |
+ |
$op(a::DataValue{T1},b::DataValue{T2}) where {T1 <: Number,T2 <: Number} = isna(a) || isna(b) ? DataValue{promote_type(T1,T2)}() : DataValue{promote_type(T1,T2)}($op(unsafe_get(a), unsafe_get(b))) |
|
211 |
+ |
$op(x::DataValue{T1},y::T2) where {T1 <: Number,T2 <: Number} = isna(x) ? DataValue{promote_type(T1,T2)}() : DataValue{promote_type(T1,T2)}($op(unsafe_get(x), y)) |
|
212 |
+ |
$op(x::T1,y::DataValue{T2}) where {T1 <: Number,T2 <: Number} = isna(y) ? DataValue{promote_type(T1,T2)}() : DataValue{promote_type(T1,T2)}($op(x, unsafe_get(y))) |
182 |
213 |
|
end |
183 |
214 |
|
end |
184 |
215 |
|
|
185 |
|
- |
^(x::DataValue{T},p::Integer) where {T <: Number} = isna(x) ? DataValue{T}() : DataValue(get(x)^p) |
186 |
|
- |
(/)(x::DataValue{T}, y::DataValue{S}) where {T<:Integer,S<:Integer} = (isna(x) | isna(y)) ? DataValue{Float64}() : DataValue{Float64}(float(get(x)) / float(get(y))) |
187 |
|
- |
(/)(x::DataValue{T}, y::S) where {T<:Integer,S<:Integer} = isna(x) ? DataValue{Float64}() : DataValue{Float64}(float(get(x)) / float(y)) |
188 |
|
- |
(/)(x::T, y::DataValue{S}) where {T<:Integer,S<:Integer} = isna(y) ? DataValue{Float64}() : DataValue{Float64}(float(x) / float(get(y))) |
|
216 |
+ |
^(x::DataValue{T},p::Integer) where {T <: Number} = isna(x) ? DataValue{T}() : DataValue(unsafe_get(x)^p) |
|
217 |
+ |
(/)(x::DataValue{T}, y::DataValue{S}) where {T<:Integer,S<:Integer} = (isna(x) | isna(y)) ? DataValue{Float64}() : DataValue{Float64}(float(unsafe_get(x)) / float(unsafe_get(y))) |
|
218 |
+ |
(/)(x::DataValue{T}, y::S) where {T<:Integer,S<:Integer} = isna(x) ? DataValue{Float64}() : DataValue{Float64}(float(unsafe_get(x)) / float(y)) |
|
219 |
+ |
(/)(x::T, y::DataValue{S}) where {T<:Integer,S<:Integer} = isna(y) ? DataValue{Float64}() : DataValue{Float64}(float(x) / float(unsafe_get(y))) |
189 |
220 |
|
|
190 |
|
- |
==(a::DataValue{T1},b::DataValue{T2}) where {T1,T2} = isna(a) && isna(b) ? true : !isna(a) && !isna(b) ? get(a)==get(b) : false |
191 |
|
- |
==(a::DataValue{T1},b::T2) where {T1,T2} = isna(a) ? false : get(a)==b |
192 |
|
- |
==(a::T1,b::DataValue{T2}) where {T1,T2} = isna(b) ? false : a==get(b) |
|
221 |
+ |
==(a::DataValue{T1},b::DataValue{T2}) where {T1,T2} = isna(a) && isna(b) ? true : !isna(a) && !isna(b) ? unsafe_get(a)==unsafe_get(b) : false |
|
222 |
+ |
==(a::DataValue{T1},b::T2) where {T1,T2} = isna(a) ? false : unsafe_get(a)==b |
|
223 |
+ |
==(a::T1,b::DataValue{T2}) where {T1,T2} = isna(b) ? false : a==unsafe_get(b) |
193 |
224 |
|
|
194 |
|
- |
!=(a::DataValue{T1},b::DataValue{T2}) where {T1,T2} = isna(a) && isna(b) ? false : !isna(a) && !isna(b) ? get(a)!=get(b) : true |
195 |
|
- |
!=(a::DataValue{T1},b::T2) where {T1,T2} = isna(a) ? true : get(a)!=b |
196 |
|
- |
!=(a::T1,b::DataValue{T2}) where {T1,T2} = isna(b) ? true : a!=get(b) |
|
225 |
+ |
!=(a::DataValue{T1},b::DataValue{T2}) where {T1,T2} = isna(a) && isna(b) ? false : !isna(a) && !isna(b) ? unsafe_get(a)!=unsafe_get(b) : true |
|
226 |
+ |
!=(a::DataValue{T1},b::T2) where {T1,T2} = isna(a) ? true : unsafe_get(a)!=b |
|
227 |
+ |
!=(a::T1,b::DataValue{T2}) where {T1,T2} = isna(b) ? true : a!=unsafe_get(b) |
197 |
228 |
|
|
198 |
229 |
|
for op in (:<,:>,:<=,:>=) |
199 |
230 |
|
@eval begin |
200 |
231 |
|
import Base.$(op) |
201 |
|
- |
$op(a::DataValue{T},b::DataValue{T}) where {T <: Number} = isna(a) || isna(b) ? false : $op(get(a), get(b)) |
202 |
|
- |
$op(x::DataValue{T1},y::T2) where {T1 <: Number,T2 <: Number} = isna(x) ? false : $op(get(x), y) |
203 |
|
- |
$op(x::T1,y::DataValue{T2}) where {T1 <: Number,T2 <: Number} = isna(y) ? false : $op(x, get(y)) |
|
232 |
+ |
$op(a::DataValue{T},b::DataValue{T}) where {T <: Number} = isna(a) || isna(b) ? false : $op(unsafe_get(a), unsafe_get(b)) |
|
233 |
+ |
$op(x::DataValue{T1},y::T2) where {T1 <: Number,T2 <: Number} = isna(x) ? false : $op(unsafe_get(x), y) |
|
234 |
+ |
$op(x::T1,y::DataValue{T2}) where {T1 <: Number,T2 <: Number} = isna(y) ? false : $op(x, unsafe_get(y)) |
204 |
235 |
|
end |
205 |
236 |
|
end |
206 |
237 |
|
|
207 |
238 |
|
# C# spec 7.11.4 |
208 |
239 |
|
function (&)(x::DataValue{Bool},y::DataValue{Bool}) |
209 |
240 |
|
if isna(x) |
210 |
|
- |
if isna(y) || get(y)==true |
|
241 |
+ |
if isna(y) || unsafe_get(y)==true |
211 |
242 |
|
return DataValue{Bool}() |
212 |
243 |
|
else |
213 |
244 |
|
return DataValue(false) |
214 |
245 |
|
end |
215 |
|
- |
elseif get(x)==true |
|
246 |
+ |
elseif unsafe_get(x)==true |
216 |
247 |
|
return y |
217 |
248 |
|
else |
218 |
249 |
|
return DataValue(false) |