mirror of
https://github.com/kalmarek/SmallHyperbolic
synced 2025-02-20 11:15:53 +01:00
add AcbVector
This commit is contained in:
parent
e3469b737f
commit
b95807095f
@ -20,3 +20,61 @@ using Random
|
|||||||
import Base.rand
|
import Base.rand
|
||||||
|
|
||||||
rand(rng::AbstractRNG, rs::Random.SamplerTrivial{AcbField}) = (CC = rs[]; CC(rand(Float64), rand(Float64)))
|
rand(rng::AbstractRNG, rs::Random.SamplerTrivial{AcbField}) = (CC = rs[]; CC(rand(Float64), rand(Float64)))
|
||||||
|
import Nemo.acb_struct
|
||||||
|
const libarb = Nemo.libarb
|
||||||
|
|
||||||
|
mutable struct AcbVector <: AbstractVector{acb_struct}
|
||||||
|
ptr::Ptr{acb_struct}
|
||||||
|
length::Int
|
||||||
|
|
||||||
|
function AcbVector(n::Int)
|
||||||
|
v = new(
|
||||||
|
ccall((:_acb_vec_init, libarb), Ptr{acb_struct}, (Clong,), n),
|
||||||
|
n,
|
||||||
|
)
|
||||||
|
finalizer(clear!, v)
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Base.cconvert(::Type{Ptr{acb_struct}}, acb_v::AcbVector) = acb_v.ptr
|
||||||
|
Base.size(acb_v::AcbVector) = (acb_v.length,)
|
||||||
|
|
||||||
|
function clear!(acb_v::AcbVector)
|
||||||
|
ccall(
|
||||||
|
(:_acb_vec_clear, libarb),
|
||||||
|
Cvoid,
|
||||||
|
(Ptr{acb_struct}, Clong),
|
||||||
|
acb_v,
|
||||||
|
length(acb_v),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
function (C::AcbField)(z::acb_struct)
|
||||||
|
res = zero(C)
|
||||||
|
ccall((:acb_set, libarb), Cvoid, (Ref{acb}, Ref{acb_struct}), res, z)
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
|
||||||
|
_get_ptr(acb_v::AcbVector, i::Int = 1) =
|
||||||
|
acb_v.ptr + (i - 1) * sizeof(acb_struct)
|
||||||
|
|
||||||
|
Base.@propagate_inbounds function Base.getindex(acb_v::AcbVector, i::Integer)
|
||||||
|
@boundscheck checkbounds(acb_v, i)
|
||||||
|
return unsafe_load(acb_v.ptr, i)
|
||||||
|
end
|
||||||
|
|
||||||
|
function AcbVector(v::AbstractVector{Nemo.acb})
|
||||||
|
acb_v = AcbVector(length(v))
|
||||||
|
for (i, val) in zip(eachindex(acb_v), v)
|
||||||
|
ccall(
|
||||||
|
(:acb_set, libarb),
|
||||||
|
Cvoid,
|
||||||
|
(Ptr{acb_struct}, Ref{Nemo.acb}),
|
||||||
|
_get_ptr(acb_v, i),
|
||||||
|
val,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
return acb_v
|
||||||
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user