302
302
Base. length (a:: UnsafeView ) = a. len
303
303
Base. getindex (a:: UnsafeView , i:: Int ) = unsafe_load (a. ptr, i)
304
304
Base. setindex! (a:: UnsafeView , x, i:: Int ) = unsafe_store! (a. ptr, x, i)
305
+ Base. pointer (a:: UnsafeView ) = a. ptr
306
+ Base. size (a:: UnsafeView ) = (a. len,)
305
307
306
308
# this is essentially equivalent to rand!(r, ::AbstractArray{Float64}, I) above, but due to
307
309
# optimizations which can't be done currently when working with pointers, we have to re-order
424
426
425
427
# ### arrays of integers
426
428
427
- function _rand ! (r:: MersenneTwister , A:: UnsafeView{UInt128} )
429
+ function rand ! (r:: MersenneTwister , A:: UnsafeView{UInt128} , :: SamplerType {UInt128} )
428
430
n:: Int = length (A)
429
431
i = n
430
432
while true
@@ -450,10 +452,15 @@ function _rand!(r::MersenneTwister, A::UnsafeView{UInt128})
450
452
end
451
453
452
454
for T in BitInteger_types
453
- @eval function rand! (r:: MersenneTwister , A:: Array{$T} , :: SamplerType{$T} )
455
+ @eval rand! (r:: MersenneTwister , A:: Array{$T} , sp:: SamplerType{$T} ) =
456
+ (@gc_preserve A rand! (r, UnsafeView (pointer (A), length (A)), sp); A)
457
+
458
+ T == UInt128 && continue
459
+
460
+ @eval function rand! (r:: MersenneTwister , A:: UnsafeView{$T} , :: SamplerType{$T} )
454
461
n = length (A)
455
462
n128 = n * sizeof ($ T) ÷ 16
456
- @gc_preserve A _rand ! (r, UnsafeView {UInt128} (pointer (A), n128))
463
+ rand ! (r, UnsafeView {UInt128} (pointer (A), n128))
457
464
for i = 16 * n128÷ sizeof ($ T)+ 1 : n
458
465
@inbounds A[i] = rand (r, $ T)
459
466
end
0 commit comments