Skip to content

Commit 13d5500

Browse files
authored
Sort RangeCumsum for AbstractUnitRange (#224)
1 parent abc31ef commit 13d5500

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ArrayLayouts"
22
uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "1.9.0"
4+
version = "1.9.1"
55

66
[deps]
77
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"

src/cumsum.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ union(a::RangeCumsum{<:Any,<:OneTo}, b::RangeCumsum{<:Any,<:OneTo}) =
6464

6565
sort!(a::RangeCumsum{<:Any,<:Base.OneTo}) = a
6666
sort(a::RangeCumsum{<:Any,<:Base.OneTo}) = a
67+
function sort(a::RangeCumsum{<:Any,<:AbstractUnitRange{<:Integer}})
68+
r = parent(a)
69+
#= A RangeCumsum with a range (-a:b) for positive (a,b) may be viewed as a concatenation
70+
of two components: (-a:a) and (a+1:b). The second is strictly increasing.
71+
We only sort the first component, and concatenate the second to the result.
72+
=#
73+
a1 = RangeCumsum(r[firstindex(r):searchsortedlast(r, -first(r))])
74+
a2 = RangeCumsum(r[searchsortedfirst(r, -first(r)+1):end])
75+
vcat(sort!(Vector(a1)), a2)
76+
end
6777
Base.issorted(a::RangeCumsum{<:Any,<:Base.OneTo}) = true
6878
function Base.issorted(a::RangeCumsum{<:Any,<:AbstractUnitRange{<:Integer}})
6979
r = parent(a)

test/test_cumsum.jl

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,6 @@ cmpop(p) = isinteger(real(first(p))) && isinteger(real(step(p))) ? (==) : (≈)
4444

4545
a,b = RangeCumsum(Base.OneTo(5)), RangeCumsum(Base.OneTo(6))
4646
@test union(a,b) union(b,a) b
47-
@test sort!(copy(a)) == a
48-
@test sort!(a) a
49-
@test sort(a) a == Vector(a)
50-
51-
r = RangeCumsum(-4:4)
52-
@test sort(r) == sort(Vector(r))
5347

5448
a = RangeCumsum(Base.OneTo(3))
5549
b = RangeCumsum(1:3)
@@ -97,6 +91,20 @@ cmpop(p) = isinteger(real(first(p))) && isinteger(real(step(p))) ? (==) : (≈)
9791
@test issorted(a)
9892
end
9993

94+
@testset "sort" begin
95+
@testset "RangeCumsum($start:$stop)" for start in -15:15, stop in start-1:20
96+
a = RangeCumsum(start:stop)
97+
v = Vector(a)
98+
@test sort(a) == sort(v)
99+
end
100+
101+
a,b = RangeCumsum(Base.OneTo(5)), RangeCumsum(Base.OneTo(6))
102+
@test union(a,b) union(b,a) b
103+
@test sort!(copy(a)) == a
104+
@test sort!(a) a
105+
@test sort(a) a == Vector(a)
106+
end
107+
100108
@testset "minimum/maximum" begin
101109
@testset "RangeCumsum($start:$stop)" for start in -15:15, stop in start:20
102110
a = RangeCumsum(start:stop)

0 commit comments

Comments
 (0)