Skip to content

Commit

Permalink
Revert "Add _unsetindex! methods for SubArrays and `CartesianInde…
Browse files Browse the repository at this point in the history
…x`es (#53383)"

This reverts commit 1a90409.
  • Loading branch information
KristofferC authored and KristofferC committed May 13, 2024
1 parent ff7e7b8 commit f8a7496
Show file tree
Hide file tree
Showing 6 changed files with 2 additions and 120 deletions.
15 changes: 1 addition & 14 deletions base/abstractarray.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1474,20 +1474,7 @@ function _setindex!(::IndexCartesian, A::AbstractArray, v, I::Vararg{Int,M}) whe
r
end

function _unsetindex!(A::AbstractArray, i::Integer...)
@_propagate_inbounds_meta
_unsetindex!(A, map(to_index, i)...)
end

function _unsetindex!(A::AbstractArray{T}, i::Int...) where T
# this provides a fallback method which is a no-op if the element is already unassigned
# such that copying into an uninitialized object generally always will work,
# even if the specific custom array type has not implemented `_unsetindex!`
@inline
@boundscheck checkbounds(A, i...)
allocatedinline(T) || @inbounds(!isassigned(A, i...)) || throw(MethodError(_unsetindex!, (A, i...)))
return A
end
_unsetindex!(A::AbstractArray, i::Integer) = _unsetindex!(A, to_index(i))

"""
parent(A)
Expand Down
7 changes: 1 addition & 6 deletions base/array.jl
Original file line number Diff line number Diff line change
Expand Up @@ -219,12 +219,7 @@ function _unsetindex!(A::Array, i::Int)
@inbounds _unsetindex!(GenericMemoryRef(A.ref, i))
return A
end
function _unsetindex!(A::Array, i::Int...)
@inline
@boundscheck checkbounds(A, i...)
@inbounds _unsetindex!(A, _to_linear_index(A, i...))
return A
end


# TODO: deprecate this (aligned_sizeof and/or elsize and/or sizeof(Some{T}) are more correct)
elsize(::Type{A}) where {T,A<:Array{T}} = aligned_sizeof(T)
Expand Down
6 changes: 0 additions & 6 deletions base/multidimensional.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1612,12 +1612,6 @@ end
end
end

# _unsetindex
@propagate_inbounds function Base._unsetindex!(A::AbstractArray, i::CartesianIndex)
Base._unsetindex!(A, to_indices(A, (i,))...)
return A
end

## permutedims

## Permute array dims ##
Expand Down
19 changes: 0 additions & 19 deletions base/subarray.jl
Original file line number Diff line number Diff line change
Expand Up @@ -409,25 +409,6 @@ function isassigned(V::FastSubArray{<:Any, 1}, i::Int)
r
end

function _unsetindex!(V::FastSubArray, i::Int)
@inline
@boundscheck checkbounds(V, i)
@inbounds _unsetindex!(V.parent, _reindexlinear(V, i))
return V
end
function _unsetindex!(V::FastSubArray{<:Any,1}, i::Int)
@inline
@boundscheck checkbounds(V, i)
@inbounds _unsetindex!(V.parent, _reindexlinear(V, i))
return V
end
function _unsetindex!(V::SubArray{T,N}, i::Vararg{Int,N}) where {T,N}
@inline
@boundscheck checkbounds(V, i...)
@inbounds _unsetindex!(V.parent, reindex(V.indices, i)...)
return V
end

IndexStyle(::Type{<:FastSubArray}) = IndexLinear()

# Strides are the distance in memory between adjacent elements in a given dimension
Expand Down
31 changes: 0 additions & 31 deletions test/abstractarray.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2040,37 +2040,6 @@ end
end
end

@testset "_unsetindex!" begin
struct MyMatrixUnsetIndexCartInds{T,A<:AbstractMatrix{T}} <: AbstractMatrix{T}
data :: A
end
Base.size(A::MyMatrixUnsetIndexCartInds) = size(A.data)
Base.getindex(M::MyMatrixUnsetIndexCartInds, i::Int, j::Int) = M.data[i,j]
Base.setindex!(M::MyMatrixUnsetIndexCartInds, v, i::Int, j::Int) = setindex!(M.data, v, i, j)
struct MyMatrixUnsetIndexLinInds{T,A<:AbstractMatrix{T}} <: AbstractMatrix{T}
data :: A
end
Base.size(A::MyMatrixUnsetIndexLinInds) = size(A.data)
Base.getindex(M::MyMatrixUnsetIndexLinInds, i::Int) = M.data[i]
Base.setindex!(M::MyMatrixUnsetIndexLinInds, v, i::Int) = setindex!(M.data, v, i)
Base.IndexStyle(::Type{<:MyMatrixUnsetIndexLinInds}) = IndexLinear()

function test_unsetindex(MT)
M = MT(ones(2,2))
M2 = MT(Matrix{BigFloat}(undef, 2,2))
copyto!(M, M2)
@test all(==(1), M)
M3 = MT(Matrix{BigFloat}(undef, 2,2))
for i in eachindex(M3)
@test !isassigned(M3, i)
end
M3 .= 1
@test_throws MethodError copyto!(M3, M2)
end
test_unsetindex(MyMatrixUnsetIndexCartInds)
test_unsetindex(MyMatrixUnsetIndexLinInds)
end

@testset "reshape for offset arrays" begin
p = Base.IdentityUnitRange(3:4)
r = reshape(p, :, 1)
Expand Down
44 changes: 0 additions & 44 deletions test/subarray.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1075,50 +1075,6 @@ end
@test !isassigned(v, 1, 2) # inbounds but not assigned
@test !isassigned(v, 3, 3) # out-of-bounds
end

@testset "_unsetindex!" begin
function test_unsetindex(A, B)
copyto!(A, B)
for i in eachindex(A)
@test !isassigned(A, i)
end
inds = eachindex(A)
@test_throws BoundsError Base._unsetindex!(A, last(inds) + oneunit(eltype(inds)))
end
@testset "dest IndexLinear, src IndexLinear" begin
for p in (fill(BigInt(2)), BigInt[1, 2], BigInt[1 2; 3 4])
A = view(copy(p), ntuple(_->:, ndims(p))...)
B = view(similar(A), ntuple(_->:, ndims(p))...)
test_unsetindex(A, B)
test_unsetindex(p, B)
end
end

@testset "dest IndexLinear, src IndexCartesian" begin
for p in (fill(BigInt(2)), BigInt[1, 2], BigInt[1 2; 3 4])
A = view(copy(p), ntuple(_->:, ndims(p))...)
B = view(similar(A), axes(A)...)
test_unsetindex(A, B)
test_unsetindex(p, B)
end
end

@testset "dest IndexCartesian, src IndexLinear" begin
for p in (fill(BigInt(2)), BigInt[1, 2], BigInt[1 2; 3 4])
A = view(p, axes(p)...)
B = similar(A)
test_unsetindex(A, B)
end
end

@testset "dest IndexCartesian, src IndexCartesian" begin
for p in (fill(BigInt(2)), BigInt[1, 2], BigInt[1 2; 3 4])
A = view(p, axes(p)...)
B = view(similar(A), axes(A)...)
test_unsetindex(A, B)
end
end
end
end

@testset "aliasing check with reshaped subarrays" begin
Expand Down

0 comments on commit f8a7496

Please sign in to comment.