Skip to content

Commit f7eb99a

Browse files
authored
Bug in copy of hcat with negative steps (#378)
* Bug in copy of hcat with negative steps * reverse arguments in hcat if step is negative * fix ordering * Update lazyconcat.jl
1 parent 9dde192 commit f7eb99a

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "LazyArrays"
22
uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02"
3-
version = "2.6.2"
3+
version = "2.6.3"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/lazyconcat.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,7 @@ _view_vcat(a::Number, kr) = Fill(a,length(kr))
800800
_view_vcat(a::Number, kr, jr) = Fill(a,length(kr), length(jr))
801801
_view_vcat(a, kr...) = _viewifmutable(a, kr...)
802802

803+
_reverse_if_neg_step(args, kr::Int) = args
803804
_reverse_if_neg_step(args, kr::AbstractUnitRange) = args
804805
_reverse_if_neg_step(args, kr::AbstractRange) = step(kr) 0 ? args : reverse(args)
805806

@@ -825,7 +826,7 @@ function _vcat_sub_arguments(L::ApplyLayout{typeof(hcat)}, A, V)
825826
args = arguments(L, A)
826827
k,jr = parentindices(V)
827828
sz = size.(args,2)
828-
sjr = intersect.(_argsindices(sz), Ref(jr))
829+
sjr = intersect.(Ref(jr), _argsindices(sz))
829830
sjr2 = broadcast((a,b) -> a .- b .+ 1, sjr, _vcat_firstinds(sz))
830831
_view_hcat.(_reverse_if_neg_step(args, jr), k, sjr2)
831832
end
@@ -841,9 +842,9 @@ function arguments(L::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,2})
841842
args = arguments(L, A)
842843
kr,jr = parentindices(V)
843844
sz = size.(args,1)
844-
skr = intersect.(_argsindices(sz), Ref(kr))
845+
skr = intersect.(Ref(kr), _argsindices(sz))
845846
skr2 = broadcast((a,b) -> a .- b .+ 1, skr, _vcat_firstinds(sz))
846-
_view_vcat.(_reverse_if_neg_step(args, kr), skr2, Ref(jr))
847+
_view_vcat.(_reverse_if_neg_step(args, kr), _reverse_if_neg_step(skr2, kr), Ref(jr))
847848
end
848849

849850
@inline _view_hcat(a::Number, kr, jr) = Fill(a,length(kr),length(jr))
@@ -864,7 +865,7 @@ function arguments(L::ApplyLayout{typeof(hcat)}, V::SubArray)
864865
sz = size.(args,2)
865866
sjr = intersect.(_argsindices(sz), Ref(jr))
866867
sjr2 = broadcast((a,b) -> a .- b .+ 1, sjr, _vcat_firstinds(sz))
867-
__view_hcat(args, kr, sjr2)
868+
__view_hcat(_reverse_if_neg_step(args, jr), kr, _reverse_if_neg_step(sjr2, jr))
868869
end
869870

870871
arguments(::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,2,<:Any,<:Tuple{<:Slice,<:Any}}) =
@@ -886,11 +887,11 @@ end
886887

887888
sub_materialize(::ApplyLayout{typeof(vcat)}, V::AbstractVector, _) = ApplyVector(V)
888889

889-
function sub_materialize(::ApplyLayout{typeof(hcat)}, V, _)
890+
function sub_materialize(lay::ApplyLayout{typeof(hcat)}, V, _)
890891
ret = similar(V)
891892
n = 0
892893
kr,_ = parentindices(V)
893-
for a in arguments(V)
894+
for a in arguments(lay, V)
894895
m = size(a,2)
895896
copyto!(view(ret,:,n+1:n+m), a)
896897
n += m

test/concattests.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,15 @@ import LazyArrays: MemoryLayout, DenseColumnMajor, materialize!, call, paddeddat
662662
A = @inferred(Vcat(1:10, 1:20))
663663
@test resizedata!(A, 3) A
664664
end
665+
666+
@testset "copy hcat bug (#378)" begin
667+
V = ApplyArray(vcat, 1, Fill(2,10,1))
668+
H = ApplyArray(hcat, 1, Fill(2,1,10))
669+
@test copy(view(V,1:-1:1,1:-1:1)) == [1 ;;]
670+
@test copy(view(H,1:-1:1,1:-1:1)) == [1 ;;]
671+
@test copy(view(V,2:-1:1,1:-1:1)) == [2 ; 1 ;;]
672+
@test copy(view(H,1:-1:1,2:-1:1)) == [2 1]
673+
end
665674
end
666675

667676
end # module

0 commit comments

Comments
 (0)