Skip to content

Commit 2bd3342

Browse files
authored
Implement Base.unsafe_wrap for OffsetArrays (pull request) (#290)
1 parent 6b431ca commit 2bd3342

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

src/OffsetArrays.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,37 @@ function Base.replace_in_print_matrix(A::OffsetArray{<:Any,1}, i::Integer, j::In
623623
Base.replace_in_print_matrix(parent(A), ip, j, s)
624624
end
625625

626+
# Actual unsafe_wrap implementation
627+
@inline function _unsafe_wrap(pointer::Ptr{T}, inds::NTuple{N}; own = false, kw...) where {T,N}
628+
_checkindices(N, inds, "indices")
629+
AA = Base.unsafe_wrap(Array, pointer, map(_indexlength, inds); own=own)
630+
OffsetArray{T, N, typeof(AA)}(AA, map(_indexoffset, inds); kw...)
631+
end
632+
const OffsetArrayUnion{T,N} = Union{Type{OffsetArray}, Type{OffsetArray{T}}, Type{OffsetArray{T,N}}, Type{OffsetArray{T1, N} where T1}} where {T,N}
633+
634+
"""
635+
Base.unsafe_wrap(OffsetArray, pointer::Ptr{T}, inds...; own=false, kw...)
636+
Base.unsafe_wrap(OffsetArray, pointer::Ptr{T}, inds::Tuple; own=false, kw...)
637+
638+
Construct an `OffsetArray` around a pointer with axes defined by `inds` which may be Integers or AbstractUnitRanges.
639+
If the keyword `own` is true, then Julia will free the pointer when the array is garbage collected.
640+
Other keywords are forwarded to the `OffsetArray` constructor.
641+
"""
642+
@inline function Base.unsafe_wrap(::OffsetArrayUnion{T,N}, pointer::Ptr{T}, inds::NTuple{N, OffsetAxisKnownLength}; kw...) where {T,N}
643+
_unsafe_wrap(pointer, inds; kw...)
644+
end
645+
# Avoid ambiguity
646+
@inline function Base.unsafe_wrap(::OffsetArrayUnion{T,N}, pointer::Ptr{T}, inds::NTuple{N, <:Integer}; kw...) where {T,N}
647+
_unsafe_wrap(pointer, inds; kw...)
648+
end
649+
@inline function Base.unsafe_wrap(::OffsetArrayUnion{T,N}, pointer::Ptr{T}, inds::Vararg{OffsetAxisKnownLength,N}; kw...) where {T,N}
650+
_unsafe_wrap(pointer, inds; kw...)
651+
end
652+
# Avoid ambiguity
653+
@inline function Base.unsafe_wrap(::OffsetArrayUnion{T,N}, pointer::Ptr{T}, inds::Vararg{<:Integer,N}; kw...) where {T,N}
654+
_unsafe_wrap(pointer, inds; kw...)
655+
end
656+
626657
"""
627658
no_offset_view(A)
628659

test/runtests.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2683,3 +2683,19 @@ end
26832683
A = reshape(collect(1:9), 3, 3)
26842684
@test OffsetArrays.centered(A, RoundDown) == OffsetArrays.centered(A, RoundUp)
26852685
end
2686+
@testset "unsafe_wrap" begin
2687+
p = Ptr{UInt16}(Libc.malloc(2*3*4*2))
2688+
@test unsafe_wrap(OffsetArray, p, 2, 3, 4) isa OffsetArray{UInt16, 3}
2689+
@test unsafe_wrap(OffsetArray, p, (2, 3, 4)) isa OffsetArray{UInt16, 3}
2690+
@test unsafe_wrap(OffsetVector, p, 2*3*4) isa OffsetVector{UInt16}
2691+
@test unsafe_wrap(OffsetMatrix, p, 2*3, 4) isa OffsetMatrix{UInt16}
2692+
@test unsafe_wrap(OffsetArray{UInt16}, p, 2, 3, 4) isa OffsetArray{UInt16, 3}
2693+
@test unsafe_wrap(OffsetArray{UInt16}, p, (2, 3, 4)) isa OffsetArray{UInt16, 3}
2694+
@test unsafe_wrap(OffsetVector{UInt16}, p, 2*3*4) isa OffsetVector{UInt16}
2695+
@test unsafe_wrap(OffsetMatrix{UInt16}, p, 2*3, 4) isa OffsetMatrix{UInt16}
2696+
p = Ptr{UInt8}(p)
2697+
@test unsafe_wrap(OffsetArray, p, 2:3, 3:5, 4:7) isa OffsetArray{UInt8, 3}
2698+
@test unsafe_wrap(OffsetArray, p, (2:3, 3:5, 4:7)) isa OffsetArray{UInt8, 3}
2699+
@test unsafe_wrap(OffsetVector, p, 1:(2*3*4) .- 1) isa OffsetVector{UInt8}
2700+
@test unsafe_wrap(OffsetMatrix, p, 1:(2*3) .+ 6, 4:7; own = true) isa OffsetMatrix{UInt8}
2701+
end

0 commit comments

Comments
 (0)