diff --git a/Project.toml b/Project.toml index 77bf4792b..40acad5e7 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "StatsBase" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" authors = ["JuliaStats"] -version = "0.33.21" +version = "0.33.22" [deps] DataAPI = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" diff --git a/src/misc.jl b/src/misc.jl index cd661c4ee..4f9710ba1 100644 --- a/src/misc.jl +++ b/src/misc.jl @@ -60,11 +60,14 @@ run lengths. function inverse_rle(vals::AbstractVector{T}, lens::AbstractVector{<:Integer}) where T m = length(vals) length(lens) == m || raise_dimerror() + n = sum(lens) + n >= 0 || throw(ArgumentError("lengths must be non-negative")) - r = Vector{T}(undef, sum(lens)) + r = Vector{T}(undef, n) p = 0 @inbounds for i = 1 : m j = lens[i] + j >= 0 || throw(ArgumentError("lengths must be non-negative")) v = vals[i] while j > 0 r[p+=1] = v diff --git a/test/misc.jl b/test/misc.jl index 63fc24df9..3054eb83c 100644 --- a/test/misc.jl +++ b/test/misc.jl @@ -8,6 +8,7 @@ z = [1, 1, 2, 2, 2, 3, 1, 2, 2, 3, 3, 3, 3] @test vals == [1, 2, 3, 1, 2, 3] @test lens == [2, 3, 1, 1, 2, 4] @test inverse_rle(vals, lens) == z +@test_throws ArgumentError inverse_rle(vals, fill(-1, length(lens))) z = [true, true, false, false, true, false, true, true, true] vals, lens = rle(z)