302302Base. length (a:: UnsafeView ) = a. len
303303Base. getindex (a:: UnsafeView , i:: Int ) = unsafe_load (a. ptr, i)
304304Base. 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,)
305307
306308# this is essentially equivalent to rand!(r, ::AbstractArray{Float64}, I) above, but due to
307309# optimizations which can't be done currently when working with pointers, we have to re-order
424426
425427# ### arrays of integers
426428
427- function _rand ! (r:: MersenneTwister , A:: UnsafeView{UInt128} )
429+ function rand ! (r:: MersenneTwister , A:: UnsafeView{UInt128} , :: SamplerType {UInt128} )
428430 n:: Int = length (A)
429431 i = n
430432 while true
@@ -450,10 +452,15 @@ function _rand!(r::MersenneTwister, A::UnsafeView{UInt128})
450452end
451453
452454for 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} )
454461 n = length (A)
455462 n128 = n * sizeof ($ T) ÷ 16
456- @gc_preserve A _rand ! (r, UnsafeView {UInt128} (pointer (A), n128))
463+ rand ! (r, UnsafeView {UInt128} (pointer (A), n128))
457464 for i = 16 * n128÷ sizeof ($ T)+ 1 : n
458465 @inbounds A[i] = rand (r, $ T)
459466 end
0 commit comments