From b95807095f8f213e381f5e1951435a3944abd90d Mon Sep 17 00:00:00 2001 From: kalmarek Date: Fri, 15 May 2020 01:14:20 +0200 Subject: [PATCH] add AcbVector --- src/nemo_utils.jl | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/nemo_utils.jl b/src/nemo_utils.jl index 37cffa2..1ab9d20 100644 --- a/src/nemo_utils.jl +++ b/src/nemo_utils.jl @@ -20,3 +20,61 @@ using Random import Base.rand 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 +